
var xmlHttp;
var searchForm;
var routeForm;
var searchResult;
var searchinput;
var searchland;
var startinput;
var startland;
var viainput; //array
var vialand; //array
var endinput;
var endland;
var searchdata;
var routedata; //A two-dimensional array (with arrays similar to the startdata and enddata arrays as elements)
var submitcount; //counting the submitting of route-points
var viacount;

/*
 * Get the XMLHttp object for AJAX-like communication.
 */
function getXMLHttpObj()
{
    var xml = null;
    
    if(window.XMLHttpRequest) {
        xml = new XMLHttpRequest();
    }
    else {
        try {
            xml = new ActiveXObject("Msxml2.XMLHTTP");
        } catch(e) {
            xml = null;
        }
    }
    
    return xml;
}

/*
 * Get the XMLDOM object to interact with XML (returned queries etc).
 */
function getXMLDOMObject() {
    var doc = null;
    if (document.implementation && document.implementation.createDocument) {
        // This is the W3C standard way to do it (FF etc)
        doc = document.implementation.createDocument("","",null);
    }
    else { 
        //Supposedly the IE way of doing it
        doc = new ActiveXObject("MSXML2.DOMDocument");
    }
    return doc;
}

/*
 * Use javascript DOM functions to parse the text given in as XML.
 */
function parseXML (text) {
    if(typeof DOMParser != "undefined") {
        return (new DOMParser()).parseFromString(text, "application/xml");
    }
    else if(typeof ActiveXObject != "undefined") {
        var doc = getXMLDOMObject();
        doc.loadXML(text);
        return doc;
    }
    return null;
}

/*
 * Use this to submit the 118100-form (top, to the right of logo)
 */
function submit118100() {
    var url = "http://www.118100.se/perl/nemo/SE/www.pl?"
    var what = document.getElementById("personinput118100").value;
    var adress = document.getElementById("adressinput118100").value;
    url += "what="+escape(what); //use escape when sending as query params
    url += "&where="+escape(adress);
    //window.location = url;
    window.open(url, "_blank", ""); //open in new window or tab
    return false;
}

/**
 * Creates an URL query from the route fields in the page.
 * The contents of the text fields are predicated with f,
 * and gets a running number after that. f0 is the first field, i.e. the
 * startfield, and the last running number indicates the endfield.
 * The same with the land choice, only that the predicate is l (small letter L)
 */
function createURLFromRouteFields() {
    var url = "";

    var fc = 0;

    //Here we must also send along the contents of the various via-fields,
    //and the start and end fields
    var contents = document.getElementById("startinput").value;

    url += "&f" + fc + "=" + contents;
    fc++;

    while(document.getElementById("routeviadiv"+fc) != null) {
        contents = document.getElementById("routeviadiv"+fc).value;
        url += "&f" + fc + "=" + contents;
        fc++;
    }
    contents = document.getElementById("endinput").value;
    url += "&f" + fc + "=" + contents;

    //We must also include the state of the select land-selects
    fc = 0;
    contents = document.getElementById("start_landchoice").value;
    url += "&l" + fc + "=" + contents;
    fc++;

    while(document.getElementById("via_landchoice"+fc) != null) {
        contents = document.getElementById("via_landchoice"+fc).value;
        url += "&l" + fc + "=" + contents;
        fc++;
    }

    contents = document.getElementById("end_landchoice").value;
    url += "&l" + fc + "=" + contents;
    //alert("created URL: " + url);
    return url;
}

function routeUpdate() {
    if(xmlHttp.readyState == 4) {
        var response = xmlHttp.responseText;
        document.getElementById("routeform_inner").innerHTML = response;
    }
}

/*
 * Adds a new via-point to the route
 */
function routeAddVia() {
    var url = "route/addvia.php?op=addvia";
    url += createURLFromRouteFields();
    var callback = routeUpdate;
    sendXMLHttpRequest(url,callback);
}

/*
 * Deletes a via-point from the route
 */
function routedel(num) {
    var url = "route/delvia.php?n="+num;
    url += createURLFromRouteFields();
    var callback = routeUpdate;
    sendXMLHttpRequest(url,callback);
}

