var map;
var start_point = false;
var end_point = false;
var snap_to_road = true;
var routeExist = false;
var ef = 53.814715;
var ek = -3.05347;
var cp = 15;
var ec = "0a";
var hK = true;
var cb = false;
var hE = true;
var cd = false;
var dN = '<span style="font-family:arial;font-size:10pt">Elevation only available on routes with two or more points, and in the U.S. You may also see this message when there is a problem with the remote service that provides the elevation data.</span>';
var gn = '<div style="font-family:arial;font-size:10pt;float:left;width:100px"><a href="javascript:refreshGraph();">Refresh graph</a>: One or more of the elevation lookups returned failure (resulting in a "0" in your graph). Click the link to refresh and try again.</div>';
var jC = 0;
var bg = '0';
var ew = true;
var iz = false;
var gc = false;
var aH = false;
var an = 0;
var cP = 0;
var dx = 0;
var cL = false;
var O = '';
var cF = true;
var ah = location.href;
var aN;
var Q = new Object();
var aV = 0;
var redomap = new Array(0);
var ck = new Object();
var aC = new Array(0);
var t;
var H;
var unlinkElevation0 = "off";
var unlinkElevation100 = "small";
var unlinkElevation200 = "large";
var linkElevation0 = "<a href=\"javascript:elevationSwitch('0');\">off</a>";
var linkElevation100 = "<a href=\"javascript:elevationSwitch('100');\">small</a>";
var linkElevation200 = "<a href=\"javascript:elevationSwitch('200');\">large</a>";
var saveLinkActive = '<a href="javascript:createPermalink();">Save route</a>';
var saveLinkInactive = 'Saved';
var saveLinkSaving = 'Saving...';
gO = function (a, b, c) {
    var fy = new GPoint(a.x * 256, (a.y + 1) * 256);
    var io = new GPoint((a.x + 1) * 256, a.y * 256);
    var dA = G_NORMAL_MAP.getProjection().fromPixelToLatLng(fy, b, c);
    var dD = G_NORMAL_MAP.getProjection().fromPixelToLatLng(io, b, c);
    var hN = dA.x + "," + dA.y + "," + dD.x + "," + dD.y;
    var fE = "EPSG:4326";
    var P = this.myBaseURL;
    P += "&REQUEST=GetMap";
    P += "&SERVICE=WMS";
    P += "&reaspect=false&VERSION=1.1.1";
    P += "&LAYERS=" + this.myLayers;
    P += "&STYLES=default";
    P += "&FORMAT=" + this.myFormat;
    P += "&BGCOLOR=0xFFFFFF";
    P += "&TRANSPARENT=TRUE";
    P += "&SRS=" + fE;
    P += "&BBOX=" + hN;
    P += "&WIDTH=256";
    P += "&HEIGHT=256";
    P += "&GroupName=" + this.myLayers;
    return P;
};
var aU = new GTileLayer(new GCopyrightCollection(""), 1, 17);
aU.myLayers = 'DRG';
aU.myFormat = 'image/jpeg';
aU.myBaseURL = 'http://www.terraserver-usa.com/ogcmap6.ashx?';
aU.getTileUrl = gO;
var gX = [aU];
var bP = new GMapType(gX, G_SATELLITE_MAP.getProjection(), "Topo", G_SATELLITE_MAP);
var bc = new GCopyrightCollection("<a href=\"http://www.openstreetmap.org/\">OpenStreetMap</a> data provided by <a href=\"http://www.cloudmade.com/\">Cloudmade</a>");
bc.addCopyright(new GCopyright(1, new GLatLngBounds(new GLatLng(-90, -180), new GLatLng(90, 180)), 0, " "));
var bI = new GTileLayer(bc, 1, 18, {
    tileUrlTemplate: 'http://tile.cloudmade.com/6dfaf084885456cfb9612333f46d2e0f/1/256/{Z}/{X}/{Y}.png'
});
var bO = new GMapType([bI], G_SATELLITE_MAP.getProjection(), "OSM", G_SATELLITE_MAP);

function initializeMap(data) {
    if (data.length > 0) {
        ah = "?" + data + "&";
        dB();
        eh();
    } else {
        dB();
        eh();
    }
    bk();
};

function dB() {
    map = new GMap2(document.getElementById("map"), {
        draggableCursor: 'crosshair',
        draggingCursor: 'crosshair'
    });
    map.setCenter(new GLatLng(ef, ek), cp);
    map.addControl(new GLargeMapControl());
    map.addControl(new GMapTypeControl());
    //map.addMapType(bP);
    map.addMapType(G_PHYSICAL_MAP);
    map.addMapType(bO);
    map.addControl(new GScaleControl());
    map.enableContinuousZoom();
    map.disableDoubleClickZoom();
    var lp = new GKeyboardHandler(map);
    //document.getElementById("elevationChart").innerHTML = dN;
    //document.getElementById('map').style.height = mapHeight + 'px';
    //document.getElementById('adDiv').style.marginTop = adMargin + 'px';
    GEvent.addListener(map, "move", function () {
        redrawLinesAndMarkers(o);
    });
    GEvent.addListener(map, "click", function (dummyOverlay, clickedLatLng) {
        var eJ = map.getCenter();
        cB(clickedLatLng.lng(), clickedLatLng.lat(), cb, cd);
        aE();
        redrawLinesAndMarkers(o);
    });
    GEvent.addListener(map, "zoomend", function (kv, ks) {
        bz();
        redrawLinesAndMarkers(o);
    });
};

