// Copyright 2009 by Peter Johnson. All rights reserved.

var isie = false;
var datetime_format = '%j/%m/%Y %H:%i';
var cal_obj2 = null;
var text_field = null;
var XMLPath = "XMLRequest.asp?cmd=";
var ColsChanged = false;
var LoadInProgress = false;

var QueryIDs = new Array();
var DataColumn = new Array();
var ColumnNames = new Array();
var ColumnVisible = new Array();
var ColumnRequired = new Array();

var UserCode;
var SessionID;
var XMLParams;

var map, showMap, layerMapnik, layerLine, layerLabels, layerMarkers, layerDraw, SelectedAsset;
var last_plot_asset_ID, plot_point_count, plot_line_count, stoppedIcon, currentNumberIcon, isStopped;
var panelControls, toolbar;
var markerIcons = new Array();
var linePoints = new Array();
var positionList = new Array();
var MaxNumberIcons = 500;
var numberIcons = new Array();

function js_init() {
	var fullURL = parent.document.URL;
	if (fullURL.indexOf('?') == -1)
		UserCode = "";
	else {
		UserCode = fullURL.substring(fullURL.indexOf('?')+10, fullURL.length);
		if (UserCode.indexOf('&') != -1)
			UserCode = UserCode.substring(0, UserCode.indexOf('&'));
	}
	if (fullURL.indexOf('&') == -1)
		SessionID = "";
	else {
		SessionID = fullURL.substring(fullURL.indexOf('&')+11, fullURL.length);
		if (SessionID.indexOf('&') != -1)
			SessionID = SessionID.substring(0, SessionID.indexOf('&'));
	}
	XMLParams = "&param1=" + UserCode + "&param2=" + SessionID;
	if (window.ActiveXObject)
		isie = true; 
	showMap = (fullURL.indexOf('&HideMap=1') == -1);
	var cal = new RichCalendar();
	var now = new Date();
        now.setHours(0);
        now.setMinutes(0);
        now.setSeconds(0);
        now.setMilliseconds(0);
	now.setDate(now.getDate() - 365 * 2); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	document.getElementById("start_date").value = cal.get_formatted_date(datetime_format, now);
	now.setDate(now.getDate() + 366); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	document.getElementById("finish_date").value = cal.get_formatted_date(datetime_format, now);
	cal = null;
	includeHeader();
	if (showMap) {
		map_init();
		window_resized();
		show_geofences_clicked();
	} else {
//		document.getElementById("page-header").innerHTML = document.getElementById("page-header").innerHTML.replace("TFNavigator", "TF History")
		document.getElementById("map").style.display = "none";
		document.getElementById("display-area").style.display = "none";
	}
	verify_login();
	load_assets();
	load_queries();
	load_messages();
}

function padLeft(s, n) {
	s = s.toString();
	while (s.length < n)
		s = "0" + s;
	return s;
}

function formatSQLDate(date) {
	var yyyy, mm, dd, hh, nn, ss;

	yyyy = padLeft(date.getFullYear(), 4);
	mm = padLeft(date.getMonth() + 1, 2);
	dd = padLeft(date.getDate(), 2);
	hh = padLeft(date.getHours(), 2);
	nn = padLeft(date.getMinutes(), 2);
	ss = padLeft(date.getSeconds(), 2);
	return yyyy + "-" + mm + "-" + dd + " " + hh + ":" + nn + ":" + ss;
}

function verify_login()
{
	if ((UserCode.length == 0) || (SessionID.length == 0))
		login_failed();
	else {
		var xmlhttp = open_xmlhttp();
		if (xmlhttp) {
			xmlhttp.open("GET", XMLPath + "VerifyLoginDetails" + XMLParams, true);
			xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
			xmlhttp.onreadystatechange = function() {
				if(xmlhttp.readyState == 4) {
						if (xmlhttp.status == 200)
							verify_login_handler(xmlhttp);
						else
							show_message("Error verifying login details, error code: " + xmlhttp.status);
				}
			}
			xmlhttp.send(null);
		}
	}
}

