var initload=true;
function getInitialMap(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 env = xmlDoc.getElementsByTagName("ENVELOPE").item(1).xml;
    getInitMapEnvGCS(env);
    */
    getMap("");
    initload = false;
	
}

function getInitMapEnvGCS(env){
	var axl = '';
	axl += '<?xml version="1.0" encoding="UTF-8"?>\n';
    axl += '<ARCXML version="1.1">\n';
    axl += '  <REQUEST>\n';
    axl += '    <GET_PROJECT envelope="true">\n';
    axl += '      <FROMCOORDSYS id="102003"/>\n';
    axl += '      <TOCOORDSYS id="4152"/>\n';
    axl += env + '\n';
    axl += '   </GET_PROJECT>\n';
    axl += '  </REQUEST>\n';
    axl += '</ARCXML>\n';
    
	http = getHTTPObject();
	//if ((http != null) && (!isWorking)) {
	if ((http != null)) {

	    http.open("POST", url, true);
	    http.onreadystatechange = parseGCSEnv;
	    isWorking = true;
	    showLayer('loading');
	    http.send(axl);
  }
}

function parseGCSEnv(){
  if (http.readyState == 4) {
   if (http.status == 200) {

      var result = http.responseText;
      //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 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"));
	  if (initload)
	  {
	  minxg=minx;
	  minyg=miny;
	  maxxg=maxx;
	  maxyg=maxy;
	  }
	  
	  var nenv = env.xml;
	  //getMap(nenv);
	  //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 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;
	    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); 
      getInitialMap(result);
   } 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){
	var LLPoint = getMapXY(left, bottom);
	var URPoint = getMapXY(right, top);
	minx = LLPoint[0];
	miny = LLPoint[1];
	maxx = URPoint[0];
	maxy = URPoint[1];	
}


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 = (maxx-minx) / mwidth;
	var newX = (pixelX * mouseX) + minx;
	var mouseY = mheight - yIn;
	var pixelY = (maxy-miny) / mheight;
	var newY = (pixelY * mouseY) + 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) {
  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"?>\n';
	axl += '<ARCXML version="1.1">\n';
	axl += ' <REQUEST>\n';
	axl += '    <GET_IMAGE>\n';
	axl +=  '    <PROPERTIES>\n';
	axl += envelope;
	axl += '<IMAGESIZE height="' + mheight + '" width="' + mwidth + '" />\n';
	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 += '        <FEATURECOORDSYS id=" 102003"  /> <FILTERCOORDSYS id="4152" />';
	//axl += '       <FILTERCOORDSYS id="4152" /><FEATURECOORDSYS id="102003"  />';
	axl += ' </PROPERTIES>\n';
	
	// KML Point layer
	//kxl = getKML("http://localhost/gmap/fbopts.kml");
	if (kxl != "")
	{
	    axl += kxl;
	}

	axl += '    \n</GET_IMAGE>\n </REQUEST>\n</ARCXML>';
	return axl;
}


var kxl = "";

function getKML(kmlPath) {
    var axls = "";
    var http = false;
    if(navigator.appName == "Microsoft Internet Explorer") {
      http = new ActiveXObject("Microsoft.XMLHTTP");
    } else {
      http = new XMLHttpRequest();
    }

    http.open("GET", kmlPath);
    http.onreadystatechange=function() {
      if(http.readyState == 4) {
        //alert(http.responseText);
        kxl = KML2AXL(http.responseText);
      }
    }
    http.send(null);
}
 


function KML2AXL(result){
  var fboAcetateStr = "";

  //if (http.readyState == 4) {
    //if (http.status == 200) {

      //isWorking = false;
      //var result = http.responseText;
      //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);
       }
	
	//var theURL = xmlDoc.getElementsByTagName("Placemark").item(0).getAttribute("url");
	//document.getElementById('theImage').src = theURL;
	
	 var kml = xmlDoc.getElementsByTagName("Placemark");
	 
	 for (var i=0;i<kml.length;i++)
	 {
	 
	    var namek = kml[i].getElementsByTagName("name").item(0).firstChild.nodeValue;
	    var latlons =  kml[i].getElementsByTagName("coordinates").item(0).firstChild.nodeValue;
	  
	    var latlon = latlons.split(",");
	    fboAcetateStr = fboAcetateStr + "\n" + buildPointsLayerfromKML(latlon,namek);
		 }
	 
	 //minx = parseFloat(env.getAttribute("minx"));
	//hideLayer('loading');
   // } 
   // else
   // { 
    //alert("Error retreiving data");
   //}
     
  //} 
 
   return fboAcetateStr;
}


function buildPointsLayerfromKML(latlon, name)
{
    var axl = "";

    axl += buildBufferFromKMLPt(latlon,114.0, name);
    //axl += buildBufferFromKMLPt(latlon,114.0, name);
	axl += '<LAYER type="acetate" name="' + name + '">\n';
	axl += '<OBJECT units="database">\n<POINT coords="' + latlon[0] + ' ' + latlon[1] + '">\n';
	axl += '<SIMPLEMARKERSYMBOL  type="star" ';
	axl += ' color="255,0,0" width="15" />\n</POINT>\n</OBJECT>\n';		
	
    axl += '      <OBJECT units="database">\n';
    axl += '          <TEXT coords="' + latlon[0] + ' ' + latlon[1] + '" label="' + name + '"  >\n';
    axl += '            <TEXTMARKERSYMBOL font="Arial" fontstyle ="bold " fontcolor="255,0,0" fontsize="10"/>\n';
    axl += '        </TEXT>\n';
    axl += '      </OBJECT>\n	';
    axl += '</LAYER>\n';

    
    return axl;
}

function buildBufferFromKMLPt(latlon, radius, name)
{
    var axl = "";

    axl += '<LAYER type="acetate" name="' + name + '" id="' + name + '">\n';
    axl += '<OBJECT units="database">\n';
    axl += '  <SIMPLEPOLYGONSYMBOL    filltransparency ="0.7"  boundarytransparency ="0.5"  transparency ="0.7"  boundary ="true"    boundarycolor ="0,0,255"  boundarytype ="solid"    boundarywidth ="2"  fillcolor="255,0,0" filltype ="horizontal" fillinterval ="100"/>\n';
    axl += '  <POLYGON>\n';
    axl += '    <RING>\n';
    
    var lat = parseFloat(latlon[1]);
    var lng = parseFloat(latlon[0]);

      var d2r = Math.PI/180.0000;
      var r2d = 180.0000/Math.PI;
      var Clat = (radius/3963.00000)*r2d;
      var Clng = Clat/Math.cos(lat*d2r);
      var Cpoints = [];
      for (var i=0; i < 33; i++) {
        var theta = Math.PI * (i/16.0000);
        Cy = lat + (Clat * Math.sin(theta));
        Cx = lng + (Clng * Math.cos(theta));
        
        axl += '	<POINT x="' + parseFloat(Cx) + '" y="' + parseFloat(Cy) + '" />\n';

        //var P = new GPoint(Cx,Cy);
        //Cpoints.push(P);

        //var point = new GLatLng(parseFloat(Cy),parseFloat(Cx),true);
        //Cpoints.push(point );   
      } 

    axl += '    </RING>\n';
    axl += '  </POLYGON>\n';
    axl += '</OBJECT>\n';
    axl += '</LAYER>\n';
    return axl;
}


//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);
 
	  //var envs = xmlDoc.getElementsByTagName("ENVELOPE").item(0).xml;
      //getInitMapEnvGCS(envs);
 
	 
	  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 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);

	}

}