function redrawLinesAndMarkers(o) {
    aL(o);
    aq(o);
};
var V = new Array(0);
var F = new Array(0);
var L = new Array(0);
var o = new Array(0);
var A = new Array(0);
var ap = new Array(0);
var B = new Array(0);
var ax = new Array(0);
var ix;
var ep = 0;
var bRecordPoints = true;
var eE = 0;
var fh = 1;
var ENGLISH = "0";
var METRIC = "1";
var eo = "2";
var dp = "3";
var WEIGHT = "4";
var SHOW = "5";
var HIDE = "6";
var LEFT = "7";
var RIGHT = "8";
var hF = "start";
var ik = "stop";
var bG = "0";
var dO = "1";
var ca = "0";
var fo = "1";
var gI = "2";
var aF = null;
var cj = -1;
var by = ai();
var cY;
var bJ = true;
B.push(0);
window.onunload = bC;

function cB(ac, aa, ad, ab) {
	
	if(!routeExist)
		routeExist = true;
	if (!start_point && !end_point) {
        start_point = ac;
        end_point = aa;
    }
	
    if (bRecordPoints) {
        if (hd(ad, ab, F.length)) {
            fI(ac, aa, ad, ab)
        } else {
            ey(ac, aa, ad, ab);
            if ((!ab) && (!ad)) {
                V.push(bG);
            }
        }
    }
    else {
    	ey(ac, aa, ad, ab);
        if ((!ab) && (!ad)) {
            V.push(bG);
        }
    }
};

var previous_marker;
function changeImage(i) {
console.info('call me');
        var marker = bo.getMarker(i);
        map.removeOverlay(marker);
        var icon = G_PAUSE_ICON;
        var newMarker = new GMarker(marker.getLatLng(), {icon:icon});
        if(i > 0 && i == bo.getNumRoutes()){
        	if(previous_marker != null)
        		map.removeOverlay(previous_marker);
       		map.addOverlay(newMarker);
       		previous_marker = newMarker;
       	}
      }
      
function fI(ac, aa, ad, ab) {
    var eI = hX(o[o.length - 1], new GLatLng(aa, ac));
    bo = new GDirections(undefined, document.getElementById("directionsText"));
    if (bX() == ca) {
        bo.loadFromWaypoints(eI, {
            getPolyline: true,
            travelMode: G_TRAVEL_MODE_WALKING
        });
    } else if (bX() == fo) {
        bo.loadFromWaypoints(eI, {
            getPolyline: true,
            travelMode: G_TRAVEL_MODE_DRIVING
        });
    }
    GEvent.addListener(bo, "load", function () {
        var bx = bo.getPolyline();
        for (var C = 1; C < bx.getVertexCount(); C++) {
            ey(bx.getVertex(C).lng(), bx.getVertex(C).lat(), ad, ab);
            if (C == bx.getVertexCount() - 1) {
                V.push(bG);
            } else {
                V.push(dO);
            }
        }
        aL(o);
        aq(o);
    });
	GEvent.addListener(bo,"load", function(){
        setTimeout(function() {
          for (var i=0; i < bo.getNumRoutes()+1; i++) {
          	console.info(i);
            changeImage(i)
          }
        },0);
      });
};

function hX(dg, eR) {
    var cI = new Array(dg.lat() + ', ' + dg.lng(), eR.lat() + ', ' + eR.lng());
    return cI;
};

function ey(ac, aa, ad, ab) {
    F.push(ac);
    L.push(aa);
    o.push(new GLatLng(aa, ac));
    A.push(aF);
    cP = A.length;
    eN(F, L, fh);
    fA(ad, ab);
    fg(B.length);
    bE();
};

function fA(ad, ab) {
    if (ad == cb) {
        if (ab == cd) {
            if (bg > 0) {
                getElevationsAndDrawGraph()
            }
        }
    }
};

function jL() {
    var bn = L[L.length - 2];
    var ba = L[L.length - 1];
    var bL = F[F.length - 2];
    var bK = F[F.length - 1];
    return (Math.atan2(Math.sin(bK - bL) * Math.cos(ba), Math.cos(bn) * Math.sin(ba) - Math.sin(bn) * Math.cos(ba) * Math.cos(bK - bL))) % (2 * Math.PI);
};

function bz() {
    gJ();
    ax = new Array(0);
    for (var k = 3; k <= B.length; k++) {
        fg(k);
    }
};

function fg(cf) {
    if (map.getZoom() > 11) {
        var bq;
        var ga = al(B[cf - 1]);
        if (B.length < 1) {
            bq = 0;
        } else {
            bq = al(B[cf - 2]);
        }
        var dn = Math.floor(bq);
        var de = Math.floor(ga);
        if (dn < de) {
            for (var i = dn + 1; i <= de; i++) {
                gm(parseFloat(i) - bq, cf - 1);
            }
        }
    }
};

function gQ(o, D) {
    var cw = o[D - 1];
    var cV = o[D - 2];
    var bZ;
    if (cV.lng() == cw.lng()) {
        bZ = .00000001
    } else {
        bZ = cV.lng() - cw.lng()
    }
    return ((cV.lat() - cw.lat()) / (bZ));
};

function ij(D) {
    var ea = D - 2;
    var eY = D - 1;
    return Math.sqrt(Math.pow(o[ea].lng() - o[eY].lng(), 2) + Math.pow(o[ea].lat() - o[eY].lat(), 2))
};

function gm(ep, D) {
    var gL = ep / al(ap[D - 1]);
    var gD = ij(D);
    var eL = gL * gD;
    var bL = o[D - 2].lng();
    var bn = o[D - 2].lat();
    var cT = gQ(o, D);
    var co = eL * (1 / (Math.sqrt(1 + Math.pow(cT, 2))));
    var cn = eL * (cT / ((Math.sqrt(1 + Math.pow(cT, 2)))));
    var hP = parseFloat(o[D - 1].lng());
    var fR = parseFloat(o[D - 2].lng());
    if (fR > hP) {
        co = -co;
        cn = -cn;
    }
    var bK = parseFloat(bL) + parseFloat(co);
    var ba = parseFloat(bn) + parseFloat(cn);
    ax.push(new GLatLng(ba, bK));
};