function verify_login_handler(xmlhttp)
{
	var entries = xmlhttp.responseXML.getElementsByTagName("entry");
	var matchCount;
	if(isie)
		matchCount = entries[0].childNodes[0].text;
	else
		matchCount = entries[0].childNodes[0].textContent;
	if (matchCount != 1)
		login_failed();
}

function login_failed()
{
	window.location = "gps_tracking_login.asp";
}

function load_data()
{
	var OK = false;

	LoadInProgress = true;

	show_message("");
	var history_table = document.getElementById("history_table");
	while (history_table.rows.length > 1)
		history_table.deleteRow(1);

	if (ColsChanged)
	{
		var Headings = history_table.tHead.rows[0];
		while (Headings.cells.length > 0)
			Headings.deleteCell(0);
		add_history_column("ID");
		for (var Col=0; Col < ColumnVisible.length; Col++) {
			if (DataColumn[Col] && ColumnVisible[Col])
				add_history_column(ColumnNames[Col]);
		}
		ColsChanged = false;	
	}

	var xmlhttp = open_xmlhttp();

	if (xmlhttp) {
		var QueryList = "";
		for (var Col=0; Col < ColumnVisible.length; Col++) {
			if ((ColumnVisible[Col]) || (ColumnRequired[Col])) {
				if (QueryList.length > 0)
					QueryList = QueryList + ",";
				QueryList = QueryList + QueryIDs[Col];
			}
		}
		var cal = new RichCalendar();
		var StartDate = new Date();
		var FinishDate = new Date();
		cal.parse_date(document.getElementById("start_date").value, datetime_format);
		StartDate = cal.date;
		cal.parse_date(document.getElementById("finish_date").value, datetime_format);
		FinishDate = cal.date;
		SelectedAsset = document.getElementById("assets").value;
		if (SelectedAsset == "*")
			SelectedAsset = "";
		var SortBy = document.getElementById("sort_by").value;
		var QueryParams = 
			"&param3=" + formatSQLDate(StartDate) +
			"&param4=" + formatSQLDate(FinishDate) +
			"&param5=0" +
			"&param6=" + SelectedAsset +
			"&param7=LocalTime " + SortBy +
			"&param8=" + QueryList +
			"&ms=" + new Date().getTime();
		xmlhttp.open("GET", XMLPath + "GetGPSData" + XMLParams + QueryParams, true);
		xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
		xmlhttp.onreadystatechange = function() {
			if(xmlhttp.readyState == 4) {
					if (xmlhttp.status == 200) {
						OK = true;
						load_data_handler(xmlhttp);
					} else
						show_message("Error loading query details, error code: " + xmlhttp.status);
					document.getElementById("loading").style.display = "none";
					LoadInProgress = false;
			} else
				document.getElementById("loading").style.display = "block";
		}
		xmlhttp.send(null);
	}
	return OK;
}

function load_data_handler(xmlhttp)
{
	var entries = xmlhttp.responseXML.getElementsByTagName("entry");
	var history_table = document.getElementById("history_table");

	var currentDate = new Date();
	currentNumberIcon = 0;
	if (showMap)
		plot_begin();
	for (var i=0; i < entries.length; i++) {
		if (showMap)
			plot_data(entries[i]);
		var lastRow = history_table.rows.length;
		var row = history_table.insertRow(lastRow);
		time = entries[i].getElementsByTagName("LocalTime")[0].firstChild.nodeValue;
		var cal = new RichCalendar();
		var receiveTime = new Date();
		cal.parse_date(time, datetime_format);
		receiveTime = cal.date;
		var hoursSinceReceive = (currentDate.valueOf() - receiveTime.valueOf()) / 1000 / 60 / 60;
//		if (hoursSinceReceive >= 24)
//			row.className = "RowRed";
//		else if (i % 2)
		if (i % 2)
			row.className = "RowOdd";
		else
			row.className = "RowEven";
		var CellNo = 0;
		var EntryNo = 0;

		var ColData;
		if (!showMap) {
			currentNumberIcon++;
			ColData = currentNumberIcon;
		} else if (isStopped)
			ColData = currentNumberIcon;
		else
			ColData = "-";
		var cellLeft = row.insertCell(CellNo++);
		var textNode = document.createTextNode(ColData);
		cellLeft.appendChild(textNode);
		cellLeft.id = "r" + padLeft(i, 4) + "id";

		for (var Col=0; Col < DataColumn.length; Col++) {
			if (DataColumn[Col]) {
				if (ColumnVisible[Col]) {
					if(isie)
						ColData = entries[i].childNodes[EntryNo].text;
					else
						var ColData = entries[i].childNodes[EntryNo].textContent;
					var cellLeft = row.insertCell(CellNo);
					var textNode = document.createTextNode(ColData);
					cellLeft.appendChild(textNode);
					cellLeft.id = "r" + padLeft(i, 4) + "c" + Col;
					if (CellNo == 1) {
						cellLeft.onclick = function (e)
						{
							target = e?e.target:window.event?window.event.srcElement:null;
							if(target) data_click(target.id);
						}
						cellLeft.onmouseover = function (e)
						{
							this.style.cursor = 'pointer';
						}
						cellLeft.style.textDecoration = 'underline';
					}
					CellNo++;
					EntryNo++;
				} else if (ColumnRequired[Col])
					EntryNo++;
			}
		}
	}
	if (showMap)
		plot_end();
}

