//alert("The map is currently going through some unscheduled maintenance to comply with google's latest round of updates. We'll be done shortly, and you are welcome to continue using it during the maintenance phase but be warned: you may experience some odd behavior.");
//7-20-09 Serhiy: Showing/Hiding elements made easier
function toggle(id){var elem = id_to_elem(id);if(is_vis(elem)){hide_e(elem);}else{show_e(elem);}}
function show(id){show_e(id_to_elem(id));}
function hide(id){hide_e(id_to_elem(id));}
function id_to_elem(id){return document.getElementById(id);}
function show_e(elem){elem.style.display='block';}
function hide_e(elem){elem.style.display='none';}
function is_vis(elem){if(elem.style.display == 'none'){return false;}else{return true;}}
function is_in_dom(elem){if(elem == null || elem == undefined){return false;}else{return true;}}

function changeCity(newLoc){
    nextPage = newLoc.options[newLoc.selectedIndex].value
    if (nextPage == "1"){
        lat = 38.861;
        lng = -86.487;
    }
    else if (nextPage == "2") {
        lat = 39.165;
        lng = -86.526;
    }
    else if (nextPage == "3"){
        lat = 39.427;
        lng = -86.428;
    }
    else if (nextPage == "4"){
        lat = 39.612;
        lng = -86.374;
    }
    else {
        lat = 39.165;
        lng = -86.526;
    }
    //MAKE SURE TO CLEAR POINTS
    load();
}

function load() {
    if (GBrowserIsCompatible()) {
        var centerPoint = new GLatLng(lat, lng);

        map = new GMap2(document.getElementById("map"),{draggableCursor:"crosshair"});
        map.setCenter(centerPoint, 15);
        getMapcenter();

        map.addControl(new GMapTypeControl());
        map.addControl(new GScaleControl());
        map.addControl(new GLargeMapControl());

        map.enableContinuousZoom();
        GEvent.addListener(map, "moveend", getMapcenter);
        GEvent.addListener(map, "click", mapClick);

        //  ======== Add a map overview ==========
        var ovcontrol = new GOverviewMapControl(new GSize(120,120));
        map.addControl(ovcontrol);

        return;
        var pl = new GPolyline.fromEncoded({
        color: "#0000ff",
        weight: 4,
        opacity: 0.8,
        points: "_gkxEr}|vNcBwBoAoA{Jg@cBcBoA{@S?uBoA}@wBS_DbBwhATg@c[sDiT}\\g@i@{@S{@{@ScBRSnAg@SoAS{Eg@kCkClH?nAoF`LQRU{E~CgJ?g@jCqNrNcGz@?zJyBf@y@~CmC{@zJ?f@mAnA?f@x@z@bBR~HsIRe@jClKRz@`Dh@`Bd@vBRnF_DRSg@S?wBpFcGd@SScBwBvB{@T_D~Cg@?oA`B{@R{E~CqD{EUgJwB{@nAoA?kChJrIdJaBz@i@f@_DdBf@dEgEnFcGoP_N{@SeTvBqKoA{J_SsDoF?_Df@{@vB_XoAoPbLoZrDcBy@{EmC_D{ToAy@g@?_DlAgEgEcLg@g@qDnAqAkR_DyJy@i@mC?g@{@}CqNi@i@_ISoK_g@g@{@{EiCiCd@g@z@yGfOwBnAoARyJ_DuDRoAg@_D_IoKyEcGk\\gOx@cGy@{@}@sI_DcGgEwLbBuBRmCe@{JgOS}Jy@{@kHcBy[_]gEmPnA}Ef@g@vGwBgEa[rDqP|h@w[hMoFzJ{J~HwL{@_DoAkCcGwBuBgJyBoA_SfJiCz@{Jz@yBg@oU{OkCkCf@cLbBsIy@iCyGeB}H{@mCnFoAvB}ReEyGaIpFsSx@iHoAmCkHkCQ{JmM{TS_DvBuG?qFR{@vBoA~Hg@bBoAlCuL}@cG_IcGyEi@?sNUy@{@}@wLvBuB?aIcGgTgOSwLS_DoFoFwQTsDUg^kW}Hwe@U_DrI_l@|@_Dx@g@fTbBjC?j\\sD|OgEdJcGnAwBaB{EuDoAaLcB}J{JqDjCee@wGsD{JoAwB_X?cB{@g@g@kCqSkf@ye@gJkWoi@_]{JgESkHcBkHco@u[{Od@{@e@sIa]{@gJk\\kMkHoF_NgJcG?oAaBoAyGcBoAgESgYvG{@?wB_NcBgO~HoFrI_I~a@_]rNcVzJoAnU_q@nA{@rIsDrDsIwG_Ng@}CjMa]bBcGz@g@nF|@z@i@sDa[vGiYvBoAfJ_Dz@_DgEoKoA_NdBuL`VkWvLmH_Ie@kH?wB|Ce^|TyBx@cL?f@{T{@yEcQyBoFfEoKtDeJPmCoFg@{@gO}Huj@oA}OgOaBeBwQf@}@?mFsIyB_DyE_DaXrDcGrDbBkCvBgE{JsSoKsIqDSuDkHR{@xB?lAbBcBR",
        levels: "P?CFDEADGDHBGIBDCEADCFDECFADFBFGCFCEEBDBCDGBEBFHDEABDFBCCDEBFCEFEDCFFECFGEFFCGEHEDCJFGDEDFGHDFBEGECFCIBEGCEDFFGHEFCGEKFECGEHDEFGCEIFDEFGHGHIFDEFGDFGEFJDFEDGEFDGHFEGEFIDEFBDGDFEFGHBDFDGLEFEGDHGDIDCFGHFGDEDFGDHEFGDBFJFHEFEIFCGKGEHEDFDEGCIEFGHFGICFEGDHJCECFGDHDFEGIFEFDGDHFDGEFGICFHFDGCJDEGEDEMFDGBDEP",
        zoomFactor: 2,
        numLevels: 18
        });

        map.addOverlay(pl);
    }
}