function eN(F, L, en) {
    if (en == fh) {
        aS = hV(F, L);
        B.push(B[B.length - 1] + aS);
        ap.push(aS);
    } else if (en == eE) {
        B.pop();
        ap.pop();
    }
    eP();
};

function handleWeightChange() {
    var fn = B[B.length - 1];
    by = ai();
    eW(fn);
};

function eW(fn) {
    
};

function eP() {
	var mileage = parseInt(al(B[B.length - 1]) * 10000) / 10000;
	var formatted_ml = mileage.toFixed(1);
	var formatted_km = mileage * 1.609344;
	formatted_km = formatted_km.toFixed(1);
    document.controlPanel.mileage.value = formatted_ml;
    document.controlPanel.km.value = formatted_km;
    eW(B[B.length - 1]);
    var aS = 0;
    if (ap.length > 0) {
        aS = ap[ap.length - 1];
    }
    document.controlPanel.lastLeg.value = parseInt(al(aS) * 10000) / 10000;
};

function gK(fO, fN, gx, fS) {
    var fP = new GLatLng(fO, fN);
    var fV = new GLatLng(gx, fS);
    var result = fP.distanceFrom(fV) * .000621371192;
    return (result);
};

function bi(gv, defaultValue) {
    var cH = '';
    var eB = au(gv, ah);
    if (eB.length > 0) {
        cH = eB;
    } else {
        cH = defaultValue;
    }
    return cH;
};

function completeThereAndBackCourse() {
    //console.info('close loop: '+start_point+':'+end_point);
    fI(start_point, end_point, false, false);
    if (bRecordPoints) {
        //fI(start_point, end_point, false, false);	
        }
    else {

        //ey(start_point, end_point,false, false);
        //V.push(bG);
        }

    /*
    var gr = o.length - 1;
    if (o.length > 1) {
        for (var i = gr - 1; i >= 0; i--) {
            aH = false;
            cB(o[i].lng(), o[i].lat(), cb, hE);
            an++;
            cC(A[i], A.length - 1);
            V.push(V[i])
        }
        aH = true;
        aJ();
        aL(o);
        aq(o);
    }
    */
};

function eh() {
    var da = au('fl', ah);
    if (da.length > 0) {
        var aW = da.split('-');
        var bf = aW[0];
        var ha = aW[1];
        var hz = aW[2];
        var weight = aW[3];
        var cx = aW[4];
        if (bf == 's') {
            map.setMapType(G_SATELLITE_MAP);
        } else if (bf == 'm') {
            map.setMapType(G_NORMAL_MAP);
        } else if (bf == 'h') {
            map.setMapType(G_HYBRID_MAP);
        } else if (bf == 't') {
            map.setMapType(bP);
        } else if (bf == 'p') {
            map.setMapType(G_PHYSICAL_MAP);
        } else if (bf == 'o') {
            map.setMapType(bO);
        }(ha == 'm') ? eD(METRIC) : eD(ENGLISH);
        (hz == 's') ? toggleCalorieCounter(SHOW) : toggleCalorieCounter(HIDE);
        //document.controlPanel.weight.value = unescape(weight);
        by = ai();
        (cx == '0') ? toggleMarkers(HIDE) : toggleMarkers(SHOW);
    }
    var bS = parseFloat(bi('centerX', ek));
    var bV = parseFloat(bi('centerY', ef));
    var gi = au('zl', ah);
    var bh;
    if (gi.length != 0) {
        var gs = au('zv', ah);
        bh = parseInt(bi('zl', cp));
        if (gs.length == 0) {
            bh = 17 - bh;
        }
    } else {
        bh = cp;
    }
    map.setCenter(new GLatLng(bV, bS), bh);
    var cQ = bi('rdm', ca);
    hg(cQ);
    var bT = au('pta', ah);
    if (bT.length > 0) {
        var fu = bT.split(",");
    }
    var bA = au('polyline', ah);
    var is_snap = au('snap', ah);
    var miles_tmp = au('miles', ah);
    
    var km_tmp = au('kilometre', ah);
    //console.info(miles_tmp);
    if(miles_tmp.length > 0){
    	miles_tmp = parseFloat(miles_tmp);
    	miles_tmp = miles_tmp.toFixed(1);
    	//alert(miles_tmp);
    	if(miles_tmp < 1)
    		map.setZoom(14);
    	else if(miles_tmp > 1 && miles_tmp < 5)
    		map.setZoom(13);
    	else if(miles_tmp > 5 && miles_tmp < 10)
    		map.setZoom(12);
    	else
    		map.setZoom(11);	
	}	
	if(km_tmp.length > 0){
		km_tmp = parseFloat(km_tmp);	
		km_tmp = km_tmp.toFixed(1);
	}
    document.getElementById("mileage").value = miles_tmp;
    document.getElementById("km").value = km_tmp;
    if (bA.length > 0) {
        aY = gp(bA);
        //bRecordPoints = true;
        //document.controlPanel.startRecording.value = 'Recording...';
        var C = 0;
        
        var loaded_data = bA.split('a');
        //console.info(loaded_data);
        var x_coord = Array();
        var y_coord = Array();
        var k = 0;
        
        
        
        while (k < loaded_data.length) {
            if (k % 2 == 0)
            y_coord.push(loaded_data[k]);
            else
            x_coord.push(loaded_data[k]);
            k++;
        }

        k = 0;
        
        if(k < x_coord.length) {
        	if (!start_point && !end_point) {
        		start_point = x_coord[0];
        		end_point = y_coord[0];
    		}
        }
        
        while (k < x_coord.length) {
            if (is_snap == 'true')
            	ey(x_coord[k], y_coord[k], false, false);
            else
            	ey(x_coord[k], y_coord[k], false, false);
            k++;
        }
        /*
        while (C < aY.length) {
            if (O.length == 0) {
                var aa = eg(aY[C++]);
                var ac = eg(aY[C++]);
            } else {
                var aa = aY[C++];
                var ac = aY[C++];
            }
            cB(ac, aa, hK, cd);
            if (bT.length > 0) {
                V.push(fu[(C / 2) - 1]);
            } else {
                V.push(bG);
            }
        }
        */
        if (O.length != 0) {
            O = '';
            if (aN.length == 0) {
                bE();
            } else {
                eV();
            }
        }
        aL(o);
        aq(o);
        var fe = bi('elev', ec);
        if (fe != ec) {
            var fb = fe.split('a');
            var gW = fb[0];
            var cK = fb[2].split('b');
            for (var i = 0; i < cK.length; i++) {
                aH = false;
                if (cK[i] == "0") {
                    cC(aF, i)
                } else {
                    cC(cK[i] / 100, i)
                }
            }
            aH = true;
            aJ();
            elevationSwitch(gW);
        }
        
        
    }
};

