var okToSend = true;
var max_display = 100;
var mindiff = .001;
var balloon;
var c_name = "vp_atlas";

// tile stuff
var resolution;
var container;
var mapContainer;
var rows = 256;
var cols = 256;
var ds = "vp_atlas";
var max_results = 100;

// Globex
var max_scale = 10;
var cache = "wi_globex";
var cache_origin_x = "-180";
var cache_origin_y = "90";
var globex_scales = [8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18];


function toggleView(str) {
	if (str == 'sat') {
		document.getElementById('map_button').src = 'images/map_deselected.png';
		document.getElementById('sat_button').src = 'images/sat_selected.png';
		cache = 'globex';
	} else {
		document.getElementById('map_button').src = 'images/map_selected.png';
		document.getElementById('sat_button').src = 'images/sat_deselected.png';
		cache = 'wi_globex';
	}
	getMap("");
}

function setEnvelope(ix, iy, ax, ay) 
{
	minx = ix;
	miny = iy;
	maxx = ax;
	maxy = ay;

	scale = "4";
	fixedzoom = "true";

	getMap("");

}

function getInitialMap(){
	minx = saved_minx;
	miny = saved_miny;
	maxx = saved_maxx;
	maxy = saved_maxy;

	container = document.getElementById('mapArea');

    	mapContainer = getElmById('mapContainer');

	getMap("");
}

function write_debug(str)
{
	if (document.getElementById('ta_debug') != null)
	{
		document.getElementById('ta_debug').value += str + '\n';
	}
}

function fixedZoomIn(){
    	if (parseInt(scale) < max_scale) {
        	scale = parseInt(scale) + 1;
                fixedzoom = "true";
                firstPass = "true";
               	getMap("");
      	} else {
                alert("Currently at min zoom");
        }
}

function fixedZoomOut(){
    	if (parseInt(scale) > 0) {
        	scale = parseInt(scale) - 1;
                fixedzoom = "true";
                firstPass = "true";
                getMap("");
      	} else {
        	alert ("Currently at max zoom");
    	}
}

function dragObjects(dx, dy)
{
        for (var i = 0; i < container.childNodes.length;i++) {
                var node = container.childNodes[i];
                var cur_left = node.style.left;
                var cur_top = node.style.top;
                var l = parseInt(cur_left.substring(0, cur_left.length));
                var t = parseInt(cur_top.substring(0, cur_top.length));

                node.style.left = parseInt(l +  dx) + "px";
                node.style.top = parseInt(t + dy) + "px";
        }

        for (var i = 0; i < mapContainer.childNodes.length; i++) {
                var node = mapContainer.childNodes[i];
                var cur_left = node.style.left;
                var cur_top = node.style.top;
                var l = parseInt(cur_left.substring(0, cur_left.length));
                var t = parseInt(cur_top.substring(0, cur_top.length));

                node.style.left = parseInt(l +  dx) + "px"; 
                node.style.top = parseInt(t + dy) + "px"; 

        }       

}

function zoom(left, bottom, right, top){
     	if (getExtentForZoomIn(left, bottom, right, top)) {
     		getMap("");	
	}
}

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);
	firstPass = "true";
	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);
 
	var xdiff = URPoint[0] - LLPoint[0];
        var ydiff = URPoint[1] - LLPoint[1];

        if (xdiff < mindiff || ydiff < mindiff) {
		alert ("Please select a larger area to zoom.");
        	return false;
	}
	
	minx = LLPoint[0];
	miny = LLPoint[1];
	maxx = URPoint[0];
	maxy = URPoint[1];

	return true;

}

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 dump_vals()
{	
	alert ('minx / ' + minx + ' miny / ' + miny + ' maxx / ' + maxx + ' maxy / ' + maxy);
}

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 getScaledMap(val, img, sel) {

for (i = 0; i < 10; i++) {
	var elm = getElmById('zoom' + i);
	elm.src='images/zoom/ZoomNav_Level' + (i+1) + '.gif';
}

var elm = getElmById(sel);

elm.src = img;

}

function getMapWithCurrentExtent(){

	getMap("");
}



function getMap(envelope) {

        if (okToSend) {

        	http = getHTTPObject();

        	if ((http != null) ) {
        		okToSend = false;
	        	var axl = getMapRequest("");
        		http.open("POST", url, true);
        		http.onreadystatechange = printResponse;
        		http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        		showLayer('loading');
        		http.send(axl);
       		}
        } else {
                alert ("Waiting for previous response");
        }
}

