﻿var once = false;
var req;
// current routeId, -1 if none
var routeId = -1;
// ListRoutes.aspx == 1, showRoute.spx == 2
var pageId  = 0;
var routexml; //store routexml locally for route coding by metadata
var metadatapoints;


RidInfo = function(routeType)
{
    this.routeType = routeType;
}

function alertonce( string ) {
    if( ! once ) {
       once= true;
       alert( string );
    }
}

function getPosition(obj)
{
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	return [curleft,curtop];
}

function sub( strReplaceAll, variable, value )
{
    //  return html.replaceAll( "$"+variable+"$", value );
    var match = "$" + variable + "$";
    var intIndexOfMatch = strReplaceAll.indexOf( match );

    while (intIndexOfMatch != -1){
        strReplaceAll = strReplaceAll.replace( match, value )
        intIndexOfMatch = strReplaceAll.indexOf( match );
    }
    return strReplaceAll;
}

function sortNumber(a,b)
{
    return a - b;
}

function curbOutliers(array)
{
    var myArray = copyArray(array);
    myArray = array;
    var mean;
    var sd;
    
    mean = calcMean(myArray);
    sd = calcSD(myArray,mean);

    var max = calcNewMax(myArray,mean,sd);
    
    for (var i = 0; i < myArray.length;i++)
    {
        if(myArray[i] > mean + (sd * 3))
        {
            //myArray.splice(i,1);
            myArray[i] = max;
        }
    }
    return myArray;    
}

function calcMean(array)
{
    var mean;
    var sum = 0;
    for (var i = 0; i < array.length;i++)
    {
        if(array[i] > 0)
        {
            sum += (+array[i]);
        }
    }
    mean = sum / array.length;
    return mean;
}

function calcNewMax(array_in,mean,sd)
{
    var array = copyArray(array_in);
    array = array.sort(sortNumber);
    var counter = array.length - 1;
    var max = array[array.length - 1];
    while (max > mean + (sd * 3))
    {
        counter = counter - 1;
        max = array[counter];
    }

    return max;
}

function calcSD(array,mean)
{
    var myArray = copyArray(array);
    var sumofsquares = 0;
    for (var i = 0; i < myArray.length;i++)
    {
        sumofsquares = sumofsquares + Math.pow(myArray[i] - mean,2);
    }
    var sd = Math.sqrt(sumofsquares/myArray.length)
    return(sd);        
}

function copyArray(array_in)
{
    var myArray = new Array();
    for (var i = 0; i < array_in.length;i++)
    {
        myArray.push(array_in[i])
    }
    return myArray;
}

function trim(string)
{
    string = trimLeft(string);
    string = trimRight(string);
    return string;
}
function trimLeft(string)
{
    while(string.substring(0,1) == '')
    {
        string = string.substring(1,string.length);
    }
    return string;
}

function trimRight(string)
{
    while(string.substring(string.length - 1,string.length) == '')
    {
        string = string.substring(0,string.length-1);
    }
    return string;
}

function loadpolyline(polyline)
{
    map.AddPolyline(polyline);
}
function getURLParam(strParamName,strURL)
{
    var strReturn = "";
    var strHref = strURL;
    if ( strHref.indexOf("?") > -1 )
    {
        var strQueryString = strHref.substr(strHref.indexOf("?")).toLowerCase();
        var aQueryString = strQueryString.split("&");
        for ( var iParam = 0; iParam < aQueryString.length; iParam++ )
        {
            if (aQueryString[iParam].indexOf(strParamName.toLowerCase() + "=") > -1 )
            {
                var aParam = aQueryString[iParam].split("=");
                strReturn = aParam[1];
                break;
            }
        }
    }
    return strReturn;
}

function ShowMultirouteMetaData(rids)
{
    url = 'xrdo.ashx?a=mrmt&r=' + rids;
    XMLhttp(url);
}