function eq(string, length, eH, dE) {
    var hT = string.length;
    for (k = 0; k < (length - hT); k++) {
        if (dE == LEFT) {
            string = eH + string;
        } else if (dE == RIGHT) {
            string = string + eH;
        }
    }
    return string;
};

function ds(ae) {
    var aQ;
    if (ae.charAt(0) == "-") {
        aQ = true;
        ae = ae.replace('-', '');
    } else {
        aQ = false;
    }
    var gZ = parseFloat(ae) * 100000;
    var K = gZ.toString();
    if (K.indexOf(".") > 0) {
        K = K.substr(0, K.indexOf("."))
    }
    if (K.length < 5) {
        K = eq(K, 5, "0", LEFT);
    }
    if (aQ) {
        K = '-' + K;
    }
    return K;
};

function hY(ae) {
    if (ae.charAt(0) == "-") {
        aQ = true;
        ae = ae.replace('-', '');
    } else {
        aQ = false;
    }
    var K = new String(ae);
    if (K.length < 5) {
        K = eq(K, 5, "0", LEFT);
    }
    if (aQ) {
        K = '-' + K;
    }
    return K;
};

function eg(ae) {
    var ci = hY(new String(ae));
    var hS = ci.length;
    var ei = hS - 5;
    var hn = ci.substr(ei, 5);
    var hi = ci.substr(0, ei);
    return parseFloat(hi + '.' + hn);
};

function jP(ak) {
    var bN = '';
    var ir;
    for (i = 0; i < ak.length; i++) {
        bN += (ds(new String(ak[i].lat())) + ',' + ds(new String(ak[i].lng())));
        if (i < ak.length - 1) bN += ',';
    }
    return bN;
};

function hV(F, L) {
    var ff = 0;
    dr = F.length - 1;
    df = F.length - 2;
    if (F.length > 1) {
        var aS;
        ff = gK(L[dr], F[dr], L[df], F[df]);
    }
    return ff;
};

function bR() {
    F.pop();
    L.pop();
    redomap.push(o[o.length - 1]);
    o.pop();
    eN(F, L, eE);
    bz();
    V.pop();
    A.pop();
    cP = A.length;
    an--;
};

function removeLastLeg() {
    if (F.length > 0) {
        if (V[o.length - 2] == bG) {
            bR();
        } else {
            while (V[o.length - 2] == dO) {
                bR();
            }
            bR();
        }
        bE();
        aL(o);
        aq(o);
        aJ()
    } else {
        alert('No points to remove');
    }
};

function redoLastLeg() {

    if (redomap.length > 0) {
        var tmp = redomap[redomap.length - 1];
        //console.info(tmp);
        var ac = tmp.lng();
        var aa = tmp.lat();
        //console.info('redo: '+ac+':'+aa);
        F.push(ac);
        L.push(aa);
        o.push(new GLatLng(aa, ac));
        A.push(aF);

        cP = A.length;
        eN(F, L, fh);
        fA(false, false);
        fg(B.length);
        bE();
        fI(ac, aa, false, false);
        redomap.pop();
        //alert('redo');
    } else {
        alert('No points to redo');
    }
};

function jV(a) {
    var p = a.split(',');
    var d = '';
    var ej = 0;
    var db = 0;
    for (c = 0; c < p.length; c += 2) {
        x = p[c];
        fq = x - ej;
        ej = x;
        R = (Math.abs(fq) << 1) - (fq < 0);
        do {
            e = R & 31;
            R >>= 5;
            if (R) {
                e |= 32
            };
            d += String.fromCharCode(e + 63);
        } while (R != 0);
        y = p[c + 1];
        el = y - db;
        db = y;
        R = (Math.abs(el) << 1) - (el < 0);
        do {
            e = R & 31;
            R >>= 5;
            if (R) {
                e |= 32
            };
            d += String.fromCharCode(e + 63);
        } while (R != 0);
    }
    return d;
};

function au(fX, ah) {
    var dT = '';
    var ev = new String(ah);
    var cg = new String(fX);
    cg = cg.toLowerCase();
    if (ev.indexOf('?') > -1) {
        var ez = ev.split('?');
        if (ez[1].length > 0) {
            var hm = ez[1];
            var cX = hm.split("&");
            for (i = 0; i <= cX.length - 1; i++) {
                var fZ = cX[i];
                var cr = new String(cX[i]);
                cr = cr.toLowerCase();
                var dM = cr.split('=');
                var dy = dM[0];
                var ll = dM[1];
                if (cg == dy) {
                    dT = unescape(fZ.substr(dy.length + 1));
                    break;
                }
            }
        }
    }
    return dT;
};

function addBookmark(title, url) {
    window.external.AddFavorite(url, title);
};

function fQ(ak) {
    var I = '';
    for (var i = 0; i < ak.length; i++) {
        I += ak[i].lat() + 'a' + ak[i].lng();
        if (i < ak.length - 1) {
            I += 'a';
        }
    }
    return I;
};

