
function getInitialMap(){
   if (mapMode == 'ims')
   {
      var env = '<ENVELOPE minx="' + minx + '" miny="' + miny +'" maxx="' + maxx +'" maxy="' + maxy + '" />';
	  getMap(env);
   } else if (mapMode == 'wms')
   {
      GetInitWMSMap();
   }
}


function getServiceInfo(){
	var axl = '<?xml version="1.0" encoding="UTF-8"?><ARCXML version="1.1">\n<REQUEST>\n<GET_SERVICE_INFO renderer="false" extensions="false" fields="false" />\n</REQUEST>\n</ARCXML>\n';
	http = getHTTPObject();
	//if ((http != null) && (!isWorking)) {
	if ((http != null)) {
	    http.open("POST", url, true);
	    //http.onreadystatechange = parseLayers;
	    http.onreadystatechange = parseServiceReq;
	    isWorking = true;
	    showLayer('loading');
	    http.send(axl);
  }
}


function parseLayers(){
  if (http.readyState == 4) {
   if (http.status == 200) {

      var result = http.responseText;
      //alert(result);
      getLayers(result); 
      
      //getExtent
      
      
      getInitialMap();
   } else alert("Error retreiving data");
          
  }  
 }
function fixedZoomIn(){
    growEnvelope(0.75);
    var env = '<ENVELOPE minx="' + minx + '" miny="' + miny +'" maxx="' + maxx +'" maxy="' + maxy + '" />';
	getMap(env);
}

function fixedZoomOut(){
	growEnvelope(1.25);
	var env = '<ENVELOPE minx="' + minx + '" miny="' + miny +'" maxx="' + maxx +'" maxy="' + maxy + '" />';
	getMap(env);
}
function zoom(left, bottom, right, top){
     if(activeTool == "zoomin") getExtentForZoomIn(left, bottom, right, top);
     else getExtentForZoomOut(left, bottom, right, top);	
     var env = '<ENVELOPE minx="' + minx + '" miny="' + miny +'" maxx="' + maxx +'" maxy="' + maxy + '" />';
     getMap(env);	

}
function pan(ix, iy){
	var dx = (maxx - minx)/mwidth;
	var mx = dx*ix;
	var my = dx*iy;
	minx += mx;
	maxx += mx;
	miny += my;
	maxy += my;
	var env = '<ENVELOPE minx="' + minx + '" miny="' + miny +'" maxx="' + maxx +'" maxy="' + maxy + '" />';
     	getMap(env);
}
function panDirection(dir){
	shift(dir);
	var env = '<ENVELOPE minx="' + minx + '" miny="' + miny +'" maxx="' + maxx +'" maxy="' + maxy + '" />';
     	getMap(env);
}

function shift(dir){
	var dx = maxx - minx;
	var dy = maxy - miny;
		
	switch(dir) {
		//NORTH
		case "north":
			miny += 0.3*dy;
			maxy += 0.3*dy;
		break;
		//south
		case "south":
			miny -= 0.3*dy;
			maxy -= 0.3*dy;
		break;
		//east
		case "east":
			minx += 0.3*dx;
			maxx += 0.3*dx;
		break;
		//west
		case "west":
			minx -= 0.3*dx;
			maxx -= 0.3*dx;
		break;
		//northeast
		case "ne":
			miny += 0.3*dy;
			maxy += 0.3*dy;
			minx += 0.3*dx;
			maxx += 0.3*dx;
		break;
		//northwest
		case "nw":
			miny += 0.3*dy;
			maxy += 0.3*dy;
			minx -= 0.3*dx;
			maxx -= 0.3*dx;
		break;
		//southeast
		case "se":
			miny -= 0.3*dy;
			maxy -= 0.3*dy;
			minx += 0.3*dx;
			maxx += 0.3*dx;
		break;
		//southwest
		case "sw":
			miny -= 0.3*dy;
			maxy -= 0.3*dy;
			minx -= 0.3*dx;
			maxx -= 0.3*dx;
		break
		
	}
}

