var vemap = null;
//var justZoomPan = 0;
var justBounded = 0;
var endPanTimer = null;
var END_PAN_TIMER_DELAY = 700;
// Global value to ensure scripts refer to correct URLS
var siteurl = location.protocol+"//"+location.hostname+((location.port.length>0&&location.port!=80&&location.port!=443)?":"+location.port:"");			
			
function GetMap()
{	
	vemap = new VEMap('map');	
	vemap.LoadMap(new VELatLong(-28.071980, 132.802734), 4, 'h', false );
	vemap.SetScaleBarDistanceUnit(VEDistanceUnit.Kilometers);
//	vemap.ClearInfoBoxStyles();
	vemap.SetMouseWheelZoomToCenter(false);  //zooms in to where the mouse is when using wheel
//	vemap.AttachEvent("onchangeview", refreshPoints);  //to refresh on zoom

	vemap.AttachEvent("onendzoom", EventEndContinuousPan);  //to refresh on zoom
	vemap.AttachEvent("onendpan", EventEndContinuousPan);  //to refresh on pan
	
}

function sortNumber(a,b){
	return a - b;
}

function EventEndContinuousPan()  //needed bc ve events are triggered incorrectly in 3d mode
{
   //If the timer is set, clear it and reset it
   if (endPanTimer != null)
   {
      window.clearTimeout(endPanTimer);
   }
   endPanTimer = window.setTimeout(afterZoomPan, END_PAN_TIMER_DELAY);
} 

function afterZoomPan(){
	endPanTimer = null; 
	if(justBounded == 0){  //do not run if the rect bound has been called (avoids updatepoints being called twice)
		var zoompan = 1;  //to avoid rebounding
		//get lat lngs		
		if(document.getElementById("phoneform")){ 
			var curr_width = 642;  //get these automatically...?
			var curr_height = 483;
		} else {  //demo page
			var curr_width = 986;  //get these automatically...?
			var curr_height = 483;
		}
		var mapmode = vemap.GetMapMode();
						
		if(mapmode==2){  //3D mode			
			
			pixel_tl = new VEPixel(0,0);
			tl = vemap.PixelToLatLong(pixel_tl) + '';	
			var arr_tl = tl.split(", ");
				
			pixel_br = new VEPixel(curr_width,curr_height);
			br = vemap.PixelToLatLong(pixel_br) + '';	
			var arr_br = br.split(", ");
		
			pixel_tr = new VEPixel(curr_width,0);
			tr = vemap.PixelToLatLong(pixel_tr) + '';
			var arr_tr = tr.split(", ");
			
			pixel_bl = new VEPixel(0,curr_height);
			bl = vemap.PixelToLatLong(pixel_bl) + '';
			var arr_bl = bl.split(", ");
			
			var lats = new Array(arr_tl[0]*1,arr_tr[0]*1,arr_bl[0]*1,arr_br[0]*1);
			var lngs = new Array(arr_tl[1]*1,arr_tr[1]*1,arr_bl[1]*1,arr_br[1]*1);
			lats.sort(sortNumber);
			lngs.sort(sortNumber);
			
			var topLeft = lats[3]+', '+lngs[0];
			var botRight = lats[0]+', '+lngs[3];
			
		} else {
			
			pixel_tl = new VEPixel(0,0);
			tl = vemap.PixelToLatLong(pixel_tl) + '';	
			var arr_tl = tl.split(", ");
				
			pixel_br = new VEPixel(curr_width,curr_height);
			br = vemap.PixelToLatLong(pixel_br) + '';	
			var arr_br = br.split(", ");
		
			var topLeft = tl;
			var botRight = br;
		}
			
		UpdatePoints(topLeft,botRight,zoompan);	//show points for new zoom level	
	} else { justBounded = 0; }
}

function GetLocationPins( fromDate, toDate, latestonly, phones, tl, br, zoompan, showdemo)
{

	var latestp = '';
	if(latestonly==true){
		latestp = document.getElementById('latestp').value;
	}
	
//	vemap.DeleteAllShapeLayers();  //maybe remove?
	var baseurl= siteurl+"/includes/vemap_genxml.php?ran=" + (Math.random()*1000) + "&";
	baseurl += "fdate=" + fromDate + "&tdate=" + toDate + "&latest=" + latestonly + "&latids=" + latestp + "&phones=" + phones + "&tl=" + tl + "&br=" + br + "&sd=" + showdemo;
//console.log(baseurl);

	loadXMLDoc(baseurl,zoompan);

}

