// aimsCommon.js
/*
*  JavaScript template file for ArcIMS HTML Viewer
*       dependent on aimsXML.js, ArcIMSparam.js, aimsMap.js
*/             

var aimsCommonPresent=true;

var queryTool = 0;
var legendImage="";
var modeBlurb = "Zoom In";
var chkUnits=false;
var legendTemp = false;
var ovIsVisible=false;
var showBuffer = false;
var theImagePath = "";
var theImageURLPath = "";
var theServiceName = "";
var theVersion = navigator.appVersion;
var theVersNum = parseFloat(theVersion);
var theBrowser = navigator.appName;
var noOverlay = true;  //must be true for now

// when there is a mapservice to load, it proceeds from here
function startUp() {
  if (imsURL != "") {
    iWidth = document.theImage.width;
    iHeight = document.theImage.height;
    if (imsURL!=imsOVURL) toggleOVVisible = false;
    getStartExtent();      
  }
}

// get the starting extent
function getStartExtent() {
  if (parent.PostFrame.document.forms[0]!=null) {
    var theString = '<?xml version="1.0" encoding="UTF-8"?><ARCXML VERSION="1.1">\n<REQUEST>\n<GET_SERVICE_INFO renderer="false" extensions="false" fields="false" />\n';
    theString = theString + '</REQUEST>\n</ARCXML>';
    var theReply="";
    if (getLimitExtent) {
      if (hasOVMap) {
        sendToServer(imsOVURL,theString,3);
      } else {
        sendToServer(imsURL,theString,3);
      }
    } else {
      XMLMode=3;
      processXML("No request for Limit Extent")
    }
  } else {
    alert("Unable to start. Required HTML Form missing (jsForm.htm).");
  }
}

// process the start extent and set up layers
function processStartExtent(theReply) {
    if (getStartingExtent) {
        getXYs(theReply);
        startLeft=left;
        startRight=right;
        startTop=top;
        startBottom=bottom;
    } else {
        left=startLeft;
        right=startRight;
        top=startTop;
        bottom=startBottom;
        xDistance = Math.abs(right-left);
        var sFactor = xDistance / iWidth
        mapScaleFactor = sFactor;
    }

    if (aimsLayersPresent) getLayers(theReply);
     xDistance = Math.abs(right-left);
     yDistance = Math.abs(top-bottom);
     xHalf = xDistance/2;
     yHalf = yDistance/2;
     panX = xDistance * panFactor;
     panY = yDistance * panFactor;
     if (chkUnits) {
         if (MapUnits=="DEGREES") {
            if ((right > 250) || (top > 150)) MapUnits="FEET";
         } 
         chkUnits=false;
     }
     mouseX = 0;
     mouseY = 0;
     pixelX = xDistance/iWidth;
     pixelY = yDistance/iHeight;
     mapX = left;
     mayY = top;
     lastLeft = left;
     lastRight = right;
     lastTop = top;
     lastBottom = bottom;
     if (hasOVMap == false) {
         fullLeft = limitLeft;
         fullRight = limitRight;
         fullTop = limitTop;
         fullBottom = limitBottom;
         fullWidth = Math.abs(fullRight - fullLeft);
         fullHeight = Math.abs(fullTop - fullBottom);
     
     }
    if (aimsGeocodePresent) {
        if (GCLayerCount==0) {
            if ((useGeocode) || (useReverseGeocode)) {
                useGeocode=false;
                useReverseGeocode=false;
            }
        }
    } else {
            useGeocode=false;
            useReverseGeocode=false;    
    }
    if (parent.ToolFrame!=null) {
        parent.ToolFrame.document.location= appDir + "toolbar.htm";
    } else if (hasToolBarOnLayer) {
        // requires custom function getLayerListContent. . . example in layerlist.js in Hyperlink sample
        var content = getLayerListContent();
        if (isNav) {
            replaceLayerContent("theToolBar",content);
        } else {
            content = swapStuff(content,"\\'",sQuote);
            document.all.theToolBar.innerHTML = content;
        }
        
    }
    hideRetrieveData();
    if ((ovIsVisible) && (aimsDHTMLPresent)) {
        ovIsVisible = false;
        toggleOVMap();
    }
    if (enforceFullExtent) {
        writeBlankMapXML();
    } else {
        sendMapXML();
    }
    parent.TextFrame.document.location= appDir + "tabs4.htm";
}

// request a list of available Image MapServices
function startMap() {
  showRetrieveData();
  if (aimsGenericPresent) {
    var theText = "<GETCLIENTSERVICES/>";
    sendToServer(catURL,theText,5);       
  } else {
    startUp();
  }
}