function load_messages()
{
	var messages_table = document.getElementById("messages_table");
	while (messages_table.rows.length > 1)
		messages_table.deleteRow(1);
	var xmlhttp = open_xmlhttp();
	if (xmlhttp) {
		xmlhttp.open("GET", "from_messages.asp?UserCode=" + UserCode + "&SessionID=" + SessionID, true);
		xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
		xmlhttp.onreadystatechange = function() {
			if(xmlhttp.readyState == 4) {
					if (xmlhttp.status == 200)
						load_messages_handler(xmlhttp);
					else
						show_message("Error loading messages, error code: " + xmlhttp.status);
			}
		}
		xmlhttp.send(null);
	}
}

function load_messages_handler(xmlhttp)
{
	var entries = xmlhttp.responseXML.getElementsByTagName("entry");
	var messages_table = document.getElementById("messages_table");
	for (var i=0; i < entries.length; i++) {
		var lastRow = messages_table.rows.length;
		var row = messages_table.insertRow(lastRow);
		if (i % 2)
			row.className = "RowOdd";
		else
			row.className = "RowEven";
		for (var Col=0; Col < entries[i].childNodes.length; Col++) {
			var ColData;
			if(isie)
				ColData = entries[i].childNodes[Col].text;
			else
				ColData = entries[i].childNodes[Col].textContent;
			var cellLeft = row.insertCell(Col);
			var textNode = document.createTextNode(ColData);
			cellLeft.appendChild(textNode);
			cellLeft.id = "r" + padLeft(i, 4) + "c" + Col;
		}
	}
	if (showMap)
		plot_end();
}

function data_click(id)
{
	var row = parseInt(id.substring(1,5), 10);
	map.setCenter (positionList[row], 15);
	scroll(0,0);
}

function load_queries()
{
	var OK = false;
	var xmlhttp = open_xmlhttp();

	if (xmlhttp) {
		xmlhttp.open("GET", XMLPath + "GetQueryDetails" + XMLParams + "&ms=" + new Date().getTime(), true);
		xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
		xmlhttp.onreadystatechange = function() {
			if(xmlhttp.readyState==4) {
					if (xmlhttp.status == 200) {
						OK = true;
						load_queries_handler(xmlhttp);
					} else
						show_message("Error loading query details, error code: " + xmlhttp.status);
			}
		}
		xmlhttp.send(null);
	}
	return OK;
}