/*function InitPins()
{
	loadXMLDoc("http://dev.fonesentinel.com/includes/vemap_genxml.php?");
}*/

function getInter(time1,time2){
	if(time1==time2){ return 0 }
	return ((time2 - time1)/7).toFixed(2); 
}

function getColour(time1,segments,ms){
	
	var diff = ms - time1; //diff bw time and first time
	var out = (Math.floor(diff/segments)+1);
	if(out>7) out = 7;
	//console.log(time1 + ' ' + segments + ' ' + ms + ' ' + out);
	return out;
}

function ProcessPoints(xmlDoc,zoompan)
{
	vemap.DeleteAllShapeLayers();  //maybe remove?
	
	var layer = new VEShapeLayer();
	vemap.AddShapeLayer(layer); 
	//var mapmode = vemap.GetMapMode();		 
	var points = xmlDoc.selectNodes("//marker");
	pointInfo = new Array(points.length);
	
	if(points.length==0){  //no points so display error at latlng0
		var pinLoc = new VELatLong( 0, 0 );
		var aMarker = new VEShape( VEShapeType.Pushpin, pinLoc);
		aMarker.SetCustomIcon("<div class='pinStyleNon'></div>");
		layer.AddShape(aMarker);
	}
	
	var time1 = 0;
	var time2 = 0;
	
	if(points.length>0){
		//get first/last ms (for colouring + legend)
		var times=points[0];
		time1 = (times.getElementsByTagName('firstms')[0].firstChild) ? times.getElementsByTagName('firstms')[0].firstChild.nodeValue : 0;
		time2 = (times.getElementsByTagName('lastms')[0].firstChild) ? times.getElementsByTagName('lastms')[0].firstChild.nodeValue : 0;
		// work out segments
		//get pnttime variance to work out colour scales
		var segments = getInter(time1,time2);  //seconds for each colour (rounded down)		
		//alert(segments);
	}	
	
	//create array of phid to display num
	var phArr = new Array();
	if(document.getElementById('dispNumForm')){
		var dispNums = document.getElementById('dispNumForm').elements;
		for(var i = 0; i < dispNums.length; i++){		
			phArr[dispNums[i].name] = dispNums[i].value;		
		} 
	} 
	
	//var aPolyLine = new Array();
	var markerArr = new Array();
	
	for (var i=1; i < points.length; i++)  //start at 1 bc first xml element is start/end ms
	{
		
		var p=points[i];
		var lat = p.getElementsByTagName('lat')[0].firstChild.nodeValue;
		var lng = p.getElementsByTagName('lng')[0].firstChild.nodeValue;
		var spd = p.getElementsByTagName('spd')[0].firstChild.nodeValue;
		var pnttime = p.getElementsByTagName('ptime')[0].firstChild.nodeValue;
		var alt = p.getElementsByTagName('alt')[0].firstChild.nodeValue;
		var fname = p.getElementsByTagName('name')[0].firstChild.nodeValue;
		var blife = p.getElementsByTagName('blife')[0].firstChild.nodeValue;
		var sdop = p.getElementsByTagName('dop')[0].firstChild.nodeValue;
		var latest = p.getElementsByTagName('latest')[0].firstChild.nodeValue;
		var phid = p.getElementsByTagName('phid')[0].firstChild.nodeValue;		
		
		var posType = (sdop==101) ? '_tower' : '';
		
		
		var pinLoc = new VELatLong( lat, lng );
		var aMarker = new VEShape( VEShapeType.Pushpin, pinLoc);
		var customIcon = new VECustomIconSpecification();			
		var iColor = getColour(time1,segments,pnttime);
		
		if(typeof phArr[phid] == 'undefined'){ phArr[phid] = ''; }  //demo page
		
		if (latest == 'yes'){  //if latest point, or only showing latest points
			customIcon.CustomHTML = "<div class='pinStyle2' style='background:url(\""+siteurl+"/images/0" + posType + ".png\");'><div class='pinInner'>"+phArr[phid]+"</div></div>";
			customIcon.Image = siteurl+"/images/0_3d.png";  //for 3d mode only
		} else {		
			customIcon.CustomHTML = "<div class='pinStyle2' style='background:url(\""+siteurl+"/images/" + iColor + posType + ".png\");'><div class='pinInner'>"+phArr[phid]+"</div></div>";	
			customIcon.Image = siteurl+"/images/" + iColor + "_3d.png";   //for 3d mode only
		}		
			
			aMarker.SetAltitude(alt*1, VEAltitudeMode.Absolute);
			//aMarker.SetLineToGround(true);
		
		//get point time
		var phDate = new Date;
		phDate.setTime(pnttime*1000);
		
		
		var hoursArr = getHoursAmPm(phDate.getHours());
		var aDate = getDateName(phDate.getMonth()) + ' ' + phDate.getDate();
		//check if date is today
		var dateToday = new Date();
		if((dateToday.getDate() == phDate.getDate())&&(dateToday.getMonth() == phDate.getMonth())){ aDate = 'Today';  }
		//create date string
		var dateString = aDate + ', ' + hoursArr[0] + ':' + padNum(phDate.getMinutes()) + '<span style="font-size:10px;color:#d8d8d8">:' + padNum(phDate.getSeconds()) + '</span> ' + hoursArr[1];
		//alert(blife + 'aa');
		if(blife!='-1'){ 
			var battery = '<img src="images/infowin_battery.png" /><br /><img src="images/' + battImg(blife) + '" width="15px" height="34px" />'; 
		} else {
			var battery = '';
		}
		//if(mapmode!=2){
			//alert(mapmode);
			aMarker.SetDescription(
				'<div class="iLeft"><div class="iName">' + fname + '</div><div class="iTime">' +  dateString + '</div><div>Speed: ' + spd + ' km/h</div><div>Alt: ' + alt + 'm</div></div><div class="iRight"><div class="iRTop"><img src="images/infowin_signal.png" /><br /><img src="images/' + sdopImg(sdop) + '" width="30px" height="30px" /></div><div class="iRBot">' + battery + '</div></div><div class="clear"></div>');
			//	aMarker.SetDescription(	'2d -' + fname );
		//} else {   //3d
			//alert('llll'+mapmode);
		//	aMarker.SetDescription(	'3d - ' + fname );
		//}
			//<div><a href="viewaddress.php?lat=' + lat + '&lng=' + lng + '&height=300&width=300" class="thickbox">More information</a></div>

		
		aMarker.SetCustomIcon(customIcon);
		markerArr.push(aMarker);		
	
		//aPolyLine.push(new VELatLong(lat,lng,alt,VEAltitudeMode.Absolute));
		
	} 	
	
	layer.AddShape(markerArr);
	
//	var shape4 = new VEShape(VEShapeType.Polygon, points);
 //   shape4.SetAltitude(altitudes);
  //  shape4.SetLineToGround(false);
    //shape4.HideIcon();
    //map.AddShape(shape4);
    //shapes[3] = shape4;
	
	//create polyline
	//var shape = new VEShape(VEShapeType.Polygon, aPolyLine);
    //shape.SetLineToGround(true);
	//shape.HideIcon();
	//layer.AddShape(shape);


	if(zoompan!=1){  
			
		if(document.getElementById('show3d')){  //show/ page
			
			if(document.getElementById('ptype')){  // live demo page
				if(document.getElementById('ptype').value='ll'){ 
					rect = layer.GetBoundingRectangle();
					vemap.SetMapView(rect);  
				}
			} else {
				if(document.getElementById('show3d').value=='1'){ 			
					vemap.SetMapMode(VEMapMode.Mode3D);
					var viewspec = new VEMapViewSpecification(new VELatLong(document.getElementById('viewing_lat').value, document.getElementById('viewing_lng').value), null, (document.getElementById('viewing_alt').value)*1, (document.getElementById('viewing_angle').value)*1, (document.getElementById('viewing_heading').value)*1);
					//console.log(  document.getElementById('viewing_lat').value + ', ' + document.getElementById('viewing_lng').value + ', ' + (document.getElementById('viewing_alt').value)*1 + ', ' + (document.getElementById('viewing_angle').value)*1 + ', ' + (document.getElementById('viewing_heading').value)*1 );
					vemap.SetMapView(viewspec);
					if(vemap.GetMapMode()==1){
						document.getElementById('err').innerHTML = 'NOTE: Virtual Earth 3D mode currently only works in Firefox and Internet Explorer';
					}
				} else {
					//set zoom in 2d mode	
					vemap.SetCenterAndZoom(new VELatLong(document.getElementById('viewing_lat').value, document.getElementById('viewing_lng').value), document.getElementById('zoom2D').value)					
				}
			}
		} else { //regular points viewing
			rect = layer.GetBoundingRectangle();
			vemap.SetMapView(rect);    //causes 3D mode to screw up.  If disabled, map is not going to auto zoom into where the points are.
		}
	
		justBounded = 1; //to prevent bounding rect, calling another a zoom event and running through the function a second time		
	}

	count = layer.GetShapeCount();

	/*if (count <= 1)
	{
	  vemap.SetZoomLevel(11);
	}*/	

	//set legend scale
	if(points.length>0){
		setLegend(time1,time2,segments);
	}
}

