﻿//Product definitions [Abr, Name, Link]
var productCodes = new Object;
productCodes['ALT'] = new Array("ALT","AlarmTrack","http://www.progressivesolutions.com/products/AlarmTrack/Default.aspx");
productCodes['BLD'] = new Array("BLD","BuildingTrack","http://www.progressivesolutions.com/products/BuildingTrack/Default.aspx");
productCodes['BLW'] = new Array("BLW","BL Web Renewals","");
productCodes['BLL'] = new Array("BLL","BL Lookups","");
productCodes['CAC'] = new Array("CAC","CashierCentral","http://www.progressivesolutions.com/products/CashierCentral/Default.aspx");
productCodes['CDT'] = new Array("CDT","CodeTrack","");
productCodes['CIM'] = new Array("CIM","Check Imaging","");
productCodes['ITM'] = new Array("ITM","Internet Tax Management","");
productCodes['LIC'] = new Array("LIC","LicenseTrack","http://www.progressivesolutions.com/products/LicenseTrack/Default.aspx");
productCodes['MEM'] = new Array("MEM","MemberTrack","");
productCodes['ONE'] = new Array("ONE","OneStop","http://www.progressivesolutions.com/products/PaymentProcessing/Default.aspx");
productCodes['PAR'] = new Array("PAR","ParkingTrack","http://www.progressivesolutions.com/products/ParkingTrack/Default.aspx");
productCodes['PER'] = new Array("PER","PermitTrack","");
productCodes['PET'] = new Array("PET","PetTrack","http://www.progressivesolutions.com/products/PetTrack/Default.aspx");
productCodes['PRC'] = new Array("PRC","ParcelTrack","");
productCodes['RVE'] = new Array("RVE","RevenueTrack","http://www.progressivesolutions.com/products/RevenueTrack/Default.aspx");
productCodes['RVT'] = new Array("RVT","RevenueTrack","");
productCodes['TIC'] = new Array("TIC","TicketTrack","");
productCodes['TMO'] = new Array("TMO","Tax Management","");
productCodes['TOW'] = new Array("TOW","TowTrack","");
productCodes['UTE'] = new Array("UTE","UtilityExplorer","http://www.progressivesolutions.com/products/UtilityExplorer/Default.aspx");
productCodes['WWW'] = new Array("WWW","WWWorkFlow","");

//Global variables
var map;
var coordinates = new Object;   //GLatLng
var cityNames = new Object;     //String
var populations = new Object;   //String
var products = new Object;      //nodeList
var xmlLength;                  //integer

var handlers = new Object;    //Stores objects with bound events
var delay;

function initializeMap() {
//Initialize gMap
    map = new GMap2(document.getElementById("googleMap"));
    map.addControl(new GSmallMapControl());
	map.setCenter(new GLatLng(40.524660,-93.867187), 3);

    //Controller function calls
    //__calls are not treated sequential
    getXmlData();
}

function getXmlData() {
//This function uses the gMap GDownloadUrl() to fetch
//psi.xml for parsing.  The file must come from the same
//domain as this javascript file.

    GDownloadUrl("../res/psi.xml", function (data, responseCode) {
		parseXml(data);
	});
}

function parseXml(data, responseCode) {
    var xml = GXml.parse(data);
    xmlLength = xml.documentElement.getElementsByTagName("address").length;
    
//Pull elements from Xml object
    //For combining coordinates into GLatLng objects plottable by gMap
    var latitudes = xml.documentElement.getElementsByTagName("latitude");
	var longitudes = xml.documentElement.getElementsByTagName("longitude");
	for (var pd = 0; pd < xmlLength; pd++) {
	    coordinates[pd] = new GLatLng(latitudes.item(pd).firstChild.nodeValue, longitudes.item(pd).firstChild.nodeValue);
	    cityNames[pd] = xml.documentElement.getElementsByTagName("address").item(pd).firstChild.nodeValue;
	    populations[pd] = xml.documentElement.getElementsByTagName("Population").item(pd).firstChild.nodeValue;
	    products[pd] = xml.documentElement.getElementsByTagName("Products").item(pd);

    }

	//Add markers to gMap from data above
	addMarkers()
}

function addMarkers() {
    
    for (mr = 0; mr < xmlLength; mr++) {
        var htmlString = cityNames[mr] + '<img src="../images/spacer.png"><br /><i>(Population: ' + populations[mr] + ')</i><br />' + getProducts(mr);        
        map.addOverlay(createMarker(coordinates[mr], htmlString, mr));
    }
    renderCustomerList();
}

function getProducts(index) {
//Get nodelist of products per [index] from [products].
//Get each product code and map to product name via product code.
    var productsString = new String; //Accumulated list of products mapped from productCodes
    var codes = products[index];
    var codesLength = codes.getElementsByTagName("Product").length;
    var intermediate = new Array(codesLength);
     
    for (var cf = 0; cf < codesLength; cf++) {
        intermediate[cf] = codes.getElementsByTagName("Product").item(cf);
    }
    
    //Itterate through all product codes per city by index. 
    for (var pr = 0; pr < codesLength; pr++) {
        //Insert href?
        var sd35tf5 = intermediate[0].childNodes[0].nodeValue;
        if (productCodes[intermediate[pr].childNodes[0].nodeValue][2] != "") {
            
            productsString += '<a href=' + productCodes[intermediate[pr].childNodes[0].nodeValue][2] + '>';
        }
        //Append name
        productsString += productCodes[intermediate[pr].childNodes[0].nodeValue][1];
        //Close href
        if (productCodes[intermediate[pr].childNodes[0].nodeValue][2] != "") {
            productsString += '</a>';
        }
        //Add linebreak
        productsString += '<br />';        
    }   
    return productsString;
}




function renderCustomerList() {
    var htmlString = '<h2 style="text-indent: 0 !important">Our Customers:</h2><ul id="GMapCust_ul">'
    var div = document.getElementById("GMapCust");

    for (var rc = 0; rc < xmlLength; rc++) {
        htmlString += '<li><a class="map-link" href="javascript:sel(' + rc + ')">' + cityNames[rc] + ' <span>(pop ' + populations[rc] + ')</span></a>';
        //htmlString += '<li>' + cityNames[rc] + ' <span>(pop ' + populations[rc] + ')</span>' + ' <a href="javascript:sel(' + rc + ')">Map</a></li>';
    }
    
    htmlString += '</ul>';
    div.innerHTML = htmlString;
}

//Create GMarker given a GLatLng, an html string, and an index number
function createMarker(latlng, html, index) {
	var marker = new GMarker(latlng);
	GEvent.addListener(marker,"click", function () {
		map.openInfoWindowHtml(latlng, html);
	});
	handlers[index] = marker;
	return marker;
}

//Called from page. Opens InfoWindowHTML for requested index.
function sel(index) {
	GEvent.trigger(handlers[index], "click");
}