/*
  Running MySource Matrix
  Developed by Squiz - http://www.squiz.net
  MySource, MySource Matrix and Squiz.net are registered Trademarks of Squiz Pty Ltd
  Page generated: 11 July 2011 16:18:50
*/


importXML("/citizenship_designs/javascript_files/find.js/test_locations.xml");

String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ''); }

// define script vars
var TestLocations = Array();
var xmlDoc;
var pageLoaded = false;
var locationsLoaded = false;
var map;
var geocoder;

var interval;
var destinationLeft;
var startLeft = -800;
var animkeys = Array();

var pos = startLeft;
var pos_index = 0;

var overlay;

var backOn = new Image(); backOn.src = "/citizenship_designs/javascript_files/find.js/back_on.gif";
var backOff = new Image(); backOff.src = "/citizenship_designs/javascript_files/find.js/back_off.gif";

var zone=0;

var firstID;
var secondID;

var GLatLngFrom;
var GLatLngTo;

var directionsPanel;
var directions;

var address;
var mapPositioned = true;
var mapShowing = false;


function Gload() {
    var searchbox = document.getElementById("search_box");
    destinationLeft = findPos(searchbox)[0]-600;

    // generate the animation sequence
    while (pos < (destinationLeft-10)) {
        pos = parseInt((destinationLeft - (pos*-1)) / 1.5);
        animkeys[pos_index++] = pos + "px";
    }

    document.getElementById("fromAddress").focus();

    //setLocations();
    overlay = document.getElementById("overlaydiv");

    overlay.style.left = startLeft+"px";
    //alert(findPos(searchbox)[1]);
    overlay.style.top = (findPos(searchbox)[1]-16) + "px";
    if (GBrowserIsCompatible()) {
        geocoder = new GClientGeocoder();
        map = new GMap2(document.getElementById("map"));
        map.addControl(new GSmallMapControl());
        map.addControl(new GMapTypeControl());
        directionsPanel = document.getElementById("directions");
        directions = new GDirections(map, directionsPanel);
    }
}