function getExtentForZoomIn(left, bottom, right, top){
	//alert(left + "          " + right);
	 var LLPoint = getMapXY(left, bottom);
	 var URPoint = getMapXY(right, top);
	//var  LLPoint = convertPixelToMap(left, bottom);
	//var URPoint = convertPixelToMap(right,  top);
	minx = LLPoint[0];
	miny = LLPoint[1];
	maxx = URPoint[0];
	maxy = URPoint[1];	
	//alert(minx + "          " + maxx);
}


function getExtentForZoomOut(left, bottom, right, top){
		var xDiff= maxx-minx;
		var yDiff= maxy-miny;

		var pwidth = right-left;
		var pheight = top-bottom;
		var xRatio = mwidth / pwidth;
		var yRatio = mheight / pheight;
		var xAdd = xRatio * xDiff / 2;
		var yAdd = yRatio * yDiff / 2;
		minx =  minx - xAdd;
		maxx = maxx + xAdd;
		miny = miny - yAdd;
		maxy = maxy + yAdd;
		

}

function getMapXY(xIn,yIn) {
	var newValues = new Array();

	var mouseX = xIn;
	var pixelX = (parseFloat(maxx)-parseFloat(minx)) / parseFloat(mwidth);
	var newX = (pixelX * mouseX) + parseFloat(minx);
	var mouseY = mheight - yIn;
	var pixelY = (parseFloat(maxy)-parseFloat(miny)) / parseFloat(mheight);
	var newY = (parseFloat(pixelY) * parseFloat(mouseY)) + parseFloat(miny);
	newValues[0] = newX;

	newValues[1] = newY;
	return newValues; 
}

function growEnvelope(value){
	var dx = maxx - minx;
	var dy = maxy - miny;

	var cx = (maxx + minx)/2.0;
	var cy = (maxy + miny)/2.0;

	var dx1 = 0.5 * value * dx;
	var dy1 = 0.5 * value * dy;

	minx = cx - dx1;
	miny = cy - dy1;
	maxx = cx + dx1;
	maxy = cy + dy1;
}

function getMapWithCurrentExtent(){
	var env = '<ENVELOPE minx="' + minx + '" miny="' + miny +'" maxx="' + maxx +'" maxy="' + maxy + '" />';
	getMap(env);
}

function getMap(envelope)
{
   if (mapMode == 'ims')
   {
	  getMapIMS(envelope);
   } else if (mapMode == 'wms')
   {
      GetWMSMap();
   }
}

function getMapIMS(envelope) {
  http = getHTTPObject();
  if ((http != null)) {
    var axl = getMapRequest(envelope);
    http.open("POST", url, true);
    http.onreadystatechange = printResponse;
     //alert("sending :" + axl);
    showLayer('loading');
    http.send(axl);
  }
}

