// Simplex Javascript

var gSearchType = null;
var xmlHttpReq = false;
var lastResults = null;
var sortColumn = 0;
var map;
var locArray;
var curLoc;
var markerList;

function getHandler(passed)
{
	if (xmlHttpReq.readyState == 4) 
	{
		processResults(xmlHttpReq.responseText)
	}
}

function xmlhttpGet(strURL) 
{
//	alert(strURL);

	try
	{
		// Firefox, Opera 8.0+, Safari
		xmlHttpReq=new XMLHttpRequest();
	}
	catch (e)
	{
		// Internet Explorer
		try
		{
			xmlHttpReq=new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (e)
		{
			try
			{
				xmlHttpReq=new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch (e)
			{
				alert("Your browser does not support AJAX!");
				return false;
			}
		}
	}

	xmlHttpReq.open('GET', strURL, true);
	xmlHttpReq.setRequestHeader('Content-Type', 'text/plain');
	xmlHttpReq.setRequestHeader('If-Modified-Since', new Date(0));	// Fix cache issue with IE
	xmlHttpReq.onreadystatechange = getHandler;
	xmlHttpReq.send(null);
}


//-------------------------------
// Put results into a select element
//-------------------------------
function resultsToSelectElement(selectId, results)
{
	var select = document.getElementById(selectId);
	
	if (select)
	{
		var list = results.split("\n");
		var options = select.options;
		var did = false;
		
		locArray = new Array();

		// Get rid of trailing null item
		if (list[list.length-1].length < 1)
			list.pop();
		select.length = 0;
		// Start with a blank option at the top
		options[options.length] = new Option("Select:", "");
		locArray.push("select");	// this is a dummy one
		for (var index = 0; index < list.length; index++)
		{
			var item = list[index];
			var itemArray = item.split("\t");
			options[options.length] = new Option(itemArray[0], itemArray[1]);
			locArray.push(itemArray);
		}
		select.disabled = false;
	}
}

//-------------------------------
// Update search list
//-------------------------------
function onSearchByType(searchType)
{
	xmlhttpGet("search.php?request="+searchType);
	gSearchType = searchType;
	// Disable auxiliary select element
	var select2 = document.getElementById("search_select2");
	select2.disabled = true;
	select2.length = 0;
}

//-------------------------------
// Init search list
//-------------------------------
function initSearchByType()
{
	if (!gSearchType)
		onSearchByType("loc_types");
}


//-------------------------------
// A search item was selected
//-------------------------------
function selectChanged()
{
	if (gSearchType == "loc_types" || gSearchType == "main_units" || gSearchType == "operators")
	{
		// Need to set up auxiliary menu
		var select = document.getElementById("search_select");
		var request;
		var direction = "";
		if (select.selectedIndex > 0)
		{
			if (gSearchType == "loc_types")
				request = "location_type";
			else if (gSearchType == "main_units")
				request = "main_unit_locations";
			else if (gSearchType == "operators")
			{
				request = "operator_locations";
				direction = isTransmitting() ? "&direction=tx" : "&direction=rcv";
			}
			xmlhttpGet("search.php?request="+request+"&id="+select.options[select.selectedIndex].value + direction);		
		}
	}
}

//-------------------------------
// Is it transmitting mode?
//-------------------------------
function isTransmitting()
{
	 return document.getElementById("transmit_mode").checked;
}

//-------------------------------
// Sort order functions
//-------------------------------
function sortStringResults(a, b)
{
	if (a[sortColumn] < b[sortColumn])
		return -1;
	if (a[sortColumn] > b[sortColumn])
		return 1;
	return 0;
}

function sortNumResults(a, b)
{
	return Number(a[sortColumn] - b[sortColumn]);
}

//-------------------------------
// Sort and insert display results
//-------------------------------
function insertResults()
{
	var table = document.getElementById("ResultsTable");
	
	if (table)
	{		
		var rows = table.rows;
		var row, rowIdx;
		var results = lastResults;

		var selected = findSelectedHeader();
		if (selected)
		{
			// Sort copy of last results
			results = lastResults.slice();
			sortColumn = selected.cellIndex;
			results.sort(selected.id=="txPower"||selected.id=="result" ? sortNumResults : sortStringResults);
		}
		
		// Delete all body rows
		for (row=rows.length-1; row>0; row--)
		table.deleteRow(row);

		// Add result rows
		rowIdx = 1
		for (var index in results)
		{			
			var itemArray = results[index];
			
			table.insertRow(rowIdx);
			
			row = rows[rowIdx];
			row.className = "off";
			row.onmouseover=function() 
			{
				this.className = 'on';
			}
			row.onmouseout=function() 
			{
				this.className = 'off';
			}
			row.onmousedown=function()
			{
				var location, mainUnit;
				if (isTransmitting())
				{
					location = this.cells[3].innerHTML;
					mainUnit = this.cells[2].innerHTML;
				}
				else
				{
					location = this.cells[1].innerHTML;
					mainUnit = null;
				}
				var marker = markerList[location];
				var html = markerInfo(location, mainUnit);
				marker.openInfoWindowHtml(html);
			}
			
			var itemLength = itemArray.length;
			for (cellIdx=0; cellIdx<itemLength-2; cellIdx++)
			{
				cell = row.insertCell(cellIdx);
				cell.innerHTML = itemArray[cellIdx];				
			}
			rowIdx++;
		}
	}
}


//-------------------------------
// Display search results
//-------------------------------
function displaySearchResults(results)
{
	var list = results.split("\n");
	
	// Get rid of trailing null item
	if (list[list.length-1].length < 1)
		list.pop();
	
	// Copy into lastResults
	lastResults = Array();
	for (var index in list)
	{			
		lastResults.push(list[index].split("\t"));
	}
	
	// Insert into results table
	insertResults();
	
	// Add markers to map
	addResultMarkers();
}
	
//-------------------------------
// Process results
//-------------------------------
function processResults(results)
{
	switch (xmlHttpReq.getResponseHeader("Request-type"))
	{
		case "main-type":
			resultsToSelectElement("search_select", results);
			break;
			
		case "aux-type":
			resultsToSelectElement("search_select2", results);
			break;
			
		case "search":
			displaySearchResults(results);
			break;
	}
}

//-------------------------------
// Perform the search
//-------------------------------
function DoSearch()
{
	var args = "";
	var select = document.getElementById("search_select");
	var select2 = document.getElementById("search_select2");
	
	switch (gSearchType)
	{
		case "loc_types":
		case "main_units":
			select = select2;
			args = "location="+select.value;
			break;
			
		case "locations":
			args = "location="+select.value;
			break;
			
		case "operators":
			if (!select.value || !select2.value)
			{
				alert("Please select an operator and location first");
				return;
			}
			args = "operator="+select.value+"&location="+select2.value;
			select = select2;
			break;
	}
	
	if (!select.value)
	{
		alert("Please select a location or operator first");
		return;
	}
	else
	{
		curLoc = locArray[select.selectedIndex];
	}
	
	if (!isTransmitting())
		// Reverse direction
		args += "&direction=receive";
	
	// Heard?
	var heard = document.getElementById("heard_select");
	if (heard.selectedIndex > 0)
		args += "&heard=" + heard.options[heard.selectedIndex].value;
	
	// Quality
	var qualityFrom = document.getElementById("quality_from_select");
	var qualityTo = document.getElementById("quality_to_select");
	if (qualityFrom.selectedIndex > 0 || qualityTo.selectedIndex > 0)
	{
		var from = qualityFrom.selectedIndex > 0 ? qualityFrom.options[qualityFrom.selectedIndex].value : 0;
		var to = qualityTo.selectedIndex > 0 ? qualityTo.options[qualityTo.selectedIndex].value : 5;
		args += "&quality=" + from + "-" + to;
	}
	
	// Power
	var powerFrom = document.getElementById("power_from");
	var powerTo = document.getElementById("power_to");
	if (powerFrom.value || powerTo.value)
	{
		var from = powerFrom.value ? powerFrom.value : 0;
		var to = powerTo.value ? powerTo.value : 10000;
		args += "&power=" + from + "-" + to;
	}
	
	// Antenna
	var antenna = document.getElementById("antenna_type");
	if (antenna.value)
	{
		args += "&antenna=" + antenna.value;
	}
	
	if (args)
		xmlhttpGet("search.php?request=search&"+args);
	
	clearMapMarkers();
}

function findSelectedHeader()
{
	var row = document.getElementById("ResultsHeaderRow");
	for (var index = 0; index < row.cells.length; index++)
	{
		cell = row.cells[index];
		if (cell.className == "ResultsHeaderSelected")
			return cell;
	}
	return null;
}

function clickHeader(id)
{
	me = document.getElementById(id);
	selected = findSelectedHeader();
	if (selected)
	{
		// Deselect
		selected.className = "ResultsHeader";
	}
	if (me != selected)
		me.className = "ResultsHeaderSelected";

	// Sort and insert results
	insertResults();
}


//-------------------------------
// Map functions
//-------------------------------

function clearMapMarkers()
{
	map.clearOverlays();
}

function addResultMarkers()
{	
	clearMapMarkers();
	markerList = new Array();
	
	// Reset map position and zoom level
	map.centerAndZoom(new GPoint(-116.984, 32.911), 7); // Center to see County

	// Add result markers
	if (curLoc[3])
		createMarker(curLoc[2], curLoc[3], curLoc[0], null, "source");

	// Remove duplicates. Use item with best signal quality
	var results = new Array();
	var locIdx = isTransmitting() ? 3 : 1;
		
	for (var index in lastResults)
	{
		var itemArray = lastResults[index];
		var location = itemArray[locIdx];
		var quality = itemArray[10];
		
		if (results[location] == undefined || quality > results[location][10])
		{
			results[location] = itemArray;
		}
	}

	for (var index in results)
	{			
		var itemArray = results[index];
		var lat = itemArray[itemArray.length-2];
		var long = itemArray[itemArray.length-1];
		var mainUnit = itemArray[2];
		var location = itemArray[locIdx];
		var quality = itemArray[10];
		
		markerList[location] = createMarker(lat, long, location, mainUnit, quality);
	}
}

function markerInfo(location, mainUnit)
{
	var html = "<div class=BodyText><b><u>Facility:</u></b> " + location;
	if (mainUnit)
		html += "<br><b>Main Unit:</b> " + mainUnit;
	return html + "</div>";
}

// Create a marker whose info window displays the given number.
function createMarker(lat, long, location, mainUnit, iconName) 
{
	var theIcon = new GIcon(G_DEFAULT_ICON);
	var docPath = document.URL;
	var iconPath = docPath.substr(0, docPath.lastIndexOf("/")) + "/icons/"+iconName+".png";

	theIcon.image = iconPath;
	theIcon.iconSize = new GSize(32, 32);
	//theIcon.shadow = ""
	var point = new GLatLng(lat, long);
	var marker = new GMarker(point, { title:location,  icon:theIcon, clickable:true });

	// Show this marker's index in the info window when it is clicked.
	var html = markerInfo(location, mainUnit);
	GEvent.addListener(marker, 'click', function() {
		marker.openInfoWindowHtml(html);
	});

	map.addOverlay(marker);
	return marker;
}
function initMap()
{
	// Creates a map and centers it on a convenient point

	if (GBrowserIsCompatible()) 
	{
        mapdiv = document.getElementById("map");
		map = new GMap(mapdiv);
		map.addControl(new GSmallMapControl());
		map.addControl(new GMapTypeControl());
		map.centerAndZoom(new GPoint(-116.984, 32.911), 7); // Center to see County
	}
	
}