function mapClick(marker, point) {
	if (!marker) {
		addRoutePoint(point);
	}
}

function addRoutePoint(point) {
	var dist = 0;

	if (!routePoints[lineIx]) {
		routePoints[lineIx] = Array();
		routeMarkers[lineIx] = Array();
	}

	routePoints[lineIx].push(point);
	if (routePoints[lineIx].length > 1)	{
        if (routePoints[lineIx].length > 2)	{
            if(document.notes.notes.value != ''){
                addNoteTab();
            }
        }

		plotRoute();
		dist = routePoints[lineIx][routePoints[lineIx].length-2].distanceFrom(point) / 1000;
		totalDistance += dist/1.61;
		document.getElementById("dist").innerHTML = 'Total Distance: '+ totalDistance.toFixed(3) + ' miles';

        var elem = id_to_elem('dist_con');
        if(is_in_dom(elem)){if(!is_vis(elem)){show_e(elem);}}
	}
	else {
		routeMarkers[lineIx][routePoints[lineIx].length-1] = new GMarker(point,{icon:greenIcon,title:'Start Point'});
		map.addOverlay(routeMarkers[lineIx][routePoints[lineIx].length-1]);

	}
	document.getElementById("route").innerHTML += point.y.toFixed(6) + '|' + point.x.toFixed(6) + '|' + (dist/1.61).toFixed(4) + '|' + routePoints[lineIx].length + "<br>";
	distPoint = dist/1.61;
	notePoint = point;
	addNotes();

}
function getMapcenter() {
	var center = map.getCenter();
	var z = map.getZoom();
	document.getElementById("coords").innerHTML = 'Map center:<br>' + center.y.toFixed(6) + ' ' + center.x.toFixed(6) + '<br />Zoom: ' + z;

}

function DEC2DMS(dec) {
	var deg = Math.floor(Math.abs(dec));
	var min = Math.floor((Math.abs(dec)-deg)*60);
	var sec = (Math.round((((Math.abs(dec) - deg) - (min/60)) * 60 * 60) * 100) / 100 ) ;

	deg = dec < 0 ? deg * -1 : deg;

	var dms  = deg + '&deg ' + min + '\' ' + sec + '"';
	return dms;
}


function plotRoute() {
    if(routeOverlays[lineIx] != undefined){
        map.removeOverlay(routeOverlays[lineIx]);// 7-17-09 Was throwing an a is undefined error.
    }
	routeOverlays[lineIx] = new GPolyline(routePoints[lineIx],'#FF0000',3,1);
	map.addOverlay(routeOverlays[lineIx]);
    hide('map_button_clear');
}
function clearAll() {
    var answer = confirm ("Are you sure you want to clear all points?")
    if (answer){
        while (lineIx > 0) {
            resetRoute();
        }

        totalDistance = 0;
        document.getElementById("dist").innerHTML = '';
        document.getElementById("route").innerHTML = '';
    }
}