function load_queries_handler(xmlhttp)
{
	var entries = xmlhttp.responseXML.getElementsByTagName("entry");
	var columns = document.getElementById("columns");
	var exclusions = document.getElementById("exclusions");
	var inclusions = document.getElementById("inclusions");
	var columnCount = 0;
	var includeCount = 0;
	var excludeCount = 0;

	add_history_column("ID");
	for (var i=0; i<entries.length; i++) {
		var QueryID = entries[i].getElementsByTagName("QueryID")[0].firstChild.nodeValue;
		var QueryType = entries[i].getElementsByTagName("QueryType")[0].firstChild.nodeValue;
		var SortSequence = entries[i].getElementsByTagName("SortSequence")[0].firstChild.nodeValue;
		var DisplayName = entries[i].getElementsByTagName("DisplayName")[0].firstChild.nodeValue;
		var Enabled = entries[i].getElementsByTagName("Enabled")[0].firstChild.nodeValue;
		var isEnabled = (Enabled == 'True');
		if (QueryType == "A") {
			add_column(QueryID, true, DisplayName, isEnabled, true);
			if (isEnabled)
				add_history_column(DisplayName);
		} else if (QueryType == "C") {
			add_column(QueryID, true, DisplayName, isEnabled, false);
			add_checkbox(columns, QueryID, DisplayName, isEnabled, true);
			if (isEnabled)
				add_history_column(DisplayName);
			columnCount++;
		} else if (QueryType == "E") {
			add_column(QueryID, false, DisplayName, isEnabled, false);
			add_checkbox(exclusions, QueryID, DisplayName, isEnabled, false);
			excludeCount++;
		} else if (QueryType == "I") {
			add_column(QueryID, false, DisplayName, isEnabled, false);
			add_checkbox(inclusions, QueryID, DisplayName, isEnabled, false);
			includeCount++;
		}
	}
	document.getElementById("columns-area").style.display = (columnCount == 0) ? "none" : "block";
	document.getElementById("exclusions-area").style.display = (excludeCount == 0) ? "none" : "block";
	document.getElementById("inclusions-area").style.display = (includeCount == 0) ? "none" : "block";
	load_data();
}

function add_checkbox(parent, QueryID, DisplayName, isEnabled, needsUpdate)
{
	var checkbox = document.createElement('input');
	checkbox.type = 'checkbox';
	checkbox.name = 'col' + QueryID;
	checkbox.id = checkbox.name;			
	checkbox.defaultChecked = isEnabled;
	checkbox.value = 1;
	checkbox.onclick = function() {
		column_click(this.name, this.checked, needsUpdate); 
	};
	var new_item = document.createElement("li");
	new_item.appendChild(checkbox);			
	var label = document.createElement('label');
	label.htmlFor = checkbox.name;
	label.appendChild(document.createTextNode(DisplayName));
	new_item.appendChild(label);
	parent.appendChild(new_item);
}

function add_column(QueryID, isData, ColumnName, Enabled, Required)
{
	QueryIDs.push(QueryID);
	DataColumn.push(isData);
	ColumnNames.push(ColumnName);
	ColumnVisible.push(Enabled);
	ColumnRequired.push(Required);
}

function column_click(colname, colchecked, needsUpdate)
{
	var i = 0;
	var QueryID = colname.substring(3, colname.length);
	while ((i < QueryIDs.length) && (QueryIDs[i] != QueryID))
		i++;
	if (i < QueryIDs.length)
		ColumnVisible[i] = colchecked;
	ColsChanged = needsUpdate;
}

function add_history_column(DisplayName)
{
	var history_table = document.getElementById("history_table");

	var th = document.createElement('th');
	th.appendChild(document.createTextNode(DisplayName));
	history_table.tHead.rows[0].appendChild(th);

//for( var x = 0; x < history_table.tFoot.rows.length; x++ ) {
//  var y = document.createElement('td');
//  y.appendChild(document.createTextNode('Tfoot cell text'));
//  history_table.tFoot.rows[x].appendChild(y);
//}
}

function load_assets()
{
	var OK = false;
	var xmlhttp = open_xmlhttp();

	if (xmlhttp) {
		xmlhttp.open("GET", XMLPath + "GetAssetDetails" + XMLParams + "&ms=" + new Date().getTime(), true);
		xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
		xmlhttp.onreadystatechange = function() {
			if(xmlhttp.readyState==4) {
					if(xmlhttp.status == 200) {
						OK = true;
						load_assets_handler(xmlhttp);
					} else
						show_message("Error loading asset list, error code: " + xmlhttp.status);
			}
		}
		xmlhttp.send(null);
	}
	return OK;
}