/*
 * Moves a start/via-point in the route one place down
 */
function routedown(num) {
    var url = "route/routedown.php?n="+num;
    url += createURLFromRouteFields();
    var callback = routeUpdate;
    sendXMLHttpRequest(url,callback);
}

/*
 * Moves a via/end-point in the route one place up
 */
function routeup(num) {
    var url = "route/routeup.php?n="+num;
    url += createURLFromRouteFields();
    var callback = routeUpdate;
    sendXMLHttpRequest(url,callback);
}

/**
 * Turns the route, so the start becomes the end and vice versa
 */
function routeTurn() {
    var url = "route/routeturn.php?op=turn";
    url += createURLFromRouteFields();
    var callback = routeUpdate;
    sendXMLHttpRequest(url,callback);
}

/**
 * Called when a address search is ready.
 * This very same function is used also for start/via/end route search.
 */
function searchReady() {
    if(xmlHttp.readyState==4) {
        var response = xmlHttp.responseText;
        insertSearchResult(response);
    }
}

function insertSearchResult(contents) {
    removeSearchResult();
    var attrs = {
        'id' : 'searchresult'
    };
    var div = new Element('div', attrs);
    div.innerHTML = contents;
    $('routeform').insert({
        after : div
    });
}

function removeSearchResult() {
    if($('searchresult') != null) {
        $('searchresult').remove();
    }
}

function velgReady() {
    if(xmlHttp.readyState==4) {
        var valg = xmlHttp.responseText;
        var xmldoc = parseXML(valg);
        
        searchdata = getNodeInfo(xmldoc);
        
        var lat = searchdata[2];
        var lon = searchdata[3];
        if(searchdata[1] == "Street") {
            if(searchdata[9] != null) {
                var hdata = searchdata[9];
                lat = (hdata[1] != "")?hdata[1]:lat;
                lon = (hdata[2] != "")?hdata[2]:lon;
            }
        }
        
        removeSearchResult();

        document.getElementById("searchinput").value = getChosenInputString(searchdata, true);
        
        centerMapWithSymbol(lon,lat,8);
    }
}

function getChosenInputString(data, inclRegion) {
    var chosenInputString = data[0]; //name
    if(data[1] == "Street") { //type
        if(data[9] != null) {
            var hdata = data[9]; //house data
            chosenInputString += " ";
            chosenInputString += hdata[0];
        }
    }
    if(inclRegion) {
        if(data[7] != null && data[7] != "") {
            chosenInputString += " ";
            chosenInputString += data[7]; //region
        }
    }
    return chosenInputString;
}

function getNodeInfo(xmlDocument) {
    var doc = xmlDocument;
    
    var nodeTypes = new Array("Place","Street","House","Post","Region");
        
    var type;
    var places = null;
    for(i = 0; i < nodeTypes.length;i++) {
        type = nodeTypes[i];
        places = doc.getElementsByTagName(type);
        if(places.length > 0) {
            break;
        }
    }
    
    var houses = null;
    var hdata = null;
    if(type == "Street") {
        houses = doc.getElementsByTagName("House");
        if(houses.length > 0) {
            var h = houses[0];
            var hname = h.getAttribute("Name");
            var hlat = h.getAttribute("Lat");
            var hlon = h.getAttribute("Lon");
            var hpost = h.getAttribute("Post");
            var hpostNo = h.getAttribute("PostNo");
            hdata = new Array();
            hdata[0] = hname;
            hdata[1] = hlat;
            hdata[2] = hlon;
            hdata[3] = hpost;
            hdata[4] = hpostNo;
        }
    }
    
    var p = places[0];
    var lat = p.getAttribute("Lat");
    var lon = p.getAttribute("Lon");
    var id = p.getAttribute("Id");
    var match = p.getAttribute("Match");
    var region = p.getAttribute("Region");
    var name = p.getAttribute("Name");
    var post = p.getAttribute("Post");
    var postNo = p.getAttribute("PostNo");
        
    var data = new Array();
    data[0] = name;
    data[1] = type;
    data[2] = lat;
    data[3] = lon;
    data[4] = post;
    data[5] = postNo;
    data[6] = id;
    data[7] = region;
    data[8] = match;
    data[9] = hdata;
        
    return data;
}