function eF() {
    var bS = map.getCenter().lng();
    var bV = map.getCenter().lat();
    var dw = '';
    if (o.length > 0) {
        dw = fQ(o);
    }
    var dC = new String(location.href);
    var ig = dC.split('?');
    dC = ig[0];
    return ('centerX=' + escape(bS) + '&centerY=' + escape(bV) + '&zl=' + new String(map.getZoom()) + '&zv=2' + '&fl=' + fY() + '&polyline=' + escape(dw) + '&elev=' + gd() + '&rId=' + O + '&rdm=' + bX() + '&pta=' + V.join());
};

function fY() {
    var I;
    if (map.getCurrentMapType() == G_SATELLITE_MAP) {
        I = 's';
    } else if (map.getCurrentMapType() == G_NORMAL_MAP) {
        I = 'm';
    } else if (map.getCurrentMapType() == G_HYBRID_MAP) {
        I = 'h';
    } else if (map.getCurrentMapType() == bP) {
        I = 't';
    } else if (map.getCurrentMapType() == G_PHYSICAL_MAP) {
        I = 'p';
    } else if (map.getCurrentMapType() == bO) {
        I = 'o';
    }
    I += "-";
    I += ((ai() == METRIC) ? 'm' : 'e');
    I += "-";
    I += ((bJ == true) ? '1' : '0');
    return I;
};

function jU() {
    document.getElementById("url").value = eF();
    document.tinyUrlForm.submit();
};

function createPermalink() {
    eu(eF());
    eV();
};

function fH() {
    
};

function bE() {
    //document.getElementById('saveLink').innerHTML = saveLinkActive;
    cF = false;
};

function eV() {
    //document.getElementById('saveLink').innerHTML = saveLinkSaving;
    cF = true;
};

function dS(fB) {
    var v = GXmlHttp.create();
    v.open("POST", "getRoute.php", true);
    v.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    v.onreadystatechange = function () {
        if (v.readyState == 4) {
            ah = '?' + v.responseText;
            document.getElementById("map").innerHTML = '';
            dB();
            eh();
        }
    };
    v.send('rId=' + fB);
};

function eu(im) {
    if (bRecordPoints) {
        im += '&snap=true';
    }
    else {
        im += '&snap=false';
    }
    document.getElementById("mileage").value = aw(al(B[B.length - 1]));
    var miles = 0;
    if(document.getElementById("mileage").value.length > 0)
    	miles = parseFloat(document.getElementById("mileage").value);
    var kilometre = 0;
    if(document.getElementById("km").value.length > 0)
    	kilometre = parseFloat(document.getElementById("km").value);
	miles = miles.toFixed(1);	
	kilometre = kilometre.toFixed(1);
    im += '&miles='+miles;
    im += '&kilometre='+kilometre;
    document.getElementById("route").value = im;
    //alert('Data for save: ' + im);
};

function gp(a) {
    if (O.length == 0) {
        var b = a.length;
        var c = 0;
        var d = new Array();
        var e = 0;
        var R = 0;
        while (c < b) {
            var g;
            var h = 0;
            var i = 0;
            do {
                g = a.charCodeAt(c++) - 63;
                i = i | (g & 31) << h;
                h = h + 5
            } while (g >= 32);
            var l;
            if (i & 1) {
                l = ~ (i >> 1);
            } else {
                l = i >> 1;
            }
            e = e + l;
            d.push(e);
            h = 0;
            i = 0;
            do {
                g = a.charCodeAt(c++) - 63;
                i = i | (g & 31) << h;
                h = h + 5;
            } while (g >= 32);
            var m;
            if (i & 1) m = ~ (i >> 1);
            else m = i >> 1;
            R = R + m;
            d.push(R)
        }
        return d;
    } else {
        var cI = a.split('a');
        return cI;
    }
};

function clearLinkHandler() {
    if (bRecordPoints || !snap_to_road) {
        if (confirm("Are you sure you want to clear the route you've created?\nClicking OK to will clear all points and stop recording.\nClicking Cancel will continue recording and leave points as they are.")) {
            B.splice(1, B.length - 1);
            ap.splice(0, ap.length);
            o.splice(0, o.length);
            F.splice(0, F.length);
            L.splice(0, L.length);
            ax.splice(0, ax.length);
            A.splice(0, A.length);
            V.splice(0, V.length);
            redomap.splice(0, redomap.length);
            an = 0;
            cP = 0;
            document.controlPanel.mileage.value = '0';
            document.controlPanel.lastLeg.value = '0';
            document.controlPanel.km.value = '0';
            //document.controlPanel.calories.value = '0';
            map.clearOverlays();
            aJ();
            bRecordPoints = true;
            //document.controlPanel.startRecording.value = 'Start recording';
           	routeExist = false;
            start_point = false;
            end_point = false;
            bE();
            O = '';
        }
    } else {
        alert('No points to clear');
    }
};

function aq(o) {
    if (o.length > 0) {
        if (bJ) {
            dG(o[0], hF);
            dG(o[o.length - 1], ik);
            for (var m = 0; m < ax.length; m++) {
                var cR;
                var bW = m + 1;
                if (bW < 11) {
                    cR = "unitMarker." + bW + ".png";
                } else {
                    cR = "unitMarker.php?nm=" + bW;
                }
                var icon = new GIcon();
                icon.image = cR;
                //icon.shadow = "http://www.google.com/mapfiles/shadow50.png";
                icon.iconSize = new GSize(20, 34);
                //icon.shadowSize = new GSize(37, 34);
                icon.iconAnchor = new GPoint(9, 34);
                //hR(ax[m], icon, m);
            }
        }
    } else {
        map.clearOverlays();
    }
};