function load_assets_handler(xmlhttp)
{
	var entries = xmlhttp.responseXML.getElementsByTagName("entry");
	var assets = document.getElementById("assets");

//	assets.options.length = 1;
	assets.options.length = 0;
	for (var i=0; i<entries.length; i++) {		
		var AssetID = entries[i].getElementsByTagName("AssetID")[0].firstChild.nodeValue;
		var Description = entries[i].getElementsByTagName("Description")[0].firstChild.nodeValue;
		new_option = document.createElement("option");
		new_option.value = AssetID;
		new_option.appendChild(document.createTextNode(Description));
		assets.appendChild(new_option);
	}
}

function show_message(msg)
{
	document.getElementById("page-footer").innerHTML = msg;
}

function open_xmlhttp(xmlhttp)
{
	/*@cc_on @*/
	/*@if (@_jscript_version >= 5)
	// JScript gives us Conditional compilation, we can cope with old IE versions.
	// and security blocked creation of the objects.
	try {
		xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
	} catch (e) {
		try {
			xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (E) {
			xmlhttp = false;
		}
	}
	@end @*/

	if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
		try {
			xmlhttp = new XMLHttpRequest();
		} catch (e) {
			xmlhttp=false;
		}
	}

	if (!xmlhttp && window.createRequest) {
		try {
			xmlhttp = window.createRequest();
		} catch (e) {
			xmlhttp=false;
		}
	}
	if (!xmlhttp)
		show_message("Error opening XML HTTP object");
	return xmlhttp;
}

function show_cal(el, control_name) {
	document.getElementById('page-main').style.display ='none';
	if (cal_obj2) return;
	text_field = document.getElementById(control_name);
	cal_obj2 = new RichCalendar();
	cal_obj2.start_week_day = 1;
	cal_obj2.show_time = true;
	cal_obj2.user_onchange_handler = cal2_on_change;
	cal_obj2.user_onclose_handler = cal2_on_close;
	cal_obj2.user_onautoclose_handler = cal2_on_autoclose;
	cal_obj2.parse_date(text_field.value, datetime_format);
	cal_obj2.show_at_element(text_field, "right-bottom");
}

function cal2_on_change(cal, object_code) {
	if (object_code == 'day') {
		text_field.value = cal.get_formatted_date(datetime_format);
		cal2_on_close(cal);
	}
}

function cal2_on_close(cal) {
	cal.hide();
	cal2_on_autoclose(cal);
}

function cal2_on_autoclose(cal) {
	document.getElementById('page-main').style.display ='block';
	cal_obj2 = null;
}