function resetRoute() {
	if (!routePoints[lineIx] || routePoints[lineIx].length == 0) {
		lineIx--;
	}

	routePoints[lineIx] = null;
	map.removeOverlay(routeOverlays[lineIx]);

	for (var n = 0 ; n < routeMarkers[lineIx].length ; n++ ) {
		var marker = routeMarkers[lineIx][n];
		map.removeOverlay(marker);
	}
	routeMarkers[lineIx] = null;

	var html = document.getElementById("route").innerHTML;
	html = html.replace(/<br>[^<]+<br>$/,'<br>');
	document.getElementById("route").innerHTML = html;

}

function undoPoint() {
	if (!routePoints[lineIx] || routePoints[lineIx].length == 0) {
		lineIx--;
	}

	if (routePoints[lineIx].length > 1)	{
		var dist = routePoints[lineIx][routePoints[lineIx].length-2].distanceFrom(routePoints[lineIx][routePoints[lineIx].length-1]) / 1000;
		totalDistance -= dist/1.61;
		document.getElementById("dist").innerHTML = 'Total Distance: '+ totalDistance.toFixed(3) + ' mi';

		var html = document.getElementById("route").innerHTML;
		html = html.replace(/<br>[^<]+<br>(<br>)*$/,'<br>');
		document.getElementById("route").innerHTML = html;

		if (routeMarkers[lineIx][routePoints[lineIx].length-1]) {
			var marker = routeMarkers[lineIx].pop();
			map.removeOverlay(marker);
		}
		routePoints[lineIx].pop();
		plotRoute();
	}
	else {
		resetRoute();
	}
}

function mapAdd() {
	sndhtml = document.getElementById("route").innerHTML;
	document.mapadd.cords.value = sndhtml;
	document.mapadd.miles.value = totalDistance.toFixed(3);
	var z = map.getZoom();
	document.mapadd.zoom.value = z;
	document.mapadd.city.value = document.city.selectedCity.value;
}
function showPoints(xml) {
	var html = '';
	if (xml) {
		html = '<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n';
		html += '<routes>\n';
		for (var i = 0 ; i < lineIx ; i++ ) {
			html += '  <route>\n';
			for (var n = 0 ; n < routePoints[i].length ; n++ ) {
				html += '    <p lat="' + routePoints[i][n].y.toFixed(8) + '" lon="' + routePoints[i][n].x.toFixed(8) + '"';
				if (routeMarkers[i][n]) {
					html += ' markerIcon="'+ routeMarkers[i][n].getIcon().image +'"';
				}
				html += ' />\n';
			}
			html += '  </route>\n';
		}
		html += '</routes>\n';
	}
	else {
		for (var i = 0 ; i < lineIx ; i++ ) {
			for (var n = 0 ; n < routePoints[i].length ; n++ ) {
				html += routePoints[i][n].y.toFixed(8) + ', ' + routePoints[i][n].x.toFixed(8) + '\n';
			}
			html += '----- new line ------ \n';
		}
	}

	if (html == '') {
		html += 'You must add a closing point to each line\n\n';
	}

	html += '\n\n';
//	html += encodePolyline();

	var nWin = window.open('','nWin','width=780,height=500,left=50,top=50,resizable=1,scrollbars=yes,menubar=no,status=no');
	nWin.focus();
	nWin.document.open ('text/xml\n\n');
	nWin.document.write(html);
	nWin.document.close();
}
function addIntermediate() {
	if (routePoints[lineIx].length > 1)	{
		map.removeOverlay(routeMarkers[lineIx][routePoints[lineIx].length-1]);
		routeMarkers[lineIx][routePoints[lineIx].length-1] = new GMarker(routePoints[lineIx][routePoints[lineIx].length-1],{icon:blueIcon0,title:'Point '+ routePoints[lineIx].length-1});
		map.addOverlay(routeMarkers[lineIx][routePoints[lineIx].length-1]);

	}
}
function addClosing() {
	if (routePoints[lineIx].length > 1)	{
		map.removeOverlay(routeMarkers[lineIx][routePoints[lineIx].length-1]);
		routeMarkers[lineIx][routePoints[lineIx].length-1] = new GMarker(routePoints[lineIx][routePoints[lineIx].length-1],{icon:redIcon,title:'End Point'});
		map.addOverlay(routeMarkers[lineIx][routePoints[lineIx].length-1]);
		lineIx++;
        //document.getElementById("route").innerHTML += '<br>';
	}
    show('map_button_clear');
}