function findPos(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 TestLocation(state, town, address, fulladdress, pcode, provider, lat, lng, utc, directions) {
    this.state = state;
    this.town = town;
    this.address = address;
    this.fulladdress = fulladdress;
    this.pcode = pcode;
    this.provider = provider;
    this.lat = lat;
    this.lng = lng;
    this.utc = utc;
    this.directions = directions;
    this.marker = false;
}

function importXML(filename)
{
    if (document.implementation && document.implementation.createDocument) {
        xmlDoc = document.implementation.createDocument("", "", null);
        xmlDoc.onload = readXML;
    }
    else if (window.ActiveXObject) {
        xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.onreadystatechange = function () {
            if (xmlDoc.readyState == 4) readXML()
        };
     }
    else {
        alert('Your browser can\'t handle this script');
        return;
    }
    xmlDoc.load(filename);
}

function readXML() {
    var citizenship = xmlDoc.getElementsByTagName("citizenship_test_locations");
    var locations = citizenship[0].getElementsByTagName("location");
    var location;
    for (var i=0; i<locations.length; i++) {
        location = locations[i];
        TestLocations[locations[i].getAttribute("pcode")+""] = new TestLocation(
            location.getAttribute("state"),
            location.getAttribute("town"),
            location.getAttribute("address"),
            location.getElementsByTagName("street_address")[0].firstChild.nodeValue,
            location.getAttribute("pcode"),
            location.getAttribute("provider"),
            location.getAttribute("lat"),
            location.getAttribute("lng"),
            location.getAttribute("utc_offset"),
            location.getAttribute("directions")
        );
    }
}


function loadOfficeDetails(id) {
    document.getElementById("office_name").innerHTML = TestLocations[id].town + " " + TestLocations[id].provider;
    document.getElementById("office_address").innerHTML = TestLocations[id].address + ", " + TestLocations[id].state + " " + id;
}

function showGoogle(id) {
    directions.clear();
    document.getElementById("directions").innerHTML = "";
    if (!TestLocations[id].marker) {
        if (TestLocations[id].address+"" != "") {
            geocoder.getLatLng(
                TestLocations[id].address + ", " + TestLocations[id].pcode,
                function(point) {
                    map.addOverlay(new GMarker(point));
                    TestLocations[id].marker = true;
                }
            );
        }
    }
    map.setCenter(new GLatLng(TestLocations[id].lat, TestLocations[id].lng), 15);
    if (mapPositioned) {
        mapPositioned = false;
        pos_index = 0;
        interval = setInterval("pullDown()",10);
    }
    loadOfficeDetails(id);
}

function hideGoogle() {
    document.getElementById("directions").innerHTML = "";
    if (mapPositioned) {
        mapPositioned = false;
        //document.getElementById("flashmap").className = "show";
        pos_index = animkeys.length-1;
        interval = setInterval("pullUp()",10);
    }
}

function pullDown() {
    if (pos_index < animkeys.length) {
        overlay.style.left = animkeys[pos_index++];
    }
    else {
        clearInterval(interval);
        overlay.style.left = destinationLeft + "px";
        //document.getElementById("flashmap").className = "hide";
        mapPositioned = true;
        mapShowing = true;
    }
}

function pullUp() {
    if (pos_index >= 0) {
        overlay.style.left = animkeys[pos_index];
        pos_index--;
    } else {
        clearInterval(interval);
        overlay.style.left = startLeft + "px";
        mapPositioned = true;
        mapShowing = false;
    }
}

function getClosestLocation(addr) {
    var searchAddress;
    document.getElementById("directions").innerHTML = "";
    document.getElementById("cl").innerHTML = "";
    var addr = document.searchform.fromAddress.value;
    if (addr.trim() != "") {
        // strip some potentially dangerous chars from the user input
        address = addr.replace(/[\>\<]/g, '');
        searchAddress = address;
        // if user has entered only a postcode then append " Australia" to search to limit to Aus
        if (IsNumeric(addr)) {
            searchAddress += " Australia";
        }

        if (geocoder) {
            geocoder.getLatLng(
            searchAddress,
            function(point) {
                if (!point) {
                    alert(address + " not found");
                }
                else {
                    GLatLngFrom = point;

                    latitude = point.lat();
                    longitude = point.lng();

                    // check that the location is roughly within the bounds of Australia
                    if ((latitude > -10) || (latitude < -143) || (longitude > 154) || (longitude < 112)) {
                        alert(address + " not found");
                    }
                    else {

                        var indexOfClosest;
                        var indexOfSecondClosest;
                        var distance1 = 1000000000000; //some number bigger than the largest likely distance
                        var distance2 = 1000000000000; //some number bigger than the largest likely distance
                        var temp;

                        // find closest
                        for (var i in TestLocations) {
                            if (IsNumeric(i)) {
                                temp = getDistance(latitude, longitude, TestLocations[i].lat, TestLocations[i].lng);
                                if (temp < distance1) {
                                    distance1 = temp;
                                    indexOfClosest = i;
                                }
                            }
                        }
                        firstID = TestLocations[indexOfClosest].pcode;
                        thisMovie("mapapp").showOffice( firstID );

                        // find 2nd closest
                        for (var i in TestLocations) {
                            if (IsNumeric(i)) {
                                temp = getDistance(latitude, longitude, TestLocations[i].lat, TestLocations[i].lng);
                                if ((temp > distance1) && (temp < distance2)) {
                                    distance2 = temp;
                                    indexOfSecondClosest = i;
                                }
                            }
                        }
                        secondID = TestLocations[indexOfSecondClosest].pcode;
                        showClosestLocations();
                    }
                }
            });
        } // close if (geocoder)
    } // close if (addr.trim() != "")
}

function showClosestLocations() {
    var loc1 = TestLocations[firstID].town + " " + TestLocations[firstID].provider;
    var loc2 = TestLocations[secondID].town + " " + TestLocations[secondID].provider

    var str = "<table width=245 id=\"closest_locations\" style=\"margin: 8px 0 0 0;\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\">";
    str +=    "<tr><td style=\"background: #eeeeee; font-size:1.2em; line-height: 1.2em; font-family: Arial;\">The two closest test centres to<br><b>'" + address + "'</b> are:</td></tr><tr><td>";
    str +=  return2br(formatLocation(firstID));
    str +=     "<br /><div style=\"text-align:right\"><a href=\"javascript:highlight(1);\" title=\"Highlight " + loc1 + " on map\">highlight on map</a> | ";
    if (TestLocations[firstID].directions == null) str += "<a href=\"javascript:showDirections(1);\" title=\"Get driving directions from " + address + " to " + loc1 + "\">driving directions</a></div>";
    str +=    "</td></tr><tr><td>";
    str +=     return2br(formatLocation(secondID));
    str +=    "<br /><div style=\"text-align:right\"><a href=\"javascript:highlight(2);\" title=\"Highlight " + loc2 + " on map\">highlight on map</a> | ";
    if (TestLocations[secondID].directions == null) str += "<a href=\"javascript:showDirections(2);\" title=\"Get driving directions from " + address + " to " + loc2 + "\">driving directions</a></div>";
    str +=    "</td></tr></table>";
    document.getElementById("cl").innerHTML = str;
}

function formatLocation(id) {
    return "<span title=\"Show " + TestLocations[id].town + " " + TestLocations[id].provider + " street map\" class=\"address\"><a href=\"javascript:showGoogle('" + id + "')\">" + TestLocations[id].town + " " + TestLocations[id].provider + "</a></span><br />" + TestLocations[id].fulladdress;
}

function return2br(dataStr) {
    return dataStr.replace(/(\r\n|\r|\n)/g, "<br />");
}

function IsNumeric(sText) {
    var ValidChars = "0123456789";
    var IsNumber=true;
    var Char;

    for (i = 0; i < sText.length && IsNumber == true; i++) {
        Char = sText.charAt(i);
        if (ValidChars.indexOf(Char) == -1) {
            IsNumber = false;
        }
    }
    return IsNumber;
}

function getDistance(lat1, lng1, lat2, lng2) {
    var latFrom = (lat1 < 0) ? lat1 *-1 : lat1 ;
    var lngFrom = (lng1 < 0) ? lng1 *-1 : lng1 ;
    var latTo = (lat2 < 0) ? lat2 *-1 : lat2 ;
    var lngTo = (lng2 < 0) ? lng2 *-1 : lng2 ;
    return Math.sqrt( Math.pow( (Math.max(latFrom,latTo) - Math.min(latFrom,latTo)),2) + Math.pow( (Math.max(lngFrom,lngTo) - Math.min(lngFrom,lngTo)),2) );
}

function thisMovie(movie) {
    /*if (navigator.appName.indexOf("Microsoft") != -1) {
        return window[movieName];
    }
    else {
        return document[movieName];
    }*/
    if (window.document[movie]) {
        return window.document[movie];
    }
    if (navigator.appName.indexOf("Microsoft Internet")==-1) {
        if (document.embeds && document.embeds[movie]) {
            return document.embeds[movie];
        }
    } else {
        return document.getElementById(movie);
    }
}

function highlight(i) {

    if (i == 1) {
        thisMovie("mapapp").showOffice( firstID );
    }
    else {
        thisMovie("mapapp").showOffice( secondID );
    }
    if ((mapPositioned) && (mapShowing)) {
        mapPositioned = false;
        //document.getElementById("flashmap").className = "hide";
        pos_index = animkeys.length-1;
        interval = setInterval("pullUp()",10);
    }
}

function parseStateFromPostcode(pcode) {
    if ((pcode >= 800) && (pcode < 900)) {
        return " NT";
    } else if ((pcode >= 1000) && (pcode <= 2999)) {
        if (((pcode >= 2600) && (pcode < 2620)) || ((pcode >= 2900) && (pcode < 2999))) {
            return " ACT";
        } else {
            return " NSW";
        }
    } else if ((pcode >= 3000) && (pcode <= 3999)) {
        return " VIC";
    } else if ((pcode >= 4000) && (pcode <= 4999)) {
        return " QLD";
    } else if ((pcode >= 5000) && (pcode <= 5999)) {
        return " SA";
    } else if ((pcode >= 6000) && (pcode <= 6999)) {
        return " WA";
    } else if ((pcode >= 7000) && (pcode <= 7999)) {
        return " TAS";
    } else {
        return "";
    }
}

function showDirections(i) {
    map.clearOverlays();
    if (i == 1) {
        GLatLngTo =  new GLatLng(TestLocations[firstID].lat, TestLocations[firstID].lng);
        directions.loadFromWaypoints(Array(GLatLngFrom, GLatLngTo));
    loadOfficeDetails(firstID);
    } else {
        GLatLngTo =  new GLatLng(TestLocations[secondID].lat, TestLocations[secondID].lng);
        directions.loadFromWaypoints(Array(GLatLngFrom, GLatLngTo));
    loadOfficeDetails(secondID);
    }
    if (mapPositioned) {
        mapPositioned = false;
        pos_index = 0;
        interval = setInterval("pullDown()",10);
    }
}
