/*
		trackr!
		http://www.trackr.nl
		Copyright 2007-2009 Enodo B.V., all rights reserved.
		
		Version 030, 20091020
*/

var QUICKACCESSCODE = 1; var VIEWFRIENDS = 2; var VIEWMYPOSITION = 3; var VIEWSAVEDTRACK = 4; var VIEWPUBLICLIVE = 5; var currentScript; var L = new GIcon(); L.iconSize = new GSize(24, 24); L.shadowSize = new GSize(1, 1); L.iconAnchor = new GPoint(12, 12); L.infoWindowAnchor = new GPoint(0, 0); var I = new GIcon(); I.shadow = "http://www.google.com/mapfiles/shadow50.png"; I.iconSize = new GSize(20, 34); I.shadowSize = new GSize(37, 34); I.iconAnchor = new GPoint(9, 34); var aF = new GIcon(I, "http://www.google.com/mapfiles/dd-start.png"); var M = new GIcon(I, "http://www.google.com/mapfiles/dd-end.png"); var bW = new GIcon(); bW.image = "/images/icons/camera_icon2.png"; bW.iconSize = new GSize(20, 19); bW.iconAnchor = new GPoint(10, 19); bW.infoWindowAnchor = new GPoint(10, 1); var bs; var aC; var o = []; var bZ = ''; var bv; var icon = new GIcon(); icon.image = "http://labs.google.com/ridefinder/images/mm_20_red.png"; icon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png"; icon.iconSize = new GSize(12, 20); icon.shadowSize = new GSize(22, 20); icon.iconAnchor = new GPoint(6, 20); icon.infoWindowAnchor = new GPoint(5, 1); var X = []; X["OFFLINE"] = new GIcon(icon); X["CONNECTED_NOGPS"] = new GIcon(icon, "http://labs.google.com/ridefinder/images/mm_20_orange.png"); X["CONNECTED_VALIDGPS"] = new GIcon(icon, "http://labs.google.com/ridefinder/images/mm_20_green.png"); var B = 10; var an; var aj, ci; var aW; var aw = true; var G = 1; var bq = 1; var K = false; var A = 10; var MAX_VISIBLE_LOCATIONS = -1; var eY = false; var V; bs = new Array(); for (var x = 0; x < A; x++) { bs[x] = dU(255, 0, 0, 0, 255, 0, x, A); } OVERVIEWMAPCONTROL_WIDTH = 100; OVERVIEWMAPCONTROL_HEIGHT = 100; var aP = 0; var aN; var aA = 0; var aO = ''; var ca = true; var bY; var bI = false; var bX = null; var cL = null; var cJ = null; var yZ = new Array(); function setFirstTrackToLoad(ay) { aO = ay; }; function onLoad() { G = 2; if (typeof (photosEnabled) == 'undefined') photosEnabled = false; if (typeof (TIMEOUT_SECONDS_OVERRIDE) != 'undefined') B = TIMEOUT_SECONDS_OVERRIDE; var bN = "RadioTrackDisplay1"; var bM = bG('trkdsply'); if (bM == '2') { bN = "RadioTrackDisplay2"; bq = 2; } document.getElementById(bN).checked = true; if (currentScript == VIEWFRIENDS || currentScript == QUICKACCESSCODE || currentScript == VIEWMYPOSITION || currentScript == VIEWPUBLICLIVE) { an = true; document.getElementById("RadioButton2").checked = true; setFirstTrackToLoad(''); bI = true; } var bE = document.getElementById('LegendaSpeed'); for (var x = 0; x < A; x++) { var s = document.createElement('span'); s.className = 'speed'; s.style.borderColor = bs[x]; bE.appendChild(s); } if (GBrowserIsCompatible()) { aN = new GMap2(document.getElementById("map")); aN.addMapType(G_PHYSICAL_MAP); if (aO != '') LoadTrackData(aO); else dC(); aN.setCenter(new GLatLng(0, 0), 0); aN.addControl(new GSmallMapControl()); aN.addControl(new GScaleControl()); aN.addControl(new GHierarchicalMapTypeControl); aN.enableDoubleClickZoom(); aN.enableContinuousZoom(); aN.enableScrollWheelZoom(); if (typeof (adsEnabled) != 'undefined' && typeof (adsChannelId) != 'undefined') { if (adsEnabled && adsChannelId != '') { var eU = 2; if (typeof (maxAdsOnMap) != 'undefined') { if (maxAdsOnMap != '') { eU = maxAdsOnMap; } } var bS = new GAdsManager(aN, "ca-pub-2248979034789126", { "maxAdsOnMap": eU, "style": "adunit", "channel": adsChannelId }); bS.enable(); } } } }; function dJ(dec) { var bk = "0123456789ABCDEF"; if (dec < 0) return "00"; if (dec > 255) return "FF"; var i = Math.floor(dec / 16); var j = dec % 16; return bk.charAt(i) + bk.charAt(j) }; function dU(aL, aH, aK, aM, aI, aJ, ad, aa) { var red = Math.floor(aL * ((aa - ad) / aa) + aM * (ad / aa)); var green = Math.floor(aH * ((aa - ad) / aa) + aI * (ad / aa)); var blue = Math.floor(aK * ((aa - ad) / aa) + aJ * (ad / aa)); return "#" + dJ(red) + dJ(green) + dJ(blue) }; function dw() { aN.clearOverlays(); if (typeof (photosEnabled) != 'undefined') if (photosEnabled) cr(); yZ = new Array(); }; function az(cG, zoomlevel, maptype) { var clat = (cG.getNorthEast().lat() + cG.getSouthWest().lat()) / 2; var clng = (cG.getNorthEast().lng() + cG.getSouthWest().lng()) / 2; aN.setCenter(new GLatLng(clat, clng), zoomlevel, maptype); }; function dA(cG, ag) { var clat = (cG.getNorthEast().lat() + cG.getSouthWest().lat()) / 2; var clng = (cG.getNorthEast().lng() + cG.getSouthWest().lng()) / 2; if (G == 1) aN.panTo(new GLatLng(clat, clng)); else { aN.setCenter(new GLatLng(clat, clng), aN.getBoundsZoomLevel(cG) - 1, aN.getCurrentMapType()); } aP = aN.getZoom(); aN.savePosition(); }; function dk(H, bD, bF, bC, aG) { polylineEncoder = new PolylineEncoder(); for (var x = 0; x < H.length; x++) { if (bD == 2) { var bt = -1; var bw = new Array(); for (var y = 0; y < H[x].length; y++) { if (bX) aT = H[x][y].aT; else aT = H[x][y].cq(); if (bB(bC, aT) != bt) { bw[bw.length] = H[x][y].pos; if (bw.length > 2) { polyline = polylineEncoder.dpEncodeToGPolyline(bw, bF[bt], 5, .8); aN.addOverlay(polyline); } else { if (bw.length == 1) { bw[bw.length] = new GLatLng(bw[0].lat() + .00001, bw[0].lng() + .00001); } aN.addOverlay(new GPolyline(bw, bF[bB(bC, aT)], 5, .8)); } bw = new Array(); bw[bw.length] = H[x][y].pos; bt = bB(bC, aT); } else { bw[bw.length] = H[x][y].pos; if (y == (H[x].length - 1)) { if (bw.length > 2) { polyline = polylineEncoder.dpEncodeToGPolyline(bw, bF[bt], 5, .8); aN.addOverlay(polyline); } else { if (bw.length == 1) { bw[bw.length] = new GLatLng(bw[0].lat() + .00001, bw[0].lng() + .00001); } aN.addOverlay(new GPolyline(bw, bF[bt], 5, .8)); } } } } } else { var bw = new Array(); for (var y = 0; y < H[x].length; y++) { bw[bw.length] = H[x][y].pos; } if (bw.length > 2) { polyline = polylineEncoder.dpEncodeToGPolyline(bw, '#0000ff', 5, .5); aN.addOverlay(polyline); } else aN.addOverlay(new GPolyline(bw, '#0000ff')); } } if (!eY) { var ae = new GMarker(H[0][0].pos, aF); aN.addOverlay(ae); } if (aG) { var aE = new GMarker(H[H.length - 1][H[H.length - 1].length - 1].pos, M); aN.addOverlay(aE); } }; function bB(bC, aT) { var bA = -1; for (var x = 0; x < A; x++) { if (x == 0) { if (aT < bC[1]) { bA = 0; break; } } else if (aT <= bC[x + 1]) { bA = x + 1; break; } } return bA; }; function dT(aB) { if (aB >= 339 || aB <= 22) return "N"; if (aB >= 23 && aB <= 68) return "NE"; if (aB >= 69 && aB <= 114) return "E"; if (aB >= 115 && aB <= 160) return "SE"; if (aB >= 161 && aB <= 204) return "S"; if (aB >= 205 && aB <= 250) return "SW"; if (aB >= 251 && aB <= 295) return "W"; if (aB >= 296 && aB <= 338) return "NW"; else return "?"; }; function dQ() { if (typeof (al) != 'undefined') { if (al.tracks.length > 0) { return al.tracks[al.tracks.length - 1].positions[al.tracks[al.tracks.length - 1].positions.length - 1].id; } else return ''; } else return ''; }; function dC() { if (aw) { bp(); } document.getElementById("loadingstatus").innerHTML = "Loading data..."; document.getElementById("loadingstatus").style.visibility = "visible"; switch (currentScript) { case VIEWFRIENDS: GDownloadUrl("/service/TrackData.ashx?ttype=friends&id=" + (new Date()).getTime() + "&fid=" + checkedFriendId + "&lp=" + GetLastPositionIdFriends(), dD); break; case QUICKACCESSCODE: GDownloadUrl("/service/TrackData.ashx?ttype=qac&id=" + (new Date()).getTime() + "&qac=" + qac + "&lp=" + dQ(), dE); break; case VIEWMYPOSITION: GDownloadUrl("/service/TrackData.ashx?ttype=myposition&id=" + (new Date()).getTime() + "&lp=" + dQ(), dE); break; case VIEWPUBLICLIVE: GDownloadUrl("/service/TrackData.ashx?ttype=publiclive&id=" + (new Date()).getTime() + "&lp=" + dQ() + "&tuid=" + targetUserId, dE); break; } return false; }; function cb() { var cd = ''; if (bI) cd = '1'; else cd = '0'; GDownloadUrl("/service/TrackData.ashx?ttype=photos&tid=" + bY + "&lt=" + cd, ce); }; function aD(al, by, cg) { if (typeof (al.bx) == 'undefined' || by) { al.bx = -999999; al.bz = 999999; } var aT; var bu; if (al.tracks.length > 0) { for (var s = 0; s < al.tracks.length; s++) { for (var xx = 0; xx < al.tracks[s].positions.length; xx++) { aT = al.tracks[s].positions[xx].s; if (!cg) aT = cl(aT); if (aT > al.bx) { al.bx = aT; bu = true; } if (aT < al.bz) { al.bz = aT; bu = true; } } } } if (bu || by) { aC = new Array(); for (var x = 0; x < A; x++) { if (x == 0) aC[x] = al.bz; else if (x == (A - 1)) aC[x] = al.bx; else aC[x] = Math.round(x * ((al.bx - al.bz) / A)) + al.bz; } document.getElementById("legenda_minspeed").innerHTML = aC[0]; document.getElementById("legenda_medspeed").innerHTML = aC[Math.floor(A / 2)]; document.getElementById("legenda_maxspeed").innerHTML = aC[A - 1]; if (cg) cj = "(km/h)"; else cj = "(mph)"; document.getElementById("legenda_metric").innerHTML = cj; } }; function dE(data, aX) { if (typeof (V) != 'undefined') GEvent.removeListener(V); var cH = B; if (aX == 200) { var ap = JSON.parse(data, dx); var co = bX; if (ap.m == 1) bX = true; else bX = false; cH = ap.rt; if (co != null && co != bX) { al.bx = -999999; al.bz = 999999; K = true; } var aZ = true; if (typeof (al) == 'undefined') { al = ap; al.nN = true; } else aZ = dP(ap); dH(); if (al.tt == 2) aD(al, eY, bX); if (aZ || K) { K = false; cp(al); cQ(al); } document.getElementById("loadingstatus").style.visibility = "hidden"; bY = ap.tid; if (photosEnabled && ca) { ca = false; cb(); } } else if (aX == 403) window.location = "/Login.aspx"; else document.getElementById("loadingstatus").innerHTML = "Error getting data..."; if (an) aj = setTimeout('ax()', cH * 1000); V = GEvent.addListener(aN, "zoomend", function() { if (G == 2) { G = 3; document.getElementById("RadioButton3").checked = true; } }); }; function dH() { if (MAX_VISIBLE_LOCATIONS >= 0) { var eZ = 0; if (al.tracks.length > 0) { for (var s = 0; s < al.tracks.length; s++) { eZ += al.tracks[s].positions.length; } while (eZ > MAX_VISIBLE_LOCATIONS && al.tracks.length > 0) { if (al.tracks[0].positions.length > 0) { al.tracks[0].positions.shift(); eZ--; eY = true; } else al.tracks.shift(); } } } }; function bp() { aw = false; GEvent.addListener(aN, "dragend", function() { G = 3; document.getElementById("RadioButton3").checked = true; }); }; function ax() { if (an) dC(); }; function bl() { bg(); }; function cf() { cb(); }; function Dt(point, icon, aS, aV, aU, aB, aT, status, cg, iU, ba) { var markerOptions = { icon: icon, zIndexProcess: cz }; var ag = new GMarker(point, markerOptions); var html = ''; html += "<div style=\"float:left\">Status: <b>" + status + "</b></div><div style=\"float:right;border:solid #9493A0 1px;text-align:center;font-size:11px;padding: 0px 1px 0px 1px;margin-right:-2px\" onclick=\"fY(" + yZ.length + ", '" + ba + "');\" class=\"close\">X</div><br />"; html += "Last received information:<br /><b>" + aS.toLocaleString().substring(aS.toLocaleString().indexOf(" ") + 1) + "</b><br />"; if (cg) cj = "km/h"; else cj = "mph"; html += "Speed: <b>" + aT + " " + cj + "</b> "; html += "Heading: <b>" + dT(aB) + "</b><br />"; ag.cw = 1; var uI = new ELabel(point, '<div class="tooltip">' + html + '</div>', "", new GSize(-80, -20), 95, false, 1); if (!iU) { uI.hide(); } ag.uI = uI; GEvent.addListener(ag, "click", function() { uI.show(); if (currentScript == VIEWFRIENDS) { for (var x = 0; x < n.length; x++) { if (n[x].id == ba) { n[x].nN = true; break; } } } else al.nN = true; }); yZ.push(uI); aN.addOverlay(uI); return ag; }; function fY(x, ba) { yZ[x].hide(); if (currentScript == VIEWFRIENDS) { for (var x = 0; x < n.length; x++) { if (n[x].id == ba) { n[x].nN = false; break; } } } else al.nN = false; }; function dP(ah) { var as = false; if (al.tid != ah.tid) { al.tracks = new Array(); al.tid = ah.tid; as = true; bZ = ''; } if (al.status != ah.status) as = true; al.status = ah.status; al.name = ah.name; if (typeof (al.tracks) != 'undefined') { for (var c = 0; c < ah.tracks.length; c++) { var aq = false; for (var q = 0; q < al.tracks.length; q++) { if (al.tracks[q].id == ah.tracks[c].id) { for (var a = 0; a < ah.tracks[c].positions.length; a++) { al.tracks[q].positions[al.tracks[q].positions.length] = ah.tracks[c].positions[a]; as = true; } aq = true; break; } } if (!aq) { al.tracks[al.tracks.length] = ah.tracks[c]; as = true; } } } return as; }; function cp(al) { var H = []; var cG = new GLatLngBounds(); dw(); if (al.tracks.length > 0) { for (var s = 0; s < al.tracks.length; s++) { positions = []; for (var xx = 0; xx < al.tracks[s].positions.length; xx++) { if (al.tracks[s].positions[xx].la != "" || al.tracks[s].positions[xx].lo != "") { var af = new GLatLng(al.tracks[s].positions[xx].la, al.tracks[s].positions[xx].lo); var position = new ck(); position.pos = af; position.aT = al.tracks[s].positions[xx].s; positions.push(position); if (G == 2) { cG.extend(af); if (al.tt == 3) { cG.extend(ac(af, 0, al.tracks[s].positions[xx].r)); cG.extend(ac(af, 180, al.tracks[s].positions[xx].r)); } } } } H.push(positions); } var J = al.tracks.length; var aQ = al.tracks[J - 1].positions.length; am = al.tracks[J - 1].positions[aQ - 1]; if (G == 1) cG.extend(new GLatLng(am.la, am.lo)); if (G != 3) dA(cG); if (al.tt == "2") { am.smph = cl(am.s); dk(H, bq, bs, aC, false); } else { var center = new GLatLng(al.tracks[0].positions[al.tracks[0].positions.length - 1].la, al.tracks[0].positions[al.tracks[0].positions.length - 1].lo); for (var x = 0; x < al.tracks[0].positions.length; x++) { var center = new GLatLng(al.tracks[0].positions[x].la, al.tracks[0].positions[x].lo); cx(center, al.tracks[0].positions[x].r); } } } var ai = new GLatLng(am.la, am.lo); var Y, ao; switch (al.status) { case 0: Y = X["OFFLINE"]; Z = "/images/mm_20_red.png"; ao = "Offline"; break; case 10: Y = X["CONNECTED_NOGPS"]; Z = "/images/mm_20_orange.png"; ao = "Online, no GPS"; break; case 50: Y = X["CONNECTED_VALIDGPS"]; Z = "/images/mm_20_green.png"; ao = "Online, GPS ok"; break; } if (bX) aT = am.s; else aT = am.smph; var ag = Dt(ai, Y, am.ts, am.la, am.lo, am.h, aT, ao, bX, al.nN); aN.addOverlay(ag); var label = new ELabel(ai, al.name, "maplabel", new GSize((al.name.length * -3.5), 15), 75, false, -1); aN.addOverlay(label); }; function AutoZoomSettingChanged(au) { if (typeof (V) != 'undefined') GEvent.removeListener(V); var at = G; var ar = false; G = au; if (G != at && G != 3) { var cG = new GLatLngBounds(); if (al.tracks.length > 0) { for (var s = 0; s < al.tracks.length; s++) { for (var xx = 0; xx < al.tracks[s].positions.length; xx++) { var af = new GLatLng(al.tracks[s].positions[xx].la, al.tracks[s].positions[xx].lo); if (G == 2) cG.extend(af); } } var J = al.tracks.length; var aQ = al.tracks[J - 1].positions.length; am = al.tracks[J - 1].positions[aQ - 1]; if (G == 1) cG.extend(new GLatLng(am.la, am.lo)); if (G != 3) dA(cG); } } V = GEvent.addListener(aN, "zoomend", function() { if (G == 2) { G = 3; document.getElementById("RadioButton3").checked = true; } }); }; function TrackDisplaySettingChanged(au) { if (bq != au) { bq = au; if (currentScript == VIEWFRIENDS) cI(n); else if (currentScript == VIEWSAVEDTRACK) { dw(); dk(bv, bq, bs, aC, true); } else cp(al); bn('trkdsply', au, 31, '/', '', ''); } }; function dD(data, aX) { var cH = B; if (typeof (V) != 'undefined') GEvent.removeListener(V); if (aX == 200) { var ap = JSON.parse(data, dx); cH = ap.rt; var aZ = true; if (typeof (n) == 'undefined') { n = ap.friends; for (var x = 0; x < n.length; x++) { n[x].nN = false; } } else aZ = dF(ap.friends); if (aZ || K) { K = false; cI(n); } document.getElementById("loadingstatus").style.visibility = "hidden"; } else if (aX == 403) window.location = "/Login.aspx"; else document.getElementById("loadingstatus").innerHTML = "Error getting data..."; if (an) aj = setTimeout('ax()', cH * 1000); V = GEvent.addListener(aN, "zoomend", function() { if (G == 2) { G = 3; document.getElementById("RadioButton3").checked = true; } }); }; function FriendClicked(ba) { if (n.length > 0) { for (var x = 0; x < n.length; x++) { if (n[x].id == ba) { aN.panTo(new GLatLng(n[x].la, n[x].lo)); n[x].nN = true; n[x].ag.uI.show(); break; } } } }; function FriendChecked(bi, ba) { var bh = bi.form[bi.name]; for (var c = 0; c < bh.length; c++) if (bh[c] != bi) bh[c].checked = false; for (var x = 0; x < n.length; x++) { if (n[x].id == checkedFriendId) { n[x].nN = false; break; } } if (!bi.checked) { checkedFriendId = ""; G = 2; document.getElementById("RadioButton2").checked = true; document.getElementById("legenda_minspeed").innerHTML = ''; document.getElementById("legenda_medspeed").innerHTML = ''; document.getElementById("legenda_maxspeed").innerHTML = ''; document.getElementById("legenda_metric").innerHTML = ''; yU(); } else { checkedFriendId = ba; G = 2; document.getElementById("RadioButton2").checked = true; for (var x = 0; x < n.length; x++) { if (n[x].id == ba) { n[x].nN = true; bX = n[x].m; break; } } } am = ""; if (an) clearTimeout(aj); K = true; dC(); }; function cI(n) { var H = []; var cG = new GLatLngBounds(); var ar = false; var aY = ""; dw(); if (n.length > 0) { for (var x = 0; x < n.length; x++) { if (n[x].st > -1) { var af = new GLatLng(n[x].la, n[x].lo); if (!ar && (G != 3 || !an)) cG.extend(af); var Y, ao; switch (n[x].st) { case 0: Y = X["OFFLINE"]; Z = "/images/mm_20_red.png"; ao = "Not connected"; break; case 10: Y = X["CONNECTED_NOGPS"]; Z = "/images/mm_20_orange.png"; ao = "Connected, no GPS"; break; case 50: Y = X["CONNECTED_VALIDGPS"]; Z = "/images/mm_20_green.png"; ao = "Connected, GPS ok"; break; } var bj = ""; if (n[x].id == checkedFriendId) bj = " checked"; aY += '<img src="' + Z + '" class="sidebaricon" />' + '<input type="checkbox" class="sidebarcheckbox" name="CheckboxShowTrack" onclick="JavaScript:FriendChecked(this, \'' + n[x].id + '\');"' + bj + '>' + '<a href="JavaScript:FriendClicked(\'' + n[x].id + '\');">' + n[x].name + '</a><br />'; if (n[x].m == 1) aT = n[x].s; else aT = cl(n[x].s); var ag = Dt(af, Y, n[x].ts, n[x].la, n[x].lo, n[x].h, aT, ao, n[x].m, n[x].nN, n[x].id); n[x].ag = ag; var label = new ELabel(af, n[x].name, "maplabel", new GSize((n[x].name.length * -3.5), 15), 75, false, -1); if (n[x].id == checkedFriendId) { aD(n[x], true, n[x].m == 1); ar = true; cG = new GLatLngBounds(); if (G != 3 || !an) cG.extend(new GLatLng(n[x].la, n[x].lo)); var al = n[x].tracks; if (al.length > 0) { for (var s = 0; s < al.length; s++) { positions = []; for (var xx = 0; xx < al[s].positions.length; xx++) { var af = new GLatLng(al[s].positions[xx].la, al[s].positions[xx].lo); var position = new ck(); position.pos = af; position.aT = al[s].positions[xx].s; positions.push(position); if (G == 2 || !an) cG.extend(af); } H.push(positions); } if (G == 1 || G == 2 || !an) dA(cG); dk(H, bq, bs, aC, false); cQ(n[x]); } } aN.addOverlay(ag); aN.addOverlay(label); } else if (n[x].st == -1) { aY += '<img src="/images/mm_20_nodata.png" width="8" height="13" align="bottom" style="padding-right: 18px;" />' + n[x].name + '<br />'; } } } document.getElementById("friendssidebar").innerHTML = aY; if (G == 1 || G == 2 || !an) dA(cG); }; function dF(friends) { var as = false; for (var x = 0; x < friends.length; x++) { for (var y = 0; y < n.length; y++) { if (n[y].id == friends[x].id) { if (n[y].st != friends[x].st || n[y].la != friends[x].la || n[y].lo != friends[x].lo || n[y].h != friends[x].h || n[y].s != friends[x].s || n[y].m != friends[x].m) as = true; n[y].st = friends[x].st; n[y].ts = friends[x].ts; n[y].la = friends[x].la; n[y].lo = friends[x].lo; n[y].h = friends[x].h; n[y].s = friends[x].s; n[y].m = friends[x].m; if (n[y].tid != friends[x].tid) { n[y].tracks = new Array(); n[y].tid = friends[x].tid; as = true; } if (friends[x].tracks.length > 0) { for (var c = 0; c < friends[x].tracks.length; c++) { var aq = false; for (var q = 0; q < n[y].tracks.length; q++) { if (n[y].tracks[q].id == friends[x].tracks[c].id) { for (var a = 0; a < friends[x].tracks[c].positions.length; a++) { n[y].tracks[q].positions[n[y].tracks[q].positions.length] = friends[x].tracks[c].positions[a]; as = true; } aq = true; break; } } if (!aq) { n[y].tracks[n[y].tracks.length] = friends[x].tracks[c]; as = true; } } } } } } return as; }; function GetLastPositionIdFriends() { if (checkedFriendId != '') { for (var x = 0; x < n.length; x++) { if (n[x].id == checkedFriendId) { var al = n[x].tracks; if (al.length > 0) { return al[al.length - 1].positions[al[al.length - 1].positions.length - 1].id; } else return ''; } } } else return ''; }; function AutoZoomSettingChangedFriends(au) { if (typeof (V) != 'undefined') GEvent.removeListener(V); var at = G; var ar = false; G = au; if (G != at && G != 3) { var cG = new GLatLngBounds(); if (n.length > 0) { for (var x = 0; x < n.length; x++) { if (n[x].st > -1) { if (!ar) { var af = new GLatLng(n[x].la, n[x].lo); cG.extend(af); } if (n[x].id == checkedFriendId) { ar = true; cG = new GLatLngBounds(); cG.extend(new GLatLng(n[x].la, n[x].lo)); al = n[x].tracks; if (al.length > 0) { for (var s = 0; s < al.length; s++) { for (var xx = 0; xx < al[s].positions.length; xx++) { if (G == 2) { var af = new GLatLng(al[s].positions[xx].la, al[s].positions[xx].lo); cG.extend(af); } } } } } } } } dA(cG); } V = GEvent.addListener(aN, "zoomend", function() { if (G == 2) { G = 3; document.getElementById("RadioButton3").checked = true; } }); }; function LoadTrackData(tid) { document.getElementById("loadingstatus").innerHTML = "Loading data..."; document.getElementById("loadingstatus").style.visibility = "visible"; bZ = ''; GDownloadUrl("/service/TrackData.ashx?tid=" + tid + "&ttype=saved&id=" + (new Date()).getTime(), be); return false; }; function be(data, aX) { if (aX == 200) { var ap = JSON.parse(data, dx); o = ap; var bV; bV = document.getElementById("t_title"); if (bV != null) bV.innerHTML = ap.title; bV = document.getElementById("t_desc"); if (bV != null) bV.innerHTML = ap.description; bV = document.getElementById("t_start"); if (bV != null) bV.innerHTML = ap.start; bV = document.getElementById("t_stop"); if (bV != null) bV.innerHTML = ap.stop; bV = document.getElementById("t_from"); if (bV != null) bV.innerHTML = ap.from; bV = document.getElementById("t_to"); if (bV != null) bV.innerHTML = ap.to; bV = document.getElementById("t_dist"); if (bV != null) bV.innerHTML = ap.totaldistance; bV = document.getElementById("t_duration"); if (bV != null) bV.innerHTML = ap.duration; bV = document.getElementById("t_avgspeed"); if (bV != null) bV.innerHTML = ap.avgspeed; if (ap.m == 1) bX = true; else bX = false; aD(o, false, bX); bv = new Array(); cG = new GLatLngBounds(); dw(); if (o.tracks.length > 0) { for (var s = 0; s < o.tracks.length; s++) { positions = []; for (var x = 0; x < o.tracks[s].positions.length; x++) { var af = new GLatLng(o.tracks[s].positions[x].la, o.tracks[s].positions[x].lo); var position = new ck(); position.pos = af; position.aT = o.tracks[s].positions[x].s; positions.push(position); cG.extend(af); } bv.push(positions); } dA(cG); dk(bv, bq, bs, aC, true); setTimeout('cQ(o)', 1 * 1000); } document.getElementById("loadingstatus").style.visibility = "hidden"; bY = ap.tid; bI = false; if (photosEnabled) cb(); } else document.getElementById("loadingstatus").innerHTML = "Error loading track data..."; }; function onMiniMapLoad() { if (typeof (TIMEOUT_SECONDS_OVERRIDE) != 'undefined') B = TIMEOUT_SECONDS_OVERRIDE; if (GBrowserIsCompatible()) { aN = new GMap2(document.getElementById("map")); aN.disableDragging(); GEvent.addListener(aN, "click", function(ag, point) { window.open(clickUrl); }); bm(); } }; function bm() { aW = document.createElement("div"); var opacity = 80; if (typeof (aW.style.filter) == 'string') { aW.style.filter = 'alpha(opacity:' + opacity + ')'; } if (typeof (aW.style.KHTMLOpacity) == 'string') { aW.style.KHTMLOpacity = opacity / 100; } if (typeof (aW.style.MozOpacity) == 'string') { aW.style.MozOpacity = opacity / 100; } if (typeof (aW.style.opacity) == 'string') { aW.style.opacity = opacity / 100; } aN.getPane(G_MAP_FLOAT_PANE).appendChild(aW); if (!sl) { GEvent.addListener(aN, "mouseover", function() { aW.style.visibility = "hidden" }); } if (initialLivePosition != '') { var liveposition = JSON.parse(initialLivePosition, dx); bb(liveposition); if (B > 0) aj = setTimeout('bl()', B * 1000); } else { var cG = new GLatLngBounds(); var af = new GLatLng(0, 0); cG.extend(af); zoomlevel = 0; az(cG, zoomlevel, maptype); } }; function bg() { GDownloadUrl("/service/TrackData.ashx?ttype=livepos&id=" + (new Date()).getTime() + "&uid=" + userId, bf); return false; }; function bf(data, aX) { var cH = B; if (aX == 200) { if (data != '') { var liveposition = JSON.parse(data, dx); bb(liveposition); cH = liveposition.rt; } } aj = setTimeout('bl()', cH * 1000); }; function bb(liveposition) { var cG = new GLatLngBounds(); dw(); var af = new GLatLng(liveposition.la, liveposition.lo); cG.extend(af); var Y, ao; switch (liveposition.st) { case 0: Y = X["OFFLINE"]; Z = "/images/mm_20_red.png"; ao = "Offline"; break; case 10: Y = X["CONNECTED_NOGPS"]; Z = "/images/mm_20_orange.png"; ao = "Online, no GPS"; break; case 50: Y = X["CONNECTED_VALIDGPS"]; Z = "/images/mm_20_green.png"; ao = "Online, GPS ok"; break; } az(cG, zoomlevel, maptype); if (liveposition.m == 1) aT = liveposition.s; else aT = cl(liveposition.s); var ag = bc(af, Y, liveposition.ts, liveposition.la, liveposition.lo, liveposition.h, aT, ao, liveposition.m == 1); aN.addOverlay(ag); if (sl) bd(ag); }; function bc(point, icon, aS, aV, aU, aB, aT, status, cg) { var ag = new GMarker(point, icon); if (cg) cj = "km/h"; else cj = "mph"; var html = "<b>" + status + "</b><br />"; html += "<b>" + aS.toLocaleString().substring(aS.toLocaleString().indexOf(" ") + 1) + "</b><br />"; html += "Heading: <b>" + dT(aB) + " " + aT + " " + cj + "</b><br />"; ag.tooltip = '<div class="tooltip">' + html + '</div>'; if (!sl) { GEvent.addListener(ag, "mouseover", function() { bd(ag); }); GEvent.addListener(ag, "mouseout", function() { aW.style.visibility = "hidden" }); } return ag; }; function bd(ag) { aW.innerHTML = ag.tooltip; var point = aN.getCurrentMapType().getProjection().fromLatLngToPixel(aN.fromDivPixelToLatLng(new GPoint(0, 0), true), aN.getZoom()); var ak = aN.getCurrentMapType().getProjection().fromLatLngToPixel(ag.getPoint(), aN.getZoom()); var anchor = ag.getIcon().iconAnchor; var width = ag.getIcon().iconSize.width; var height = aW.clientHeight; var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(ak.x - point.x - anchor.x + width - 78, ak.y - point.y - anchor.y - height)); pos.apply(aW); aW.style.visibility = "visible"; if (height == 0) { height = aW.clientHeight; pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(ak.x - point.x - anchor.x + width - 78, ak.y - point.y - anchor.y - height)); pos.apply(aW); } }; function bn(name, value, expires, bU, domain, bT) { var bQ = new Date(); bQ.setTime(bQ.getTime()); if (expires) { expires = expires * 1000 * 60 * 60 * 24; } var bP = new Date(bQ.getTime() + (expires)); document.cookie = name + "=" + escape(value) + ((expires) ? ";expires=" + bP.toGMTString() : "") + ((bU) ? ";path=" + bU : "") + ((domain) ? ";domain=" + domain : "") + ((bT) ? ";secure" : ""); }; function bG(bR) { var bL = document.cookie.split(';'); var bH = ''; var bJ = ''; var bO = ''; var bK = false; for (i = 0; i < bL.length; i++) { bH = bL[i].split('='); bJ = bH[0].replace(/^\s+|\s+$/g, ''); if (bJ == bR) { bK = true; if (bH.length > 1) { bO = unescape(bH[1].replace(/^\s+|\s+$/g, '')); } return bO; break; } bH = null; bJ = ''; } if (!bK) { return null; } }; function ce(data, aX) { var cH = B * 3; if (aX == 200) { var ap = JSON.parse(data, dx); bZ = ap; cr(); cH = ap.rt; } ci = setTimeout('cf()', cH * 1000) }; function cr() { if (bZ != '') { var photos = bZ.photos; if (photos.length > 0) { for (var x = 0; x < photos.length; x++) { var html = "<div style=\"min-width:240px;min-height:200px\"><b>" + photos[x].title + "</b><br /><a href=\"" + photos[x].wu + "\" target=\"_blank\"><img style=\"max-width:240px;max-height=240px\" src=\"" + photos[x].mu + "\" border=\"0\"></a></div>"; var ag = cc(new GLatLng(photos[x].la, photos[x].lo), html); aN.addOverlay(ag); } } } }; function cc(point, html) { var ag = new GMarker(point, bW); ag.bindInfoWindowHtml(html); return ag; }; function cl(cn) { return Math.round(cn / 1.609344); }; function ck() { this.aT = 0; this.cq = function() { return Math.round(this.aT / 1.609344); } }; function cx(center, g) { var projection = aN.getCurrentMapType().getProjection(); var R = 6371000; var aR = center.lat() * Math.PI / 180; var cD = center.lng() * Math.PI / 180; var cu = Math.asin(Math.sin(aR) * Math.cos(g / R) + Math.cos(aR) * Math.sin(g / R) * Math.cos(0)); var cs = cD + Math.atan2(Math.sin(0) * Math.sin(g / R) * Math.cos(aR), Math.cos(g / R) - Math.sin(aR) * Math.sin(cu)); cu = cu * 180 / Math.PI; cs = cs * 180 / Math.PI; var cE = new GLatLng(cu, cs); var cA = '#4290ff'; var av = projection.fromLatLngToPixel(center, aN.getZoom()); var cy = projection.fromLatLngToPixel(cE, aN.getZoom()); var ct = Array(); with (Math) { cC = floor(sqrt(pow((av.x - cy.x), 2) + pow((av.y - cy.y), 2))); for (var a = 0; a < 361; a += 20) { var cF = a * (PI / 180); var y = av.y + cC * sin(cF); var x = av.x + cC * cos(cF); var p = new GPoint(x, y); var point = projection.fromPixelToLatLng(p, aN.getZoom()); ct.push(point); } cB = new GPolygon(ct, '#000000', 1, 1, cA, .4); aN.addOverlay(cB); } }; function cz(ag, b) { if (typeof (ag.cw) == 'undefined') return GOverlay.getZIndex(ag.getPoint().lat()); else return GOverlay.getZIndex(ag.getPoint().lat()) + ag.cw * 1000000; }; function ac(center, cv, ab) { var R = 6371000; var aR = center.lat() * Math.PI / 180; var cD = center.lng() * Math.PI / 180; cv = cv * Math.PI / 180; var cu = Math.asin(Math.sin(aR) * Math.cos(ab / R) + Math.cos(aR) * Math.sin(ab / R) * Math.cos(cv)); var cs = cD + Math.atan2(Math.sin(cv) * Math.sin(ab / R) * Math.cos(aR), Math.cos(ab / R) - Math.sin(aR) * Math.sin(cu)); cs = (cs + Math.PI) % (2 * Math.PI) - Math.PI; if (isNaN(cu) || isNaN(cs)) return null; return new GLatLng(cu * 180 / Math.PI, cs * 180 / Math.PI); }; function cQ(uU) { if (typeof useGraph != "undefined" && typeof (uU) != "undefined") { if (useGraph && graphReady) { var cK = []; cK.push("["); var dn = 0; var dy; if (uU.tracks.length > 0) { for (var s = 0; s < uU.tracks.length; s++) { for (var xx = 0; xx < uU.tracks[s].positions.length; xx++) { if (uU.tracks[s].positions[xx].la != "" || uU.tracks[s].positions[xx].lo != "") { dy = uU.tracks[s].positions[xx].ts.getTime() / 1000; cK.push('{"x":' + uU.tracks[s].positions[xx].ts.getTime() / 1000 + ','); if (bX) cK.push('"y":' + uU.tracks[s].positions[xx].s); else cK.push('"y":' + Math.round(uU.tracks[s].positions[xx].s / 1.609344)); cK.push(', "on-click":"a1(' + dn + ')"},'); dn++; } } cK.push(null); } } cK.push("]"); var cj; if (bX) cj = "km/h"; else cj = "mph"; var dm = de(cK, uU.tracks[0].positions[0].ts.getTime() / 1000, dy, uU.bx, cj); document.getElementById("TrackChart").load(dm); } } }; function rg() { cQ(); }; function de(cO, dz, dr, bx, cj) { var data = []; if (dz == dr) dr = dz + 1; ef = Math.round((dr - dz) / 7); if (ef < 1) ef = 0; data.push('{'); data.push('"bg_colour":"#FFFFFF",'); data.push('"x_axis": {'); data.push('            "min": ' + dz + ','); data.push('            "max": ' + dr + ','); data.push('            "steps": ' + ef + ','); data.push('			"labels": {'); data.push('			    "rotate":"horizontal",'); data.push('			    "steps": ' + ef + ','); data.push('			    "visible-steps":1,'); data.push('                "text":"#date:H:i#" 	'); data.push('		    },'); data.push('		    "grid-colour": "#DDDDDD"'); data.push('      },'); data.push('      "area-style":{"colour":"#b0101c", "alpha":0.5, "y":0 },'); data.push('      "elements":['); data.push('        {'); data.push('          "values" :'); data = data.concat(cO); data.push(','); data.push('          "type":      "scatter_line",'); data.push('          "colour":	   "#EDC240",'); data.push('          "width": 3,'); data.push('          "dot-size": 3,'); data.push('          "tip":       "#date:H:i:s#<br>#y# ' + cj + '",'); data.push('	        "dot-style": { "type":"anchor", "hollow":"true", '); data.push('	        "sides":6,'); data.push('            "background-colour":"#ffffff", "background-alpha": 0.8,'); data.push('            "width":2,'); data.push('             },'); data.push('             "area-style": { "colour":"#F8E489", "y":0}'); data.push('        }]'); data.push('        ,'); data.push('      "tooltip":{'); data.push('        "shadow":true,'); data.push('        "stroke":1,'); data.push('        "mouse":0,'); data.push('        "colour":"#EDC240",'); data.push('        "background":"#ffffff",'); data.push('        "title":"{font-size: 11px; color: #905050;}",'); data.push('        "body":"{font-size: 11px; color: #905050;}",'); data.push('        "text":"title<br>body"'); data.push('      },'); data.push('      "y_axis": {'); data.push('        "min":    0,'); data.push('        "max":' + (bx + 10) + ','); data.push('        "stroke": 2,'); data.push('        "steps" :' + ((Math.round((bx + 10) / 10) * 10) / 5) + ','); data.push('        "ak": 0,'); data.push('        "grid-colour": "#DDDDDD"'); data.push('      }'); data.push('    }'); return data.join(''); }; function yU() { if (typeof useGraph != "undefined") { if (useGraph) { var data = { "bg_colour": "#FFFFFF", "elements": [{ "type": "scatter_line"}], "x_axis": { "grid-colour": "#FFFFFF", "min": 0, "max": 1, "labels": { "steps": 0, "visible-steps": 0, "text": ""} }, "y_axis": { "grid-colour": "#FFFFFF", "steps": 0, "max": 0} }; document.getElementById("TrackChart").load(JSON.stringify(data)); } } }; function a1(item) { if (item != null) { var cP = 0; var hD; if (currentScript == VIEWFRIENDS) { for (var x = 0; x < n.length; x++) { if (n[x].id == checkedFriendId) { hD = n[x]; break; } } } else if (currentScript == VIEWSAVEDTRACK) hD = o; else hD = al; for (var x = 0; x < hD.tracks.length; x++) { if ((cP + hD.tracks[x].positions.length) >= item) { var point = new GLatLng(hD.tracks[x].positions[item - cP].la, hD.tracks[x].positions[item - cP].lo); if (cJ == null || (point.lat() != cJ.lat() && point.lng() != cJ.lng())) { if (cL != null) { aN.removeOverlay(cL); } cJ = point; cL = new GMarker(cJ); aN.addOverlay(cL); aN.panTo(cJ); } return; } cP += hD.tracks[x].positions.length; } hD = null; } }; function dx(dq, value) { var d; if (dq === 'ts' && typeof value === 'string' && value.slice(0, 5) === 'Date(' && value.slice(-1) === ')') { d = new Date(parseInt(value.slice(5, -1))); if (d) { return d; } } return value; } 