function addNotes() {
	if (routePoints[lineIx].length > 1)	{
        var htmltab1 = "MARKER " + routePoints[lineIx].length + " NOTES:<br /><form name='notes'><textarea style='width: 680px; margin-left:15px; margin-top:3px; height:30px;' wrap='virtual'  name='notes'></textarea></form>\n";
        var htmltab2 = "<div style='float: right>' Coordinates:" + routePoints[lineIx][routePoints[lineIx].length-1] + "<br />Total Distance: " + totalDistance.toFixed(3) + "mi <br />Distance from last marker: " + distPoint.toFixed(4) + " mi </div>";
        var tabs = [];
		// Create tabs and add them to the array
		tabs.push(new GInfoWindowTab('Notes', htmltab1));
		tabs.push(new GInfoWindowTab('Info', htmltab2));
		// Add tabs to the InfowWindow
		document.getElementById('notediv').innerHTML = htmltab1;
        if(routeMarkers[lineIx][routePoints[lineIx].length-1] != undefined){
            map.removeOverlay(routeMarkers[lineIx][routePoints[lineIx].length-1]); //7-17-09 Was throwing an a is undefined error.
        }
		routeMarkers[lineIx][routePoints[lineIx].length-1] = new GMarker(routePoints[lineIx][routePoints[lineIx].length-1],{icon:blueIcon,title:'Point '+ routePoints[lineIx].length-1});
		map.addOverlay(routeMarkers[lineIx][routePoints[lineIx].length-1]);
		GEvent.addListener(routeMarkers[lineIx][routePoints[lineIx].length-1], "click", function() {
            slidedown('notediv', htmltab1)
        });
	}
}

function addNoteTab() {
    var notesadd = document.notes.notes.value;
    var html = document.getElementById("route").innerHTML;
    html = html.replace(/<br>[^<]+<br>$/,'<br>');
    document.getElementById("route").innerHTML = html;
    document.getElementById("route").innerHTML += notePoint.y.toFixed(6) + '|' + notePoint.x.toFixed(6) + '|'  + distPoint.toFixed(4) + '|' + routePoints[lineIx].length + '|' + notesadd + "<br>";
}

//-----------------------------------------
function encodePolyline() {
	var encodedPoints = '';
	var	encodedLevels = '';

	var plat = 0;
	var plng = 0;

	for (var n = 0 ; n < routePoints[lineIx].length ; n++ ) {
		var lat = routePoints[lineIx][n].y.toFixed(8);
		var lng = routePoints[lineIx][n].x.toFixed(8);

		var level = (n == 0 || n == routePoints[lineIx].length-1) ? 3 : 1;
		var level = 0;

		var late5 = Math.floor(lat * 1e5);
		var lnge5 = Math.floor(lng * 1e5);

		dlat = late5 - plat;
		dlng = lnge5 - plng;

		plat = late5;
		plng = lnge5;

		encodedPoints += encodeSignedNumber(dlat) + encodeSignedNumber(dlng);
		encodedLevels += encodeNumber(level);
	}

	var html = '';
	html += 'new GPolyline.fromEncoded({\n';
	html += '  color: "#0000ff",\n';
	html += '  weight: 4,\n';
	html += '  opacity: 0.8,\n';
	html += '  points: "'+encodedPoints+'",\n';
	html += '  levels: "'+encodedLevels+'",\n';
	html += '  zoomFactor: 16,\n';
	html += '  numLevels: 4\n';
	html += '});\n';

	return html;
}

function encodeSignedNumber(num) {
	var sgn_num = num << 1;

	if (num < 0) {
		sgn_num = ~(sgn_num);
	}

	return(encodeNumber(sgn_num));
}

// Encode an unsigned number in the encode format.
function encodeNumber(num) {
	var encodeString = "";

	while (num >= 0x20) {
		encodeString += (String.fromCharCode((0x20 | (num & 0x1f)) + 63));
		num >>= 5;
	}

	encodeString += (String.fromCharCode(num + 63));
	return encodeString;
}

//SUBMIT MAP FUNCTION
function cnGo(){
	var msg = '';
	if(document.getElementById('mname').value == ''){
		msg += "\t   > You must provide map name\n";
	}
    /*SHOULD NOT BE REQUIRED
	if(document.getElementById('mdesc').value == ''){
		msg += "\t    > Please provide a short description of your map\n";
	}
    */
	if(document.getElementById('mtype').selectedIndex == 0){
		msg += "\t    > Please provide a map type\n";
	}
	if(msg.length > 0){
		msg = "Sorry, we need a little bit more information:\n\n" + msg;
		alert(msg);
		return false;
	}
	else{
        if(document.notes.notes.value != ''){
            addNoteTab();
        }
		mapAdd();
	}
}