function createQueryString()
{
	var retVal = "minx=" + minx + "&miny=" + miny + "&maxx=" + maxx + "&maxy=" + maxy;

	return escape(retVal);
}

function getMapRequest(env)
{
	var w = "";
	var cats = "";

	for (var i = 0; i < categories.length; i++) {
		if (document.getElementById(categories[i]).type == 'checkbox') {
			if (document.getElementById(categories[i]).checked) {
				if (cats.length > 0) {
					cats += ",'" + categories[i] + "'";
				} else {
					cats = "'" + categories[i] + "'";
				}
			}
		} else {
			if (document.getElementById(categories[i]).value == 'true') {
				if (cats.length > 0) {
					cats += ",'" + categories[i] + "'";
				} else {
					cats = "'" + categories[i] + "'";
				}
			}
		}
	}

	if (cats.length > 0) {	
		w += " AND cd_item IN (SELECT cd_item FROM atlas_item_category WHERE tp_category IN (" + cats + "))";
	} else {
		// No category selected
		w += " AND 1=0";
	}


        var axl = 'minx=' + minx + '&miny=' + miny + '&maxx=' + maxx + '&maxy=' + maxy + '&MAX_RESULTS=' + max_display + '&width=' + mwidth + '&height=' + mheight + '&DS=' + ds + '&cache=' + cache + "&scale=" + scale + '&zoom=' + fixedzoom + "&CACHE_ORIGIN_X=" + cache_origin_x + "&CACHE_ORIGIN_Y=" + cache_origin_y + "&SRCH_WHERE=" + w + '&NEW_TILES=true';

        return axl;

}

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 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 tiles = xmlDoc.getElementsByTagName("TILES")[0].getElementsByTagName("TILE");
	scale = xmlDoc.getElementsByTagName("TILES").item(0).getAttribute("scale");
	resolution = xmlDoc.getElementsByTagName("TILES").item(0).getAttribute("resolution");

	if (document.getElementById('propcount') != null) {
	        document.getElementById('propcount').innerHTML = 'Feature Count: ' + xmlDoc.getElementsByTagName("ITEMS").item(0).getAttribute("count") + ' (Features display for counts less than ' + max_results + ')';
	}

	positionSlider();

	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"));

	clearImageMap();

	placeTiles(tiles);

	var items = xmlDoc.getElementsByTagName("RESPONSE")[0].getElementsByTagName("ITEM");

	processItems(items);

	fixedzoom = "";

	setCookie();

	hideLayer('loading');
    }else alert("Error retreiving data");
 
   okToSend = true;
  } 
}

function checkCookie()
{
	if (document.cookie.length>0)
  	{
  		c_start=document.cookie.indexOf(c_name + "=");
  		if (c_start!=-1)
    		{ 
 		c_start=c_start + c_name.length+1; 
    		c_end=document.cookie.indexOf(";",c_start);
	    	if (c_end==-1) c_end=document.cookie.length;
    		loadCookieVars(unescape(document.cookie.substring(c_start,c_end)));
    		} 
  	}
}

function loadCookieVars(str) {
	var toks = Array();
	var toks = str.split("|");
	minx = toks[0].split("~")[1];
	maxx = toks[1].split("~")[1];
	miny = toks[2].split("~")[1];
	maxy = toks[3].split("~")[1];
	scale = toks[4].split("~")[1];
	s_layer = toks[5].split("~")[1];

}

function setCookie() {
	var today = new Date();
	var expire = new Date();
 	expire.setTime(today.getTime() + 3600000*2);
 	var str= 'minx~' + minx + '|maxx~' + maxx + '|miny~' + miny + '|maxy~' + maxy + '|scale~' + scale + '|s_layer~' + s_layer;	
	document.cookie = c_name + "="+escape(str)
                 + ";expires="+expire.toGMTString();

}

function positionSlider() {
document.getElementById('sliderImg').style.top = (176 - (parseInt(scale) * 12)) + 'px';
}


function jumpTo(i) {
        if (okToSend) {
                scale = i;
		fixedzoom = "true";
                getMap("");
        }
}

function cleanString(str) 
{
	return unescape(str.replace(new RegExp(/\+/g), ' '));
}

function getElmById(theID) {
	var rv = null;

	if (isIE) {
		rv = document.all[theID];
	} else {
		rv = document.getElementById(theID);
	}
	return rv;
}