function getDateName(num){
	var allMonths = new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
	return allMonths[num];
}

function getHoursAmPm(hrs){
	var timeArr = new Array(0,"am");
	if(hrs<1){
		timeArr[0] = 12;		
	} else if(hrs>11){
		timeArr[0] = hrs - 12;
		if(hrs==12){ timeArr[0] = hrs; }		
		timeArr[1] = "pm"
	} else {
		timeArr[0] = hrs;
	}
	return timeArr;
}

function battImg(lvl){
	if((lvl>=0)&&(lvl<20)){ return 'batt0.png'; }
	else if((lvl>=21)&&(lvl<40)){ return 'batt21.png'; }	
	else if((lvl>=41)&&(lvl<60)){ return 'batt41.png'; }	
	else if((lvl>=61)&&(lvl<80)){ return 'batt61.png'; }	
	else if(lvl>=81){ return 'batt81.png'; }
}

function sdopImg(lvl){
	if((lvl>0)&&(lvl<20)){ return 'sig1.png'; }
	else if((lvl>=20)&&(lvl<50)){ return 'sig2.png'; }	
	else if((lvl>=50)&&(lvl<90)){ return 'sig3.png'; }	
	else if((lvl>=90)&&(lvl<100)){ return 'sig4.png'; }	
	else { return 'signone.png'; }
}