function map_init() {
	map = new OpenLayers.Map ("map", {
		theme: 'Mapping.css',
		controls:[
			new OpenLayers.Control.Navigation({zoomWheelEnabled : false}),
			new OpenLayers.Control.ScaleLine(),
			new OpenLayers.Control.PanZoomBar(),
			new OpenLayers.Control.LayerSwitcher(),
			new OpenLayers.Control.MousePosition(),
			new OpenLayers.Control.Attribution()],
		maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
		maxResolution: 156543.0399,
		numZoomLevels: 19,
		units: 'm',
		projection: new OpenLayers.Projection("EPSG:900913"),
		displayProjection: new OpenLayers.Projection("EPSG:4326")
	} );

	layerMapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik");
	layerMarkers = new OpenLayers.Layer.Markers("Markers");
	layerLine = new OpenLayers.Layer.Vector("Lines");
	layerLabels = new OpenLayers.Layer.Vector("Labels", {
		styleMap: new OpenLayers.StyleMap({'default':{
			label : "${Label}",
			labelAlign: "br",
			fontColor: "black",
			fontSize: "12px",
			fontFamily: "Arial"
                }})
            });
	layerDraw = new OpenLayers.Layer.Vector("Geofences",  {
		styleMap: new OpenLayers.StyleMap({'default':{
			label : "${Name}",
			strokeColor: "#00FF00",
			strokeOpacity: 1,
			strokeWidth: 3,
			fillColor: "#FF5500",
			fillOpacity: 0.5,
			pointRadius: 6,
			fontSize: "12px"
                }})
            });
	map.addLayers([layerMapnik, layerMarkers, layerLine, layerLabels, layerDraw]);
	map.zoomToMaxExtent();

	var size = new OpenLayers.Size(21,25);
	var offset = new OpenLayers.Pixel(-(size.w/2), -size.h);
	stoppedIcon = new OpenLayers.Icon("images/stopped.png",size,offset);
	for (var i=0; i < 360; i += 15) {
		var markerIcon = new OpenLayers.Icon("images/arrow" + i + ".png",size,offset);
		markerIcons.push(markerIcon);
	}
	var size = new OpenLayers.Size(32,32);
	var offset = new OpenLayers.Pixel(-(size.w/2), -size.h);
	for (var i=1; i <= MaxNumberIcons; i++) {
		var numberIcon = new OpenLayers.Icon("images/p" + i + ".png",size,offset);
		numberIcons.push(numberIcon);
	}

	panelControls = [
		new OpenLayers.Control.Navigation({title: "Pan map", zoomWheelEnabled : false}),
		new OpenLayers.Control.SelectFeature(layerDraw, {title: "Delete geofence", cursorClass: 'crossHair', 'onSelect': polygonDeleted}),
		new OpenLayers.Control.DrawFeature(layerDraw, OpenLayers.Handler.Polygon, {'featureAdded': polygonAdded, title: "Draw geofence", cursorClass: 'crossHair', 'displayClass': 'olControlDrawFeaturePolygon'})
	];
	toolbar = new OpenLayers.Control.Panel({
		displayClass: 'olControlEditingToolbar',
		defaultControl: panelControls[0]
	});
	toolbar.addControls(panelControls);
	map.addControl(toolbar);
}

var newPolyObj;

function polygonAdded(obj)
{
	newPolyObj = obj;
	ae_prompt(geofence_name_callback, "Please enter name for geofence", "");
}

function geofence_name_callback(name)
{
	if (name != null && name != "")
	{
		var verts = newPolyObj.geometry.getVertices(); 
		var updateParams =  XMLParams + "&param3=-1&param4=" + name + "&param5=" + verts.length;
		var paramNo = 6;
		for (var i=0; i < verts.length; i++)
		{
			var lonLat = new OpenLayers.LonLat(verts[i].x, verts[i].y).transform(map.getProjectionObject(), new OpenLayers.Projection("EPSG:4326"));
			updateParams += "&param" + paramNo++ + "=" + lonLat.lat;
			updateParams += "&param" + paramNo++ + "=" + lonLat.lon;
		}
		updateParams += "&ms=" + new Date().getTime();
		show_message("");
		var xmlhttp = open_xmlhttp();
		if (xmlhttp) {
			xmlhttp.open("GET", XMLPath + "SetGeofences" + updateParams, true);
			xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
			xmlhttp.onreadystatechange = function() {
				if(xmlhttp.readyState==4) {
					if (xmlhttp.status == 200)
						save_geofences_handler(xmlhttp);
					else
						show_message("Error save geofence, error code: " + xmlhttp.status);
				}
			}
			xmlhttp.send(null);
		}
	}
}

function polygonDeleted(obj)
{
	var updateParams =  XMLParams + "&param3=" + obj.attributes.wpNo + "&param4=name&param5=0";
	updateParams += "&ms=" + new Date().getTime();
	show_message("");
	var xmlhttp = open_xmlhttp();
	if (xmlhttp) {
		xmlhttp.open("GET", XMLPath + "SetGeofences" + updateParams, true);
		xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
		xmlhttp.onreadystatechange = function() {
			if(xmlhttp.readyState==4) {
				if (xmlhttp.status == 200)
					save_geofences_handler(xmlhttp);
				else
					show_message("Error deleting geofence, error code: " + xmlhttp.status);
			}
		}
		xmlhttp.send(null);
	}
}

function save_geofences_handler(xmlhttp)
{
	load_geofences();
}