function clearImageMap ()
{
	while (mapContainer.childNodes.length > 0) {
                mapContainer.removeChild(mapContainer.lastChild);
        }

        while (container.childNodes.length > 0) {
                container.removeChild(container.lastChild);
        }

}


function createGlobexURL(x, y) {

return 'http://www.globexplorer.com/tiles/img?p=latlon&n=1&t=a&l=49&xi=' + x + '&yi=' + y + '&z=' + globex_scales[parseInt(scale)] + '&key=F7DAWIHDSliUu16V6YqFWSRxWSHZkWDZ';

}

function placeTiles(tiles) {

        for (var i = 0; i < tiles.length; i++) {
                        var url = tiles[i].getAttribute("url");
                        var row = parseInt(tiles[i].getAttribute("row"));
                        var col = parseInt(tiles[i].getAttribute("col"));
                        var x_pos = parseInt(tiles[i].getAttribute('x_pos'));
                        var y_pos = parseInt(tiles[i].getAttribute('y_pos'));

                        if (cache == 'globex') {
                                url = createGlobexURL(col, row);
                        }

                        var img = document.createElement('img');

                        img.src = url;
                        img.style.position = 'absolute';
                        img.style.top = y_pos + 'px';
                        img.style.left = x_pos + 'px';
                        img.onload = null;

                        container.appendChild(img);
        }

}

	
function processItems(props)
{
	
        var icon_w = 300;
        var icon_h = 345;

	balloon = {};

	for (var i = 0; i < props.length; i++) {
		var x = parseInt(props[i].getAttribute('x'));
		var y = parseInt(props[i].getAttribute('y'));
               var x1 = x - 8;
                var y1 = y - 8;

                var icon_type = "";

                if (x > (width / 2)) {
                        if (y > (height / 2) + 50) {
                                icon_type = "BR";
                                x = x - icon_w;
                                y = y - icon_h;
                        } else {
                                icon_type = "TR";
                                x = x - icon_w + 6;
                                y = y + 4;
                        }
                } else {
                        if (y > (height / 2) + 50) {
                                icon_type = "BL";
                                y = y - icon_h;
                                x = x + 5;
                        } else {
                                icon_type = "TL";
                                x = x + 5;
                                y = y + 3;
                        }
                }
	
		var cd_item = cleanString(props[i].getAttribute('cd_item'));

		var myDiv = document.createElement('DIV');
		myDiv.id = "myLayer" + cd_item;
		myDiv.style.position='absolute';
		myDiv.style.left =x + 'px';
		myDiv.style.top = y + 'px';
		myDiv.style.zIndex=2;

		var tmp_balloon = '<div class="balloon_' + icon_type + '">';
                tmp_balloon += '<div class="inner_balloon">';

                tmp_balloon += '<div class="close_icon"><a href="#" onClick="hideAll();"><img border="0" src="images/close_icon.gif" style="width:17px;"></a></div>';

                tmp_balloon += cleanString(props[i].getAttribute('ds_display'));

                tmp_balloon += '</div>';

                tmp_balloon += '</div>';

		balloon[cd_item] = tmp_balloon;

		if (s_layer == cd_item) {
			myDiv.innerHTML = tmp_balloon;
		} else {
			myDiv.style.visibility='hidden';
		}
		mapContainer.appendChild(myDiv);
	
		var area = document.createElement('DIV');
		area.id = cd_item;
		area.innerHTML = '<img src="' + cleanString(props[i].getAttribute('ds_icon')) + '"" border="0">';
		area.style.left=x1 + 'px';
		area.style.top=y1 + 'px';
		area.style.position='absolute';
		area.style.zIndex=1;
		area.onclick = function() {
			hideAll();
			s_layer = this.id;
			document.getElementById('myLayer' + this.id).innerHTML = balloon[this.id];
 
			document.getElementById('myLayer' + this.id).style.visibility = 'visible'; 
		}

		mapContainer.appendChild(area);
	
	}

}

function hideAll()
{
	var els = document.getElementsByTagName('DIV');
	s_layer = '';

 	for (var j = 0; j < els.length; j++) {
        	var elm = els[j];
                if (elm != null) {
			if (elm.id.indexOf('myLayer') > -1)
	                	elm.style.visibility = 'hidden';
              	} else {
                        break;
                }
    	}
}