var first_draw = false;
function dG(av, id) {
	if (Q[id]) {
        map.removeOverlay(Q[id]);
    }
    if(!first_draw){
    	Q[id] = new GMarker(av);
    	map.addOverlay(Q[id]);
    	first_draw = true;
    }
    else {
    	var icon = G_PAUSE_ICON;
        Q[id] = new GMarker(av, {icon:icon});
    	//Q[id] = new GMarker(av);
    	map.addOverlay(Q[id]);
    	first_draw = false;
    }
};

function gJ() {
    for (var m = 0; m < ax.length; m++) {
        if (Q[m] != undefined) {
            map.removeOverlay(Q[m]);
            Q[m] = undefined;
        }
    }
};

function hR(av, icon, D) {
    var jo = false;
    var kf = false;
    if (map.getBounds().contains(av)) {
        if (Q[D] == undefined) {
            Q[D] = new GMarker(av, icon);
            map.addOverlay(Q[D]);
        }
    } else {
        if (Q[D] != undefined) {
            map.removeOverlay(Q[D]);
            Q[D] = undefined;
        }
    }
};

function fL(bm, bj) {
    var dI, ed, fa, ft;
    var dH, er, fd, eS;
    dI = bm.minX;
    ed = bm.maxX;
    fa = bm.minY;
    ft = bm.maxY;
    dH = bj.minX;
    er = bj.maxX;
    fd = bj.minY;
    eS = bj.maxY;
    return !(dH > ed || er < dI || fd > ft || eS < fa);
};

function dF(aM) {
    ck[aV] = new GPolyline(aC, aM);
    map.addOverlay(ck[aV]);
    aV++;
    aC.splice(0, aC.length)
};

function aL(o) {
    for (var i = 0; i < aV; i++) {
        map.removeOverlay(ck[i]);
    }
    aV = 0;
    if (o.length > 0) {
        var aM;
        if (cF) {
            aM = '#0000FF';
        } else {
            aM = '#FF0000';
        }
        var cu = false;
        var fG = map.getBounds().getSouthWest();
        var fF = map.getBounds().getNorthEast();
        var fK = new GBounds(new Array(map.fromLatLngToDivPixel(fG), map.fromLatLngToDivPixel(fF)));
        var dh;
        var kq = new GPoint(0, 0);
        for (var C = 1; C < o.length; C++) {
            dh = new GBounds(new Array(map.fromLatLngToDivPixel(o[C]), map.fromLatLngToDivPixel(o[C - 1])));
            if (fL(fK, dh)) {
                if (!cu) {
                    aC.push(o[C - 1]);
                }
                aC.push(o[C]);
                cu = true;
            } else {
                cu = false;
                if (aC.length > 0) {
                    dF(aM);
                }
            }
        }
        if (aC.length > 0) {
            dF(aM);
        }
    }
};

function hw(M) {
    var az = document.controlPanel.units;
    if (M == ENGLISH) {
        az[0].checked = true;
        az[1].checked = false;
    } else if (M == METRIC) {
        az[0].checked = false;
        az[1].checked = true;
    }
};

function hg(gC) {
    var hD = parseInt(gC);
    for (var i = 0; i <= 2; i++) {
        if (i == hD) {
            document.controlPanel.legDraw[i].checked = true;
        } else {
            document.controlPanel.legDraw[i].checked = false;
        }
    }
};

function bX() {
    var ay;
    ay = fo;
    return ay;
};

function hd(ad, ab, gf) {
    var ay = false;
    if ((!ad) && (!ab) && (gf > 0)) {
        var aI = document.controlPanel.legDraw;
        if (aI[0].checked || aI[1].checked) {
            ay = true;
        }
    }
    return ay;
};

function ai() {
    var aA;
    var az = document.controlPanel.units;
    if (az[0].checked) {
        aA = ENGLISH;
    } else if (az[1].checked) {
        aA = METRIC;
    }
    return aA;
};

function dv(type) {
    var aA = ai();
    var ag;
    if (type == eo) {
        if (aA == METRIC) {
            ag = 1.609345;
        } else {
            ag = 1.0;
        }
    } else if (type == WEIGHT) {
        if (aA == METRIC) {
            ag = 0.45359237;
        } else {
            ag = 1.0;
        }
    } else if (type == dp) {
        if (aA == METRIC) {
            ag = 0.3048;
        } else {
            ag = 1.0;
        }
    }
    return ag;
};

function cl(cZ) {
    var ag = dv(dp);
    return cZ * ag;
};

function aw(gM) {
    return Math.round(gM * 100) / 100;
};

function al(cZ) {
    var ag = dv(eo);
    return cZ * ag;
};

function toggleMarkers(bb) {
    if (bb == SHOW) {
        bJ = true;
        //document.getElementById('markerSwitch').innerHTML = 'Turn <a href="javascript:toggleMarkers(HIDE);">off</a> mile markers';
    } else if (bb == HIDE) {
        bJ = false;
        //document.getElementById('markerSwitch').innerHTML = 'Turn <a href="javascript:toggleMarkers(SHOW);">on</a> mile markers';
    }
    bz();
    aq(o);
};

function toggleCalorieCounter(bb) {
    if (bb == SHOW) {
        //document.getElementById('calorieCounterSwitch').innerHTML = 'Turn <a href="javascript:toggleCalorieCounter(HIDE);">off</a> calorie counter';
        if (cY) {
            //document.getElementById('weightRow').style.display = 'block';
            //document.getElementById('calorieRow').style.display = 'block';
        } else {
            //document.getElementById('weightRow').style.display = 'table-row';
            //document.getElementById('calorieRow').style.display = 'table-row';
        }
    } else if (bb == HIDE) {
        //document.getElementById('calorieCounterSwitch').innerHTML = 'Turn <a href="javascript:toggleCalorieCounter(SHOW);">on</a> calorie counter';
        //document.getElementById('weightRow').style.display = 'none';
        //document.getElementById('calorieRow').style.display = 'none';
    }
};