/*
* Called after the start and end points for the route is chosen, 
* to generate the route description and the map trace.
*/
function routeFinish() {
    if(xmlHttp.readyState == 4) {
        //accept last requested data (from the end-point)
        var endxml = xmlHttp.responseText;
        var xmldoc = parseXML(endxml);
        routedata[submitcount] = getNodeInfo(xmldoc);
        var s = "";
        var i;
        for(i = 0; i < routedata.length;i++) {
            s += "routedata["+i+"] = " + routedata[i] + "\n";
        }
        //alert(s);
        showRouteAsText();
        showRouteInMap();
    }
}

/*
* Called to generate the route description (text)
*/
function showRouteAsText() {
    
    var startlon;
    var startlat;
    var startdata = routedata[0];
    var viadata;
    var vialon;
    var vialat;
    var i;
    if(startdata[9] != null) {
        var start = startdata[9];
        startlon = start[2];
        startlat = start[1];
    }
    else {
        startlon = startdata[3];
        startlat = startdata[2];
    }
    var url = "route.php?sx=" + startlon + "&sy=" + startlat;

    i = 1;
    while(i < routedata.length) {
        //alert("i = " + i);
        viadata = routedata[i];
        if(viadata[9] != null) {
            var via = viadata[9];
            vialon = via[2];
            vialat = via[1];
        }
        else {
            vialon = viadata[3];
            vialat = viadata[2];
        }
        url += "&ex"+i+"="+vialon+"&ey"+i+"="+vialat;
        i++;
    }

    url += "&start=" + getChosenInputString(startdata,false);
    url += "&end=" + getChosenInputString(routedata[(routedata.length - 1)], false);
    var callback = routeDescriptionReady;
    sendXMLHttpRequest(url, callback);
    
    insertSearchResult('<img src="site_images/spinning.gif"/>');
}

/*
* Callback for the route description
*/
function routeDescriptionReady() {
    if(xmlHttp.readyState == 4) {
        var xml = xmlHttp.responseText;
        
        insertSearchResult(xml);
    }
}


function showRouteInMap() {
    //alert("showRouteInMap");
    var startlon;
    var startlat;
    var destdata;
    var destlon = new Array();
    var destlat = new Array();
    var startdata = routedata[0];
    var i;
    if(startdata[9] != null) {
        var start = startdata[9];
        startlon = start[2];
        startlat = start[1];
    }
    else {
        startlon = startdata[3];
        startlat = startdata[2];
    }

    i = 1;
    while(i < routedata.length) {
        destdata = routedata[i];
        if(destdata[9] != null) {
            var dest = destdata[9];
            destlon[i-1] = dest[2];
            destlat[i-1] = dest[1];
        }
        else {
            destlon[i-1] = destdata[3];
            destlat[i-1] = destdata[2];
        }
        i++;
    }

    routeMap(startlon, startlat, destlon, destlat);
}

/*
* Sends a HTTP request to the url, and the callback function 
* is called to give info on the request status.
*/
function sendXMLHttpRequest(url, callback) {
    xmlHttp = getXMLHttpObj();
    xmlHttp.onreadystatechange = callback;
    //The encodeUri function forces convertion to UTF-8 and percent-encoding of
    //every octet and is a standard part of ECMA-262 (supported on all newer browsers)
    xmlHttp.open("GET", encodeURI(url), true);
    
    xmlHttp.send(null);
}

/*
* Pure address search
* Called when choosing one of the search results.
*/
function searchVelg(p) {
    //p must be a string, else the IDs started with 0 (the digit zero) may be wrongly interpreted
    var url = "address_velg.php?id="+p+"&mode=search";
    
    var houseSelect = document.getElementById(p);
    if(houseSelect != null) {
        var houseName = houseSelect.value;
        url += "&house="+houseName;
    }

    var callback = velgReady;
    
    sendXMLHttpRequest(url,callback);
    
    insertSearchResult('<img src="site_images/spinning.gif"/>');
}