function getMapRequest(envelope){
	var axl = '<?xml version="1.0" encoding="UTF-8"?>';
	axl += '<ARCXML version="1.1">';
	axl += ' <REQUEST>';
	axl += '    <GET_IMAGE>';
	axl +=  '    <PROPERTIES>';
	axl += envelope;
	axl += '<IMAGESIZE height="' + mheight + '" width="' + mwidth + '" />';
	axl += '<LAYERLIST >\n';
	for (var i=0;i<layerCount;i++) {
		if (LayerVisible[i]==1) {
			axl += '<LAYERDEF id="' + LayerID[i] + '" visible="true" />\n';
		}else {
			axl += '<LAYERDEF id="' + LayerID[i] + '" visible="false" />\n';
		}
	}
	axl += '</LAYERLIST>\n';
	axl += ' </PROPERTIES>';
	axl += '    </GET_IMAGE> </REQUEST></ARCXML>';
	return axl;
}

 
// Legend related functions /////////////////////
function getLegendReq()
{
	var axl = '';
	axl += '<?xml version="1.0" encoding="UTF-8"?>\n';
	axl += '<ARCXML version="1.1">\n';
	axl += '<REQUEST>\n';
	axl += '<GET_IMAGE>\n';
	axl += '<PROPERTIES>\n';
	axl += '<ENVELOPE minx="' + minx + '" miny="' + miny +'" maxx="' + maxx +'" maxy="' + maxy + '" />';
	//axl += envelope;
	axl += '<LAYERLIST>\n';
	var vLyrs = 0;
	for (var i=0;i<layerCount;i++) {
		if (LayerVisible[i]==1) {
		    vLyrs++; 
			axl += '<LAYERDEF id="' + LayerID[i] + '" visible="true" />\n';
		}else {
			axl += '<LAYERDEF id="' + LayerID[i] + '" visible="false" />\n';
		}
	}
	axl += '</LAYERLIST>\n';
	if (vLyrs > 3) {
	    axl += '<LEGEND title="Legend" font="Sylfaen,Arial"  titlefontsize ="7" layerfontsize ="7"   swatchheight ="7"   swatchwidth ="7" valuefontsize ="7"  autoextend="true" columns="1" width="' + lWidth + '" height="' + lHeight + '" backgroundcolor="255,255,255" >\n';
	} else {
	    axl += '<LEGEND title="Legend" font="Sylfaen,Arial"  titlefontsize ="7" layerfontsize ="7"   swatchheight ="7"   swatchwidth ="7" valuefontsize ="7"  autoextend="true" columns="1" width="' + lWidth + '" height="' + lHeight + '" backgroundcolor="255,255,255" >\n';
	}
	axl += '</LEGEND>\n';
	axl += '<DRAW map="false"/>\n';
	axl += '</PROPERTIES>\n';
	axl += '</GET_IMAGE>\n';
	axl += '</REQUEST>\n';
	axl += '</ARCXML>\n';
	return axl;
}

function ParseLegendURL(result){

      var xmlDoc;
      if(document.implementation && document.implementation.createDocument) { 
      	// MOZILLA 
       	 xmlDoc = document.implementation.createDocument("", "", null);
      	 xmlDoc.async="false";
         xmlDoc.loadXML(result);
      } else if (window.ActiveXObject){
      	 //IE
      	  xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
	  xmlDoc.async="false";
	  xmlDoc.loadXML(result);
      }
	
	//var theURL = xmlDoc.getElementsByTagName("Placemark").item(0).getAttribute("url");
	//document.getElementById('theImage').src = theURL;
	 var theURL = xmlDoc.getElementsByTagName("LEGEND").item(0).getAttribute("url");
	 //document.getElementById('theImage').src = theURL;
	 //var axll = xmlDoc.getElementsByTagName("LEGEND");
	 //var legurl = axll[0].item(0).getAttribute("url");
	//hideLayer('loading');

   return theURL;
}
//javascript:void(showLegend())
function showLegend() {
    var axlr = "";
     showLayer('loading');
    /*
    var http = false;
    if(navigator.appName == "Microsoft Internet Explorer") {
      http = new ActiveXObject("Microsoft.XMLHTTP");
    } else {
      http = new XMLHttpRequest();
    }
    */
    http = getHTTPObject();
    var legAxl = getLegendReq();
    if ((http != null)) {
        //http.open("GET", legAxl);
        http.open("POST", url, true);
        http.onreadystatechange=function() {
          if(http.readyState == 4) {
            axlr = ParseLegendURL(http.responseText);
            displayLegend(axlr)
            //createLegendDiv();
          }
        }
        http.send(legAxl);
    } else {
      hideLayer('loading');
    }
}

 
function displayLegend(lURL)
{
var idContent =  "";
/*
 var idContent =  "<table class='idTitleBarClass'  style='width:" + lWidth + "px'>";
 idContent += "<tr onmousedown='startMove(event, \"divLegend\")'>";
 idContent += "<td style='width:95%'><font class='idTitleClass'>Legend</font></td>";
 idContent += "<td align='right'  style='width:5%'> <img onmousedown='hideLayer(\"divLegend\");' src='images/close.gif'></td>";
 idContent += "</tr>";
 idContent += "</table>";
 */
 
 idContent += "<table style=width:98%' >";
  idContent += "<tr>";
 idContent += "<td class='idNonTitleClass'>";
 
 idContent =  "<table class='idTitleBarClass'  style='width:" + lWidth + "px'>";
 idContent += "<tr onmousedown='startMove(event, \"divLegend\")'>";
 idContent += "<td style='width:95%'><font class='idTitleClass'>Legend</font></td>";
 idContent += "<td align='right'  style='width:5%'> <img onmousedown='hideLayer(\"divLegend\");' src='images/close.gif'></td>";
 idContent += "</tr>";
 
 idContent += "</table>";
 
 idContent += "</td>";
 idContent += "</tr>";
 idContent += "<tr>";
 idContent += "<td class='idNonTitleClass'>";
 
 idContent += "<div style='overflow:auto;height:100%;width:100%;border-width:1px;'>";
 idContent += '<img src="' + lURL + '"  />';
 idContent += "</div>";
 
 idContent += "</td>";
 idContent += "</tr>";
 //idContent += "<div style='overflow:auto;height:'" + lHeight + "px';width:'" + lWidth + "px';border-width:1px;'>";
 //idContent += '<img src="' + lURL + '" style="width:' + lWidth + 'px; height: ' + lHeight + 'px" />';
 idContent += "</table>";
 updateContent('divLegend', idContent);
 hideLayer('loading');
 showLayer('divLegend');
}