function XMLhttp(url)
{
    // branch for native XMLHttpRequest object
    if (window.XMLHttpRequest) {
        req = new XMLHttpRequest();
        req.onreadystatechange = processReqChange;
        try {
          req.open("GET", url, true);
        } catch (e) {
    	  alert(e);
        }
        req.send(null);
    // branch for IE/Windows ActiveX version
    } else if (window.ActiveXObject) {
        try {
          req = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch (e)
        {
          req = new ActiveXObject("Microsoft.XMLHTTP");
        }
        if (req) {
            req.onreadystatechange = processReqChange;
            req.open("GET", url, true);
            req.send();
        }
    }    
}

function processReqChange()
{
    // only if req shows "complete"
    if (req.readyState == 4) {
        // only if "OK"

        if (req.status == 200) {
            // ...processing statements go here...
            var response = req.responseXML.documentElement;
            var method = response.getElementsByTagName('method')[0].firstChild.data;
            if(pageId == 1)
            {  
                //use in ListRoutes.aspx   
                if(method == 'ListRoutes')
                {
                    parent.showframe.DeleteAllPushpins();
                    parent.showframe.startLatLongs_clear();
                    document.getElementById("peopleTree").innerHTML = '';
                    var ridT = new Array(); 
                    var ridInfoT = new Array();                   
                    var numroutes = response.getElementsByTagName('numroutes')[0].firstChild.data;
                    var maxRid = -1;
                    if(numroutes > 0)
                    {
                        //build pagenation header
                        addPagenationHeader(numroutes);
                        var html = '';
                        var hoverHtml = '';
                        var rids = '';
                        for(i=0;i<numroutes;i++)
                        {
                            var rid = response.getElementsByTagName('rid')[i].firstChild.data;
                            // creating an information object for the route ID table
                            //Get routetype from getXmlTag(), then store the routetype in ridInfoT 
                            ridInfo = new RidInfo(response.getElementsByTagName('routetype')[i].firstChild.data);
                            hoverHtml += addHoverHead(rid, response.getElementsByTagName('metadata')[i]);
                            html += addRoutes(rid, response.getElementsByTagName('metadata')[i]);
                            addStartPoint(rid, response.getElementsByTagName('startpoint')[i], ridInfo);
                            hoverHtml += addTag(rid, response.getElementsByTagName('tags')[i]); 
                            hoverHtml += addHoverTail(rid, response.getElementsByTagName('metadata')[i]);
                            rids += rid + ',';
                        }
                        document.getElementById("routeTree").innerHTML = html;
                        //hover over popup 
                        document.getElementById("hoverTree").innerHTML = hoverHtml;
                        parent.showframe.DoBestMap();
                        //display summary metadata for routes
                        rids = rids.substring(0,rids.length - 1);
                        ShowMultirouteMetaData(rids);
                    }
                    else
                    {
                        FilterTagsObj = document.getElementById('filtertags');
                        strTags = FilterTagsObj.value;
                        var html = '';
                        if (null != strTags)
                        {
                            html += '<b>Sorry, no route matches for:</b> ' + strTags;
                        }
                        else
                        {
                            html += '<b>Sorry, no route matches for this search.</b>';
                        }
                        document.getElementById("routeTree").innerHTML = html;
                    }
                }
                
                 if(method == 'GetQuery')
                 {
                    parent.listframe.loadQuery(response.getElementsByTagName('tags')[0].firstChild.data,response.getElementsByTagName('parameters')[0].firstChild.data);
                 } 
                
                if(method == 'ListUsers')
                {
                    var numusers = response.getElementsByTagName('numusers')[0].firstChild.data;
                    document.getElementById("routeTree").innerHTML = '';
                    if(numusers > 0)
                    {
                        var html = '';
                        for(i=0;i<numusers;i++)
                        {
                            var name = '';
                            var email = '';
                            var blurb = '';
                            if(response.getElementsByTagName('name')[i].firstChild.data)
                            {
                                name = response.getElementsByTagName('name')[i].firstChild.data;
                            }
                            if(response.getElementsByTagName('email')[i].firstChild.data)
                            {
                                email = response.getElementsByTagName('email')[i].firstChild.data;
                            }
                            if(response.getElementsByTagName('blurb')[i].firstChild.data)
                            {
                                blurb = response.getElementsByTagName('blurb')[i].firstChild.data;
                            }
                            html += addUserToPeopleTree(name,email,blurb);
                        }
                        document.getElementById("peopleTree").innerHTML = html;
                    }
                    else
                    {
                        document.getElementById("peopleTree").innerHTML = 'Sorry, no people match your specifications...';
                    }
                }

                //use in ListRoutes.aspx
                if(method == 'UpdateTags')
                {
                    var numtags = response.getElementsByTagName('numtags')[0].firstChild.data;
                    var tags = '';
                    var rid = response.getElementsByTagName('routeid')[0].firstChild.data;
                    for(i=0;i<numtags;i++)
                    {
                        tags += response.getElementsByTagName('tag')[i].firstChild.data + ',';
                    }
                    if (numtags > 0) UpdateTags(tags, rid);
                }               
            }
            
            if(method == 'MetaData')
            {
                if (response.getElementsByTagName('routeid').length > 0)
                { 
                    var rid = response.getElementsByTagName('routeid')[0].firstChild.data;
                    var srouteId = rid.toString();
                    var metadata = response.getElementsByTagName('metadata')[0];
	                var distTot = metadata.getElementsByTagName('DistTot')[0].firstChild.data;
	                var distUp = metadata.getElementsByTagName('DistUp')[0].firstChild.data;
	                var distDown = metadata.getElementsByTagName('DistDown')[0].firstChild.data;
	                var distFlat = metadata.getElementsByTagName('DistFlat')[0].firstChild.data;
	                var timeTot = metadata.getElementsByTagName('TimeTot')[0].firstChild.data;
	                var timeMove = metadata.getElementsByTagName('TimeMove')[0].firstChild.data;
	                var altUp = metadata.getElementsByTagName('AltUp')[0].firstChild.data;
	                var altDown = metadata.getElementsByTagName('AltDown')[0].firstChild.data;
	                var speedAll = metadata.getElementsByTagName('SpeedAll')[0].firstChild.data;
	                var speedUp = metadata.getElementsByTagName('SpeedUp')[0].firstChild.data;
	                var speedDown = metadata.getElementsByTagName('SpeedDown')[0].firstChild.data;
	                var speedFlat = metadata.getElementsByTagName('SpeedFlat')[0].firstChild.data;
	                
	                parent.showframe.DisplayMetaData(distTot, distUp, distDown, distFlat, timeTot,timeMove, altUp, altDown, speedAll, speedUp ,speedDown , speedFlat);
                    if(rid != '0000')
                    {
                        ShowTag(rid);
                    }
                 }

             }
            else if (pageId == 2)
            {  

                //use in ShowRoute.aspx 
                if(method == 'UpdateTags')
                {
                    var numtags = response.getElementsByTagName('numtags')[0].firstChild.data;
                    var rid = response.getElementsByTagName('routeid')[0].firstChild.data;
                    var tags = '';
                    for(i=0;i<numtags;i++)
                    {
                        tags += response.getElementsByTagName('tag')[i].firstChild.data + ',';
                    }
                    UpdateTags(tags, rid);
                    GetMetadatapoints(rid);
                }
                //use in ShowRoute.aspx 
                if(method == 'StartPoint')
                {
                    if (response.getElementsByTagName('routeid').length > 0)
                    { 
                        var rid = response.getElementsByTagName('routeid')[0].firstChild.data;
                        var srouteId = rid.toString();
                        var pin = response.getElementsByTagName('pin')[0];
		                var lat = pin.getElementsByTagName("lat")[0].firstChild.data;
    	                var lon = pin.getElementsByTagName("lon")[0].firstChild.data;
	                    var time = pin.getElementsByTagName("time")[0].firstChild.data;
                        var detail = "<a class=\"node\" href=\"javascript:parent.showframe.plotRoute(\'" + srouteId + "\')\">Route " + rid 
	                                    + "</a><br><br>"
	                                    + "<a href=\"javascript:parent.listframe.emailFunc(\'" +srouteId+ "\')\">Email this route</a><br><br>"
	                                    + "Start Time:" + time + "<br>"
	                                    + "Lat: " + lat + "<br>"
	                                    + "Long: "+ lon + "<br>";
                	                    
	                    AddStartPushPin( rid, lat, lon, detail);
                	 
                        }
                 } 
                 //use in ShowRoute.aspx                
                 if(method == 'ShowRoute')
                 {                
                    routexml = response;
                    count = 0;
                    polylinepoints = new Array();
                    pushpins = new Array(); 
                    panelPoints = new Array();
                    //map.AddControl(panel);
                    
                    routeId = response.getElementsByTagName('routeid')[0].firstChild.data;

                    var pins = response.getElementsByTagName('pin');
                    for( var i = 0; i < pins.length; i++ ) 
                    {
	                    var pin = pins[i];
	                    var lat = pin.getElementsByTagName("lat")[0].firstChild.data;
	                    var lon = pin.getElementsByTagName("lon")[0].firstChild.data;
                        var time = pin.getElementsByTagName("time")[0].firstChild.data;
                        AddPin( lat, lon, time );
                    }   	    	    	    	    
                   	    	    
                    map.SetCenterAndZoom(new VELatLong(pins[0].getElementsByTagName("lat")[0].firstChild.data, pins[0].getElementsByTagName("lon")[0].firstChild.data), 17);
                    var polyline = new VEPolyline( '1', polylinepoints, new VEColor( 128, 255, 255, 1.0), 3 );
                    line = document.getElementById('linesolid');
                    
                    if (line.className == 'clicked')
                    {
                        map.AddPolyline( polyline );
                    }    	
                    
                    ShowMetaData(routeId);
                    
                    //RenderPanel(false);
                } 
                //use in ShowRoute.aspx 
                if(method == 'MetaData')
                {
                    if (response.getElementsByTagName('routeid').length > 0)
                    { 
                        var rid = response.getElementsByTagName('routeid')[0].firstChild.data;
                        var srouteId = rid.toString();
                        var metadata = response.getElementsByTagName('metadata')[0];
		                var distTot = metadata.getElementsByTagName('DistTot')[0].firstChild.data;
    	                var distUp = metadata.getElementsByTagName('DistUp')[0].firstChild.data;
		                var distDown = metadata.getElementsByTagName('DistDown')[0].firstChild.data;
    	                var distFlat = metadata.getElementsByTagName('DistFlat')[0].firstChild.data;
    	                var timeTot = metadata.getElementsByTagName('TimeTot')[0].firstChild.data;
    	                var timeMove = metadata.getElementsByTagName('TimeMove')[0].firstChild.data;
    	                var altUp = metadata.getElementsByTagName('AltUp')[0].firstChild.data;
    	                var altDown = metadata.getElementsByTagName('AltDown')[0].firstChild.data;
    	                var speedAll = metadata.getElementsByTagName('SpeedAll')[0].firstChild.data;
    	                var speedUp = metadata.getElementsByTagName('SpeedUp')[0].firstChild.data;
    	                var speedDown = metadata.getElementsByTagName('SpeedDown')[0].firstChild.data;
    	                var speedFlat = metadata.getElementsByTagName('SpeedFlat')[0].firstChild.data;
    	                
    	                DisplayMetaData(distTot, distUp, distDown, distFlat, timeTot,timeMove, altUp, altDown, speedAll, speedUp ,speedDown , speedFlat);
                        if(rid != '0000')
                        {
                            ShowTag(rid);
                        }
                     }
                 }   
                 
                 if(method == 'MetaDatapoints')
                 {
                    metadatapoints = response; 
                    updatemenu(); 
                 }
                 
                 //use in ShowRoute.aspx
                 if(method == 'CreateRoute')
                 {
                    var rid = response.getElementsByTagName('routeid')[0].firstChild.data;
                    if (rid > 0)
                    {
                        routeId = rid;
                        alert('Route id: ' + routeId + ' has been added.');
                    }
                    else
                    {
                        alert('Create route failed');
                    }
                 }
            }                            
        }
    }
}