function hl(M) {
    if (M != by) {
        //var aP = document.controlPanel.weight.value;
        var bU; //-->
        if (ai() == METRIC) {
            bU = parseFloat(aP) * .45359237; //-->
        } else {
            bU = parseFloat(aP) * 2.20462262;
        }
        //document.controlPanel.weight.value = bU;
        by = ai();
    }
};

function handleUnitToggle(M) {
    hl(M);
    eC(M);
    bz();
    aq(o);
    elevationSwitch(bg)
};

function eC(M) {
    if (M == METRIC) {
        document.getElementById("dstUnits1").innerHTML = "km";
        document.getElementById("dstUnits2").innerHTML = "km";
        document.getElementById("wtUnits").innerHTML = "kg";
    } else if (M == ENGLISH) {
        document.getElementById("dstUnits1").innerHTML = "miles";
        document.getElementById("dstUnits2").innerHTML = "miles";
        document.getElementById("wtUnits").innerHTML = "lb";
    }
    eP();
};

function eD(M) {
    if (M != ai()) {
        hw(M);
        eC(M);
    }
};

function geoCode() {
    var bp = document.locationSearch.zoom_level;
    var ge = parseInt(bp[bp.selectedIndex].value);
    if (document.locationSearch.country.selectedIndex == 0) {
        var gT = new GClientGeocoder();
        var ia = document.getElementById("locationBox").value;
        gT.getLatLng(ia, function (fi) {
            if (!fi) {
                alert("Sorry, couldn't find that location.");
            } else {
                map.setCenter(fi, ge);
            }
        });
    } else {
        var fc;
        fc = document.getElementById("locationBox").value + ',' + document.locationSearch.country[document.locationSearch.country.selectedIndex].value;
        var v = GXmlHttp.create();
        v.open("GET", "getLoc.php?srch=" + fc, true);
        v.onreadystatechange = function () {
            if (v.readyState == 4) {
                var dP = v.responseText;
                if (dP.length > 0) {
                    var dc = dP.split(',');
                    var ac = dc[0];
                    var aa = dc[1];
                    map.setCenter(new GLatLng(aa, ac), parseInt(bp[bp.selectedIndex].value));
                } else {
                    alert("Sorry, couldn't find that location. Please check your submission and try again.");
                }
            }
        };
        v.send(null);
    }
};

function showCountry() {
    var hc = document.locationSearch.country;
    hc.style.display = 'inline';
};

function printMap() {
    document.getElementById("searchBox").style.display = 'none';
    document.getElementById("copy").style.display = 'none';
    document.getElementById("printDone").style.display = 'block';
    document.getElementById("mapPane").style.left = '0';
    window.print();
};

function be() {
    var aj = document.getElementsByTagName('svg');
    if (aj.length > 0) {
        H = aj[0].parentNode;
        t = H.innerHTML;
        H.innerHTML = '';
        var ao = t.split('</svg>');
        for (var i = 0; i < ao.length - 1; i++) {
            var af = ao[i].toString() + '</svg>';
            var aX = GXml.parse(af);
            var r = aX.documentElement.getAttribute("style");
            aR(af, r);
        }
    }
};

function aR(bd, r) {
    var v = GXmlHttp.create();
    var result;
    v.open('POST', 'parseSvg.pl', true);
    v.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
    v.onreadystatechange = function () {
        if (v.readyState == 4) {
            aK(v.responseText, r);
        }
    };
    v.send('svg=' + escape(bd));
};

function aK(bD, r) {
    H.innerHTML += '<img src="parseSvg.pl?' + bD + '" style="' + r + '">';
};

function printDone() {
    document.getElementById("printDone").style.display = 'none';
    document.getElementById("searchBox").style.display = 'block';
    document.getElementById("copy").style.display = 'block';
    document.getElementById("mapPane").style.left = '30%';
    document.getElementById("mapPane").style.width = '70%';
    document.getElementById("mapPane").style.height = '96%';
    if ((typeof(t) != 'undefined') && (t.length > 0)) {
        H.innerHTML = '';
        t = '';
        aL(o);
    }
};

function dV(av, ar) {
    if (A[ar] == aF) {
        A[ar] = cj;
        var v = GXmlHttp.create();
        var result;
        v.open('GET', 'getElevation.php?x=' + av.lng() + '&y=' + av.lat(), true);
        v.onreadystatechange = function () {
            if (v.readyState == 4) {
                fJ(v.responseText, ar);
            }
        };
        v.send(null);
    }
};

function cC(aO, ar) {
    if (aO == aF) {
        A[ar] = null;
    } else {
        A[ar] = parseInt(aO * 100) / 100;
    }
};

function fJ(aO, ar) {
    an++;
    if (aO == "-32768") {
        cL = true;
        aO = "0";
    }
    var fT = parseFloat(aO) * 3.2808399;
    A[ar] = parseInt(fT * 100) / 100;
    aJ();
};

function dY() {
    if (ai() == METRIC) {
        return '62';
    } else {
        return '100';
    }
};

function fz(aD) {
    var aZ;
    var bw = 0;
    var bl = 0;
    var dm = 0;
    aZ = '';
    var hb = new String(aD);
    var bv = hb.split(";");
    var dZ = 50;
    var iJ;
    var cA = new Array(0);
    bu = '';
    for (var i = 0; i < bv.length; i++) {
        var fU = new String(bv[i]);
        var ho = fU.split(",");
        var at = parseFloat(ho[1]);
        if (i == 0) {
            bw = at;
            bl = at;
            dm = at;
        }
        if (at > bw) {
            bw = at;
        }
        if (at < bl) {
            bl = at;
        }
        bu = bu += aw(al(B[i + 1])) + ',' + aw(cl(A[i])) + ';';
        if ((i == bv.length - 1) || ((i + 1) % dZ == 0)) {
            eK = new String(bu);
            cA.push(eK.substr(0, eK.length - 1));
        }
        if ((i < bv.length - 2) && ((i + 1) % dZ == 0)) {
            bu = aw(al(B[i + 1])) + ',' + aw(cl(A[i])) + ';';
        }
    }
    var dk = aw(al(B[B.length - 1]));
    aZ += '<div style="width:' + (dY() * dk) + 'px">';
    for (var C = 0; C < cA.length; C++) {
        aZ += '<img style="margin:0px" src="drawGraph.php?elevDist=' + cA[C] + '&graphHeight=' + bg + '&pixelsPerUnit=' + dY() + '&min=' + bl + '&max=' + bw + '&start=' + dm + '&totalDistance=' + dat + '">';
    }
    aZ += '</div>';
    return aZ;
};