/*
* Called when choosing one of the search results for the route start.
*/
function routeVelgStart(p) {
    var url = "address_velg.php?id="+p+"&mode=start";
    var houseSelect = document.getElementById(p);
    if(houseSelect != null) {
        var houseName = houseSelect.value;
        url += "&house="+houseName;
    }

    var callback = submitRouteVia;
    
    sendXMLHttpRequest(url,callback);
}

/*
 * Called when choosing one of the search results for the n'th via-point.
 */
function routeVelgVia(p) {
    var url = "address_velg.php?id="+p+"&mode=via";

    var houseSelect = document.getElementById(p);
    if(houseSelect != null) {
        var houseName = houseSelect.value;
        url += "&house="+houseName;
    }

    var callback = submitRouteVia;

    sendXMLHttpRequest(url,callback);
}

/*
* Called when choosing one of the search results for the route end.
*/
function routeVelgEnd(p) {
    var url = "address_velg.php?id="+p+"&mode=end";

    var houseSelect = document.getElementById(p);
    if(houseSelect != null) {
        var houseName = houseSelect.value;
        url += "&house="+houseName;
    }
    var callback = routeFinish;
    
    sendXMLHttpRequest(url,callback);
}

/*
* The normal address search
*/
function submitSearch() {
    var callback = searchReady;
    searchinput = document.getElementById("searchinput").value;
    if(searchinput != "") {
        searchland = document.getElementById("search_landchoice").value;
        var url = "address_search.php?address=" + searchinput;
        url += "&land=" + searchland;
        sendXMLHttpRequest(url, callback);
        searchForm = document.getElementById("searchform");
        routeForm = document.getElementById("routeform");
        searchResult = document.getElementById("searchresult");
        
        insertSearchResult('<img src="site_images/spinning.gif"/>');
    }
}

/*
* The normal route search [Start].
* Checks that all the fields are properly filled in.
*/
function submitRouteStart() {
    var callback = searchReady;
    startinput = document.getElementById("startinput").value;
    endinput = document.getElementById("endinput").value;
    startland = document.getElementById("start_landchoice").value;
    endland = document.getElementById("end_landchoice").value;

    viainput = new Array();
    vialand = new Array();
    routedata = new Array(); //this now also contains start and end data, in addition to via-data.

    viacount = 0;
    submitcount = 0;
    while(document.getElementById("routeviadiv"+(viacount + 1)) != null) {
        viainput[viacount] = document.getElementById("routeviadiv"+(viacount + 1)).value;
        vialand[viacount] = document.getElementById("via_landchoice"+(viacount + 1)).value;
        viacount++;
    }
    
    if(startinput != "" && endinput != "") {
        var url = "address_search.php?address=" + startinput + "&land=" + startland + "&mode=start";
        sendXMLHttpRequest(url, callback);
        
        searchForm = document.getElementById("searchform");
        routeForm = document.getElementById("routeform");
        
        insertSearchResult('<img src="site_images/spinning.gif"/>');
    }
}

/**
 * Is called untill we have no more via-points (possibly zero),
 * after which we go to the submitRouteEnd.
 * Accepts the data from the previous submit of choice.
 */
function submitRouteVia() {
    if(xmlHttp.readyState == 4) {
        //accept previous data
        var startxml = xmlHttp.responseText;
        var xmldoc = parseXML(startxml);
        routedata[submitcount] = getNodeInfo(xmldoc);
        submitcount++;
        var callback = searchReady;
        var url = "address_search.php?address=";

        //check if we have any more via-points
        if(submitcount > viacount) {
            url += endinput + "&land=" + endland + "&mode=end";
        }
        else {
            url += viainput[submitcount-1] + "&land=" + vialand[submitcount-1] + "&mode=via";
        }
        
        sendXMLHttpRequest(url,callback);
        insertSearchResult('<img src="site_images/spinning.gif"/>');
    }
}