function createLegendDiv(){
	  //document.writeln('<div id="divLegend" style="position:absolute; overflow:auto; left:100px; top:100px; width:180px; height:250px; background-color:White; border-style:ridge;visibility:hidden;">');
	  document.writeln('<div id="divLegend" style="position:absolute; left:100px; top:100px; width:' + lWidth + 'px; height:550px; background-color:White; border-style:ridge;visibility:hidden;">');
	  document.writeln('</div>');
		
}

// End - Legend related functions /////////////////////

//need to define loadXML function for non IE browser which do not have loadXML implemented
//we use loadXML (can't use load method) to load ArcXML response because the response from ArcIMS is in plain text format   

if(!isIE){
	Document.prototype.loadXML = function (s) {
      
	   	// parse the string to a new doc   
	   	var doc2 = (new DOMParser()).parseFromString(s, "text/xml");
      
	   	// remove all initial children
	   	while (this.hasChildNodes())
	   	   this.removeChild(this.lastChild);
         
	   	// insert and import nodes
	   	for (var i = 0; i < doc2.childNodes.length; i++) {
	   	   this.appendChild(this.importNode(doc2.childNodes[i], true));
	   	}
       };
}



function printResponse(){

if (http.readyState == 4) {
    if (http.status == 200) {

      isWorking = false;
      var result = http.responseText;
      
	//var result = http.responseXML;  //fails
	//alert(result);

	var xmlDoc;
	
      if(document.implementation && document.implementation.createDocument) { 
      	// MOZILLA 
       	 xmlDoc = document.implementation.createDocument("", "", null);
      	 xmlDoc.async="false";
         xmlDoc.loadXML(result);
      } else if (window.ActiveXObject){
      	 //IE
      	  xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
	  
	  xmlDoc.async="false";
	  xmlDoc.loadXML(result);
       }
	//  alert(xmlDoc.getElementsByTagName("OUTPUT").item(0).getAttribute("url"));
	var theURL = xmlDoc.getElementsByTagName("OUTPUT").item(0).getAttribute("url");
	 document.getElementById('theImage').src = theURL;
	 var env = xmlDoc.getElementsByTagName("ENVELOPE").item(0);
	  minx = parseFloat(env.getAttribute("minx"));
	  miny = parseFloat(env.getAttribute("miny"));
	  maxx = parseFloat(env.getAttribute("maxx"));
	  maxy = parseFloat(env.getAttribute("maxy"));
	  //alert(minx +","+ miny +","+ maxx+","+maxy);

	//alert(result + " received");
	// parseEnvelope(result, 0);
	// var theURL = getURL(result);
	//document.getElementById('theImage').src = theURL;
	hideLayer('loading');
    }else alert("Error retreiving data");
     
  } 
}

function getURL(theReply) {
	var theURL = "";
	var startpos = 0;
	var endpos = 0;

	var pos = theReply.indexOf("OUTPUT");
	var pos1 = theReply.indexOf("url", pos);
	pos1 += 5;
	var pos2 = theReply.indexOf("\"", pos1);
	theURL = theReply.substring(pos1,pos2);


	return theURL;

}