function aJ() {
    var aD = hZ();
    if ((A.length >= 2) && (!ew)) {
        if (an == o.length) {
            //document.getElementById("elevationChart").innerHTML = ((cL) ? gn : "") + fz(aD);
        } else {
            dx = Math.round((an / (o.length - 1)) * 100);
            //document.getElementById("elevationChart").innerHTML = '<span style="font-family:arial;font-size:10pt">Please wait, looking up elevations...' + dx + '%</span>';
        }
    } else {
        //document.getElementById("elevationChart").innerHTML = dN;
    }
};

function elevationSwitch(am) {
/*
    bg = am;
    if (am == 0) {
        document.getElementById("elevationSwitch0").innerHTML = unlinkElevation0;
        document.getElementById("elevationSwitch100").innerHTML = linkElevation100;
        document.getElementById("elevationSwitch200").innerHTML = linkElevation200;
        document.getElementById("elevationChart").style.display = "none";
        document.getElementById("elevationChart").style.height = am + "px";
        document.getElementById("map").style.height = mapHeight + "px";
    } else if (am == 100) {
        document.getElementById("elevationSwitch0").innerHTML = linkElevation0;
        document.getElementById("elevationSwitch100").innerHTML = unlinkElevation100;
        document.getElementById("elevationSwitch200").innerHTML = linkElevation200;
        document.getElementById("elevationChart").style.display = "block";
        document.getElementById("elevationChart").style.height = am + "px";
        document.getElementById("map").style.height = (mapHeight - 100) + "px";
    } else if (am == 200) {
        document.getElementById("elevationSwitch0").innerHTML = linkElevation0;
        document.getElementById("elevationSwitch100").innerHTML = linkElevation100;
        document.getElementById("elevationSwitch200").innerHTML = unlinkElevation200;
        document.getElementById("elevationChart").style.display = "block";
        document.getElementById("elevationChart").style.height = am + "px";
        document.getElementById("map").style.height = (mapHeight - 200) + "px";
    }
    if ((am == 100) || (am == 200)) {
        window.setTimeout('getElevationsAndDrawGraph()', 1);
    }
*/
};

function gN() {
    cL = false;
    an = 0;
    gc = false;
    dU();
};

function getElevationsAndDrawGraph() {
    dU();
    aJ();
};

function dU() {
    an = 0;
    for (var i = 0; i < o.length; i++) {
        aH = false;
        if (A[i] == aF) {
            dV(o[i], i);
        } else if (A[i] == cj) {} else {
            an++;
        }
    }
    aH = true;
};

function gd() {
    var cD = '';
    for (var i = 0; i < A.length; i++) {
        cD += Math.round(A[i] * 100);
        if (i < A.length - 1) {
            cD += 'b';
        }
    }
    var hJ = "1";
    return bg + 'a' + hJ + 'a' + cD;
};

function hZ() {
    var aD = '';
    for (i = 0; i < A.length; i++) {
        aD += aw(al(B[i + 1])) + ',' + aw(cl(A[i])) + ';';
        if ((A[i] != cj) && (A[i] != aF)) {
            ew = false;
        }
    }
    var eA = new String(aD);
    return eA.substring(0, eA.length - 1);
};

function bC() {
    if (cF == false) {
        if (aB()) {
            var bs = confirm("Your route has unsaved changes. Click OK to save, or cancel to continue without saving.");
            if (bs) {
                var O = bt();
                bB('lastRid', O, 365);
            }
        }
    }
};

function bt() {
    var v = GXmlHttp.create();
    v.open("POST", "saveRoute.php", false);
    v.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    v.send(eF());
    O = v.responseText;
    return O;
};

function as(bF) {
    var result = '';
    var cX = document.cookie.split(';');
    for (var i = 0; i < cX.length; i++) {
        if (cX[i].indexOf(bF + '=') > -1) {
            result = cX[i].substr(cX[i].indexOf('=') + 1);
            break;
        }
    }
    return result;
};

function bB(name, value, U) {
    var T = name + '=' + value + ';';
    var bM;
    if (U != 0) {
        var bH = 86400000;
        var J = new Date();
        J.setTime(J.setTime(J.getTime() + (U * bH)));
        T += "expires=" + J.toGMTString() + ";";
    }
    T += "path=/";
    document.cookie = T;
};

function bk() {
    var G = as('lastRid');
    if (aB()) {
        if (G != '0') {
            //document.getElementById('autoSaveMessage').innerHTML = '<a href="?r=' + G + '">Click here</a> to reload route ' + G + '.';
        }
    }
};

function aE() {
    //document.getElementById('autoSaveMessage').innerHTML = '';
};

function aB() {
    var G = as('lastRid');
    return (G.length > 0);
};
var aG;

function jX(message) {
    if (!aG) {
        aG = window.open('', '', '');
    }
    aG.document.write(message + '<br>');
};

function jW(message) {
    if (!aG) {
        aG = window.open('', '', '');
    }
    aG.document.write(message);
};

function svgon() {
    _mSvgEnabled = true;
    _mSvgForced = true;
};