function setLegend(time1,time2,segments){
	//	alert(time1 + ' ' + time2 + ' ' + segments);
	scaleextra = document.getElementById('scale_extra');
	
	if(time2 > 0){	
		var month=new Array(12);
		month[0]="Jan";
		month[1]="Feb";
		month[2]="Mar";
		month[3]="Apr";
		month[4]="May";
		month[5]="Jun";
		month[6]="Jul";
		month[7]="Aug";
		month[8]="Sep";
		month[9]="Oct";
		month[10]="Nov";
		month[11]="Dec";
		
		var latestd = new Date();
		latestd.setTime(time2*1000);
		
		if(document.getElementById('scale_latest')){
			scalelatest = document.getElementById('scale_latest');
			
			scalelatest.innerHTML = '<div><img width="13px" height="12px" src="images/0_sm.png" /><span style="color:#680d0d;font-weight:bold">' + month[latestd.getMonth()] + ' ' + latestd.getDate() + ', ' + latestd.getHours() + ':' + padNum(latestd.getMinutes()) + ':' + padNum(latestd.getSeconds()) + '</span></div>';
			
			for(i=7;i>0;i--){
				aSpan = document.getElementById('scale'+i);	
				if(i==7){ seg1 = 'up'; } else { seg1 = getTimeVal(segments*-(i-7)); }  //gets segment ranges
				seg2 = getTimeVal(segments*-(i-8));
				aSpan.innerHTML = '<div><img width="13px" height="12px" src="images/' + i + '_sm.png" /><strong>' + seg1 + '</strong> to <strong>' + seg2 + '</strong> *</div>';
			}
					
			scaleextra.innerHTML = '<br />&nbsp;* time from latest point';
		}
		
	} else { 	
		scalelatest = document.getElementById('scale_latest');
		scalelatest.innerHTML = '<div><img width="13px" height="12px" src="images/0_sm.png" /><strong>Latest points</strong></div>'; 
		
		for(i=7;i>0;i--){  // remove legend items
			aSpan = document.getElementById('scale'+i);	
			aSpan.innerHTML = '';
		}		
		scaleextra.innerHTML = '';
	}

}

function padNum(num){  //used to pad out the time display with 0's if needed
	if(num<10){ 
		return '0' + num; 
	} else { return num }
}

function getTimeVal(segments){
		if(segments<60){ //less than a minute
			return roundNumber(segments,1) + 'sec';
		} else if(segments<(60*60)){ //less than an hour
				return roundNumber((segments/60),1) + 'min';
		} else if(segments<(60*60*24)){  //less than a day
				return roundNumber((segments/60/60),1) + 'hrs';
		} else {  // days
				return roundNumber((segments/60/60/24),1) + 'days';
		}
}