// get the Map Image width
function getMapWidth () {
  var mapFrameWidth = thePageWin.innerWidth;
  if (mapFrameWidth == null) {
    mapFrameWidth = thePageDoc.body.clientWidth;
  }
  return mapFrameWidth;
}

 //get the Map Image height
function getMapHeight () {
  var mapFrameHeight = thePageWin.innerHeight;
  if (mapFrameHeight == null) {
    mapFrameHeight = thePageDoc.body.clientHeight;
  }
  return mapFrameHeight;
}

function checkCurrentExtent() {
  var msg = "Current Extent:\nLeft: " + left + "\nBottom: " + bottom + "\nRight: " + right + "\nTop: " + top;
  var ratio1 = xDistance/fullWidth;
  msg += "\n\nRatio to Full Extent: " + ratio1;
  alert(msg);
}

// swap out double quotes for single
function swapQuotes2(inText) {
  var doubleQuote = dQuote;
  var singleQuote = "'";
  var preTemp = "";
  var posTemp = "";
  var nextPos = 0;
  var ePos = inText.length;
  var pos=9;
  while (pos != -1) {
    pos = inText.indexOf(dQuote);
    if (pos!=-1) {
      nextPos=pos+1;
      preTemp = inText.substring(0,pos);
      posTemp = inText.substring(nextPos,ePos);
      inText = preTemp + sQuote + posTemp;
    }
  }
  return inText;
}