function load_geofences()
{
	var xmlhttp = open_xmlhttp();

	show_message("");
	layerDraw.destroyFeatures();
	if (xmlhttp) {
		xmlhttp.open("GET", XMLPath + "GetGeofences" + XMLParams + "&ms=" + new Date().getTime(), true);
		xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
		xmlhttp.onreadystatechange = function() {
			if(xmlhttp.readyState==4) {
					if (xmlhttp.status == 200)
						load_geofences_handler(xmlhttp);
					else
						show_message("Error loading geofences, error code: " + xmlhttp.status);
			}
		}
		xmlhttp.send(null);
	}
}

function load_geofences_handler(xmlhttp)
{
	var entries = xmlhttp.responseXML.getElementsByTagName("entry");

	for (var i=0; i < entries.length; i++) {
		var waypointNo = entries[i].getElementsByTagName("WaypointNo")[0].firstChild.nodeValue;
		var waypointName = entries[i].getElementsByTagName("WaypointName")[0].firstChild.nodeValue;
		var points = entries[i].getElementsByTagName("Points")[0].firstChild.nodeValue;
		var pointList = [];
		for (var j=1; j <= points; j++)
		{
			var lat = entries[i].getElementsByTagName("Lat" + j)[0].firstChild.nodeValue;
			var lon = entries[i].getElementsByTagName("Lon" + j)[0].firstChild.nodeValue;
			var newPoint = new OpenLayers.Geometry.Point(lon, lat);
			pointList.push(newPoint);
		}
		var linearRing = new OpenLayers.Geometry.LinearRing(pointList);
		linearRing.transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject());
		var polygonFeature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Polygon([linearRing]));
		polygonFeature.attributes = { Name: waypointName, wpNo: waypointNo };
		layerDraw.addFeatures([polygonFeature]);
	}
	if (entries.length)
		map.zoomToExtent(layerDraw.getDataExtent());
}

var style_green =
{
	strokeColor: "#0000FF",
	strokeOpacity: 0.7,
	strokeWidth: 2
};

function plot_begin() {
	linePoints = [];
	positionList = [];
	layerMarkers.clearMarkers();
	layerLine.destroyFeatures();
	layerLabels.destroyFeatures();
	last_plot_asset_ID = "";
	plot_point_count = 0;
	plot_line_count = 0;
	currentNumberIcon = 0;
}

function plot_data(entry) {
	var heading, speed, asset_ID, lat, lon, time, imageName;
	try {
		asset_ID = entry.getElementsByTagName("AssetID")[0].firstChild.nodeValue;
		lat = entry.getElementsByTagName("Latitude")[0].firstChild.nodeValue;
		lon = entry.getElementsByTagName("Longitude")[0].firstChild.nodeValue;
		time = entry.getElementsByTagName("LocalTime")[0].firstChild.nodeValue;
	} catch(ex) {
		show_message("Warning - not all data could be plotted");
		return;
	}
	try {
		imageName = entry.getElementsByTagName("ImageName")[0].firstChild.nodeValue;
	} catch(ex) {
		imageName = "";
	}
	try {
		heading = entry.getElementsByTagName("Heading")[0].firstChild.nodeValue;
	} catch(ex) {
		heading = 0;
	}
	try {
		speed = entry.getElementsByTagName("Speed")[0].firstChild.nodeValue;
	} catch(ex) {
		speed = 0;
	}

	var selectedAsset = document.getElementById("assets").value;
	var show_all_times = document.getElementById("show_all_times").checked;
	var lonLat = new OpenLayers.LonLat(lon, lat).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject());
	positionList.push(lonLat);
	plot_point_count++;

	if ((SelectedAsset == "") && (imageName.length > 0)) {
		var size = new OpenLayers.Size(35,15);
		var offset = new OpenLayers.Pixel(-(size.w/2), -size.h);
		var newIcon = new OpenLayers.Icon("images/" + imageName,size,offset);
		layerMarkers.addMarker(new OpenLayers.Marker(lonLat, newIcon.clone()));
		if (currentNumberIcon < MaxNumberIcons)
			currentNumberIcon++;
		isStopped = true;
	} else if (parseFloat(speed) < 5)
	{
		if (currentNumberIcon < MaxNumberIcons)
			currentNumberIcon++;
		layerMarkers.addMarker(new OpenLayers.Marker(lonLat,numberIcons[currentNumberIcon - 1].clone()));
		isStopped = true;
	} else {
		arrowNo = Math.round(((7.5 + parseFloat(heading)) % 360.0) / 15);
		if (arrowNo > 23)
			arrowNo = 23;
		layerMarkers.addMarker(new OpenLayers.Marker(lonLat,markerIcons[arrowNo].clone()));
		isStopped = false;
	}

	var p1 = new OpenLayers.Geometry.Point(lonLat.lon, lonLat.lat);
	linePoints.push(p1);
	plot_line_count++;

	var newLabel;
	if (selectedAsset == "*")
		newLabel = asset_ID;
	else if (show_all_times)
		newLabel = time;
	else if (plot_line_count == 1)
		newLabel = time;
	else
		newLabel = "";

	var pointFeature = new OpenLayers.Feature.Vector(p1);
	pointFeature.attributes = {
		Label: newLabel
	};
	layerLabels.addFeatures([pointFeature]);

	if ((asset_ID != last_plot_asset_ID) && (last_plot_asset_ID.length > 0))
	{
		if (plot_line_count > 1)
			plot_end();
		linePoints = [];
		plot_line_count = 0;
	}
	last_plot_asset_ID = asset_ID;
}