function roundNumber(num, dec) {
	var result = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
	return result;
}

function checkage ( days, hours, mins )
{
	if ( days == 0 && hours == 0 && mins < 5 )
		return 1;
	
	if ( days == 0 && hours == 0 && ( mins >= 5 && mins < 15 ) )
		return 2;
		
	if ( days == 0 && hours == 0 && ( mins >= 15 && mins <= 59 ) )
		return 3;
		
	if ( days == 0 && ( hours >= 1 && (hours <= 5 && mins <= 59) ) )
		return 4;
		
	if ( days == 0 && ( hours >= 6 && (hours <= 23 && mins <= 59) ) )
		return 5;
		
	if ( days == 1 )
		return 6;
				
	if ( days >= 2 )
		return 7;	
}

function AddPushpin( lat, lng, pnttime, spd, age, layer )
{

}
	
function loadXMLDoc(url,zoompan)
{
//alert('a');
	var request = window.XMLHttpRequest ?
	new XMLHttpRequest() : new ActiveXObject("MSXML2.XMLHTTP.3.0");
	request.open("GET", url, true);
	request.setRequestHeader("Content-Type", "text/xml");

	request.onreadystatechange = function()
	{

		if (request.readyState == 4 && request.status == 200)
		{
			if (request.responseText)
			{				
				ProcessPoints(request.responseXML,zoompan);				
			}
		}
	};
	
	request.send(null);

}

//show a loading label
function ShowLoading()
{
//  alert('asdf');
  var el = document.createElement("div"); 
  el.setAttribute('id',"VELoading");
  //Now we should know the width and height of the VE map or else go and get it.
  var curr_width = 642;
  var curr_height = 483;
  el.style.top = ((curr_height - 25) / 2) + "px";
  el.style.left = ((curr_width - 105) / 2) + "px";
//  el.style.top = '650px';
//  el.style.left = '500px';
  el.style.border = "1px solid gray";
  el.style.font = "12px arial";
  el.style.background = "White";
  el.style.padding = "2px";
  el.style.verticalAlign = "middle";
  el.innerHTML = "<img src='images/spinner.gif' /> Please Wait. Loading data....";  
  vemap.AddControl(el);
}

//remove loading label
function HideLoading()
{
  var el = document.getElementById("VELoading");
  el.parentNode.removeChild(el);
}


function UpdatePoints (tl,br,zoompan)
{
	
	tl = tl || 0;  //sets default if not passed
	br = br || 0;	
	zoompan = zoompan || 0;
	//alert(tl+' - '+br);

	//put up a loading label
//  	ShowLoading();
	
	var from = document.getElementById("from");
	var to = document.getElementById("to");
	var starttime = document.getElementById("starttime");
	var toval = '';
	
	if(starttime.value==to.value){  //means that the most recent is wanted ('to' is not necessarily getting the latest without this)
		toval = 'mostrecent';
	} else { toval = to.value; }
	
//	var phones = document.getElementById("phones");
	if(document.getElementById("latest")){
		var latestonly = document.getElementById("latest");
		var lonly = latestonly.checked;
	} else {
		var lonly = '0';
	}

//for(i=0;i<phones.length;i++){ alert(phones[i].value); }
	var phones = '';
	if(document.getElementById("phoneform")){ 
		var phoneform = document.getElementById("phoneform");
		for (var i = 0; i < phoneform.elements.length; i++ ) {
			 if (phoneform.elements[i].type == 'checkbox') {
				 if ((phoneform.elements[i].checked == true)&&(phoneform.elements[i].id != 'latest')) {
					 phones += phoneform.elements[i].value + ',';
//				 	GetLocationPins( from.value, to.value, latestonly.checked, phones);
				 }
			 }
		}	
		var showdemo = 0;
	} else { //show/ page
		phones = document.getElementById("sp_phid").value;
		var showdemo = 1;
		if(document.getElementById("ptype")){ 
			if(document.getElementById("ptype").value == "ll"){
				showdemo = 2;
				
			}
		}
	}
	//var phones = 12341423; 
	
	GetLocationPins( from.value, toval, lonly, phones, tl, br, zoompan, showdemo);
//	HideLoading();
	
}

function openpopup(url) 
{
var oNewWin = window.open(
	url, 
	'geopop',
	'width=480,height=320,toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=1,resizable=0').scrollTo(0, 256);
oNewWin.focus();
}