function parseServiceReq(){

if (http.readyState == 4) {
    if (http.status == 200) {

      isWorking = false;
      var result = http.responseText;
      
	//var result = http.responseXML;  //fails
	//alert(result);

	  var xmlDoc;
	
      if(document.implementation && document.implementation.createDocument) { 
      	// MOZILLA 
       	 xmlDoc = document.implementation.createDocument("", "", null);
      	 xmlDoc.async="false";
         xmlDoc.loadXML(result);
      } else if (window.ActiveXObject){
      	 //IE
      	  xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
	  
	  xmlDoc.async="false";
	  xmlDoc.loadXML(result);
       }
	//  alert(xmlDoc.getElementsByTagName("OUTPUT").item(0).getAttribute("url"));
	 //var theURL = xmlDoc.getElementsByTagName("OUTPUT").item(0).getAttribute("url");
	 //document.getElementById('theImage').src = theURL;
	 var prp = xmlDoc.getElementsByTagName("PROPERTIES").item(0);
 
	 var env = prp.getElementsByTagName("ENVELOPE").item(0);
	  minx = parseFloat(env.getAttribute("minx"));
	  miny = parseFloat(env.getAttribute("miny"));
	  maxx = parseFloat(env.getAttribute("maxx"));
	  maxy = parseFloat(env.getAttribute("maxy"));
	  //alert(minx +","+ miny +","+ maxx+","+maxy);
 
      try      {	  
	    var mpu = prp.getElementsByTagName("MAPUNITS").item(0);
	    if (mpu) {
          mapUnits = mpu.getAttribute("units");
        }
      } catch (exc)  {
         //alert("MAPUNITS Erre: " + exc);
      }    
           
      try      {
 	     var fgs = prp.getElementsByTagName("FEATURECOORDSYS").item(0);
 	      
	       if (fgs) {
	         if (fgs.getAttribute("string")) {
                 var tprojStr = fgs.getAttribute("string");
                 //string="PROJCS[&quot;NAD_1983_StatePlane_Tennessee_FIPS_4100_Feet&quot;,GEOGCS
                 var prms = tprojStr.replace("PROJCS[&quot;","");
                 prms = tprojStr.replace("&quot;,GEOGCS","");
                 projStr = prms;
             } else if (fgs.getAttribute("id")){
                 projStr = "EPSG Code " + fgs.getAttribute("id");
             }
           } 
         } catch (exc)
        {
            //alert("FEATURECOORDSYS Error: " + exc);
        }    
     
	//alert(result + " received");
	// parseEnvelope(result, 0);
	// var theURL = getURL(result);
	//document.getElementById('theImage').src = theURL;
	
	getLayers(result); 
    getInitialMap();
    
	hideLayer('loading');
    }else alert("Error retreiving data");
     
  } 
}


function parseEnvelope(theString, startpos) {
	theString = theString.toUpperCase();
	var tempString = "";
	var dQuote="\"";
	var pos = theString.indexOf("ENVELOPE",startpos);
	if (pos!=-1) {
		pos = pos + 8;
		startpos = theString.indexOf("MINX=",pos);
		startpos += 6;
		var endpos = theString.indexOf(dQuote,startpos);
		tempString = theString.substring(startpos,endpos);
		minx = parseFloat(tempString);
		startpos = theString.indexOf("MINY=",pos);
		startpos += 6;
		endpos = theString.indexOf(dQuote,startpos);
		tempString = theString.substring(startpos,endpos);
		miny = parseFloat(tempString);
		startpos = theString.indexOf("MAXX=",pos);
		startpos += 6;
		endpos = theString.indexOf(dQuote,startpos);
		tempString = theString.substring(startpos,endpos);
		maxx = parseFloat(tempString);
		startpos = theString.indexOf("MAXY=",pos);
		startpos += 6;
		endpos = theString.indexOf(dQuote,startpos);
		tempString = theString.substring(startpos,endpos);
		maxy = parseFloat(tempString);

	}

}