function swapQuotes(inText) {
  inText = inText.replace(/"/g, "'");
  return inText;
}

// convert hexidecimal rgb number to delimited decimal rgb
function convertHexToDec(hexColor) {
  var pos = hexColor.indexOf(",");
  var decString = hexColor;
  if (pos==-1) {
    pos = hexColor.indexOf("#");
    if (pos!=-1) {
      hexColor = hexColor.substring((pos + 1),(pos + 7));
    }
    var redHex = hexColor.substring(0,2);
    var greenHex = hexColor.substring(2,4);
    var blueHex = hexColor.substring(4,6);
    decString = parseInt(redHex,16) + "," + parseInt(greenHex,16) + "," + parseInt(blueHex,16);        
  } 
  return decString;    
}

// swap out one interior string with another
function swapStuff(oldString,oldStuff,newStuff) {
  var pos = 0;
  var rpos = 0;
  var epos = 0;
  var leftString = "";
  var rightString = "";
  pos = oldString.indexOf(oldStuff);          
  while (pos!=-1) {
    epos = oldString.length;
    rpos = pos + oldStuff.length;
    leftString = oldString.substring(0,pos);
    rightString = oldString.substring(rpos,epos);
    oldString = leftString + newStuff + rightString;
    pos = oldString.indexOf(oldStuff);
  }
  leftString=null;
  rightString=null;
  return oldString;
}

// disables error checking
function clearError() {
}

// reset error checking to default
function resetError() {
  return false;
}

function reloadApp() {
  if (isNav) {
    document.location = "default.htm";
  }
}   

// clear out leading spaces in field value list
function clearLeadingSpace(inText) {
  var pos=9;
  while (pos != -1) {
    pos = inText.indexOf('=" ');
    if (pos!=-1) {
      var lastpos = inText.length;
      var midend = pos + 2;
      var midstart = pos + 3;
      var leftSide = inText.substring(0,midend);
      var rightSide = inText.substring(midstart,lastpos);
      inText = leftSide + rightSide;
    }
  }
  return inText;
}

// replace < and > in string with « and » to allow display in html page
function untag(inputString) {
  var outString = inputString.replace(/</g,"«");
  outString = outString.replace(/>/g, "»");
  return outString;
}

// replace single quotes with double single quotes
//  set up interior single qoutes and apostrophes for queries
function fixSingleQuotes(inputString) {
  var outString = inputString.replace(/'/g, "''");
  return outString;
}

// parse out record data from XML stream
function parseRecordString(theReply, startpos) {
  var inData = "";
  var pos = theReply.indexOf("<FIELDS ",startpos);
  if (pos!=-1) {
    startpos = pos + 8;
    xmlEndPos = theReply.indexOf('" />',startpos);
    inData = theReply.substring(startpos,xmlEndPos);
  }
  return inData;
}

// get a list of field names from the returned record
function getFieldNames(recordString) {
  var theStuff = new String(recordString);                
  var theList = theStuff.split('" ');
  var fName1 = new Array();
  for (var f=0;f<theList.length;f++) {
    var v = theList[f].split('="');
    fName1[f] = v[0];
  }
  return fName1;
}

// get a list field values from the returned record
function getFieldValues(recordString) {
  var theStuff = new String(recordString);                
  var theList = theStuff.split('" ');
  var fValue1 = new Array();
  for (var f=0;f<theList.length;f++) {
    var v = theList[f].split('="');
    if ((v[1]=="") || (v[1]==null)) v[1] = "&nbsp;";
    if (v[0]==LayerShapeField[ActiveLayerIndex]) v[1]="[" + ActiveLayerType + "]";
    fValue1[f] = v[1];
  }
  return fValue1;
  }

// just get the field value from the lists of fieldnames and fieldvalues
function getIdValue(fieldNameArray, fieldValueArray) {
  var theValue = 0;
  for (var f=0;f<fieldNameArray.length;f++) {
    if (fieldNameArray[f]==LayerIDField[ActiveLayerIndex]) {
      theValue = fieldValueArray[f];
    } 
  }
  return theValue;
}

// just get the interior string from the theReply between preString and postString
//      starting from startpos
function justGetValue(theReply,preString,postString,startpos) {
  var theValue = "";
  var pos = theReply.indexOf(preString,startpos);
  if (pos!=-1) {
    pos = pos + preString.length;
    var endpos = theReply.indexOf(postString,(pos));
    if (endpos!=-1) {
      theValue = theReply.substring(pos,endpos);
      xmlEndPos = endpos;
    }
  }
  return theValue;    
}

// get one field value from theReply starting from startpos
function justGetFieldValue(theReply,theField,startpos) {
  var preString = theField + '="';
  var returnString = justGetValue(theReply, preString, dQuote, startpos);
  return returnString;
}

// get the number of features returned in xml response
function justGetFeatureCount(theReply) {
  var theCount = 0;
  var pos = theReply.indexOf("<FEATURECOUNT");
  if (pos!=-1) {
    var theValue = justGetValue(theReply,'count="',dQuote,pos);
    theCount = parseInt(theValue);  
  }
  return theCount;
}

// get all the field values and return a list
function getAllFieldValues(theReply,theField,recCount) {
  var vList = new Array();
  xmlEndPos = 0;
  for (var i=0;i<recCount;i++) {
    vList[i] = parseFloat(justGetFieldValue(theReply,theField,xmlEndPos));
  }
  return vList;
}

// reset order to numeric
function numberorder(a,b) { 
return a - b; }

// replace common HTML entitys with the characters they represent
function parseEntity(oldString) {
  oldString = swapStuff(oldString,"&apos;","'");
  oldString = swapStuff(oldString,"&divide;","/");
  oldString = swapStuff(oldString,"&ge;",">=");
  oldString = swapStuff(oldString,"&gt;",">");
  oldString = swapStuff(oldString,"&le;","<=");
  oldString = swapStuff(oldString,"&lt;","<");
  oldString = swapStuff(oldString,"&ne;","<>");
  oldString = swapStuff(oldString,"&quot;",'"');
  oldString = swapStuff(oldString,"&amp;","&");
  return oldString;
}

// replace the five problem characters for the server's XML parser
function makeXMLsafe(oldString) {
  oldString = swapStuff(oldString,"'","&apos;");
  oldString = swapStuff(oldString,">","&gt;");
  oldString = swapStuff(oldString,"<","&lt;");
  oldString = swapStuff(oldString,'"',"&quot;");
  return oldString;
}

// replace +  in string with space to allow parsing of unescaped xml response
function replacePlus(inText) { 
  inText = inText.replace(/[+]/g,"%20"); 
  return inText; 
} 

// get the substring between beforeString and afterString, starting at startpos
//      must be found before limitpos (0 for no limit) 
//      caseSensitive = true or false
function getInsideString(inString,beforeString,afterString,startpos,limitpos,caseSensitive) {
  var returnString = "";
  var ucInString = inString;
  var ucBefore = beforeString;
  var ucAfter = afterString;
  if (limitpos==0) limitpos = inString.length;
  if (!caseSensitive) {
    ucInString = inString.toUpperCase();
    ucBefore = beforeString.toUpperCase();;
    ucAfter = afterString.toUpperCase();;
  }
  pos = ucInString.indexOf(ucBefore,startpos);
  if ((pos != -1) && (pos<limitpos)) {
    pos = pos + ucBefore.length;
    var endpos = ucInString.indexOf(ucAfter,pos);
    returnString = inString.substring(pos,endpos);
  }       
  return returnString;
}

// remove spaces from a string .. from internet
function removeSpaces(string) {
  var tstring = "";
  string = '' + string;
  splitstring = string.split(" ");
  for(i = 0; i < splitstring.length; i++)
  tstring += splitstring[i];
  return tstring;
}