function plot_end() {
	if (linePoints.length > 0) {
		var lineString = new OpenLayers.Geometry.LineString(linePoints);
		var lineFeature = new OpenLayers.Feature.Vector(lineString, null, style_green);
		layerLine.addFeatures([lineFeature]);
	}
	if (plot_point_count > 0)
		map.zoomToExtent(layerMarkers.getDataExtent());
}

function window_resized() {
	var myWidth = 0, myHeight = 0;

	if( typeof( window.innerWidth ) == 'number' ) { 
		// Non-IE
		myWidth = window.innerWidth;
		myHeight = window.innerHeight;
	} else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
		//IE 6+ in 'standards compliant mode'
		myWidth = document.documentElement.clientWidth;
		myHeight = document.documentElement.clientHeight;
	} else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
		//IE 4 compatible
		myWidth = document.body.clientWidth;
		myHeight = document.body.clientHeight;
	}
	myWidth -= 220;
	myHeight -= myHeight / 4;
	document.getElementById("map").style.width = myWidth + "px";
	document.getElementById("map").style.height = myHeight + "px";
}

function show_geofences_clicked()
{
	if (document.getElementById("show_geofences").checked) {
		toolbar.activate();
		load_geofences();
	} else {
		toolbar.deactivate();
		layerDraw.destroyFeatures();
	}
}

function includeRequest(id, url) {
	var xmlhttp = open_xmlhttp();

	if (xmlhttp) {
		var element = document.getElementById(id);
		if (element) {
			xmlhttp.open('GET', url, false);
			xmlhttp.send(null);
			try {
				element.innerHTML = xmlhttp.responseText;
			} catch (e) {
			}
		}
	}
}

function includeHeader() {
//	includeRequest("page-header", "menu.asp?UserCode=" + UserCode + "&SessionID=" + SessionID);
}

// ae_prompt_code

var ae_cb = null;

function ae$(a) { return document.getElementById(a); }

function ae_prompt(cb, q, a) {
	ae_cb = cb;
	ae$('aep_t').innerHTML = document.domain + ' question:';
	ae$('aep_prompt').innerHTML = q;
	ae$('aep_text').value = a;
	ae$('aep_ovrl').style.display = ae$('aep_ww').style.display = '';
	ae$('aep_text').focus();
	ae$('aep_text').select();
}
 
function ae_clk(m) {
	ae$('aep_ovrl').style.display = ae$('aep_ww').style.display = 'none';
	if (!m)  
		ae_cb(null);  // user pressed cancel, call callback with null
	else
		ae_cb(ae$('aep_text').value); // user pressed OK 
}

// end ae_prompt_code

