//<![CDATA[

var IE = document.all ? true : false;
var map;
var detailmap;
var dirObj;
var map_area;
var opacity = 1;
var clckTimeOut = null;
var loading = false;
var saveState = false;
var directionsInfoDiv;
var iw;
var polyline;
var pLine;
var startMarker;
var endMarker;
var dragMarker;
var pLinePoints = Array();
var midRouteMarkers = Array();
var markerDragging = false;
var typeChanging = false;
var baseIcon = new GIcon();
baseIcon.iconSize=new GSize(20,32);
baseIcon.iconAnchor=new GPoint(30,18);
baseIcon.infoWindowAnchor=new GPoint(10,0);

var yellowIcon = (new GIcon(baseIcon, fullurl + "/img/yellowflag.png", null, ""));
var greenIcon = (new GIcon(baseIcon, fullurl+"/img/greenflag.png", null, ""));
var redIcon = (new GIcon(baseIcon, fullurl+"/img/redflag.png", null, ""));

var baseIcon2 = new GIcon();
baseIcon2.iconSize=new GSize(30,18);
baseIcon2.iconAnchor=new GPoint(4,4);
baseIcon2.infoWindowAnchor=new GPoint(4,0);
var redIcon8 = (new GIcon(baseIcon2, fullurl+"/img/mapcar.png", null, ""));

var NormalLayer = G_NORMAL_MAP.getTileLayers()[0]
var TerrainLayer = G_PHYSICAL_MAP.getTileLayers()[0]
var SatelliteLayer = G_SATELLITE_MAP.getTileLayers()[0]
var satProj = G_SATELLITE_MAP.getProjection();	
var normalProj = G_NORMAL_MAP.getProjection();	

var cRight = new GCopyrightCollection('Webcodedepot');
var copyright = new GCopyright(1, new GLatLngBounds(new GLatLng(-10.228437, -78.134766), new GLatLng(10.228437, 78.134766)), 0, "WCD©2009");
cRight.addCopyright(copyright);


// Defaults --------------------------------------------
var zoom = 4;
var centerPoint = new GLatLng(10.228437,78.134766);
var mType = 0;


var INstates = Array('Andhra Pradesh','Arunachal Pradesh','Assam','Bihar','Chhattisgarh','Goa','Gujarat','Haryana','Himachal Pradesh','Jammu and Kashmir','Jharkhand','Karnataka','Kerala','Madhya Pradesh','Maharashtra','Manipur','Meghalaya','Mizoram','Nagaland','Orissa','Punjab','Rajasthan','Sikkim','Tamil Nadu','Tripura','Uttar Pradesh','Uttarakhand','West Bengal')
var pattern = '(' + INstates.join('|') + ')';


function load() {
	doLoad();
}

function doLoad() {
	if (GBrowserIsCompatible()) {
		map_area = document.getElementById("map_div");
		resizePage();
		map = new GMap2(map_area, {draggableCursor:"crosshair"});

		map.addMapType(G_PHYSICAL_MAP)
		TerrainLayer.getOpacity = function () {return opacity;};
		var layers = [NormalLayer,TerrainLayer];
		addCustomMapType("Terrain N",layers,17,0);

		directionsInfoDiv = document.getElementById("route_information");
		dirObj = new GDirections();

		var mapState = getMapState();
		if (typeof(mapState) != 'undefined') {
			if (mapState['lat'] && mapState['lon']) {
				centerPoint = new GLatLng(parseFloat(mapState['lat']), parseFloat(mapState['lon']));
			}	
			if (mapState['z']) {
				zoom = parseInt(mapState['z']);
			}
			if (mapState['mType']) {
				mType = parseInt(mapState['mType']);

				if (mType == 4) {
					opacity = 0.4;
				}
			}
			
			if (mapState['driveFrom']) {
				var oDriveFrom = document.getElementById('driveFrom').value = mapState['driveFrom'];
			}
			if (mapState['driveTo']) {
				var oDriveFrom = document.getElementById('driveTo').value = mapState['driveTo'];
			}
			if (mapState['driveVia']) {
				var oDriveFrom = document.getElementById('driveVia').value = mapState['driveVia'];
			}
			if (mapState['locale']) {
				var oDriveFrom = document.getElementById('locale').value = mapState['locale'];
			}
		}

		map.setCenter(centerPoint, zoom, map.getMapTypes()[mType]);
	
		map.addControl(new GLargeMapControl());
		map.addControl(new GMapTypeControl());
		map.enableContinuousZoom();

// TIS FOR MAP POINTER 
		GEvent.addListener(map, 'mousemove', mouseMove);
		GEvent.addListener(map, "moveend", moveEnd);
		GEvent.addListener(map, "zoomend", zoomEnd);
		GEvent.addListener(map, "maptypechanged", mapTypeChenged);
		GEvent.addListener(map, 'click', mapClick);
		GEvent.addListener(dirObj, "load", onDirectionsLoad);
		GEvent.addListener(dirObj, "error", onDirectionsError);

		var ovcontrol = new GOverviewMapControl(new GSize(165,165));
		map.addControl(ovcontrol);
		var ov_map = ovcontrol.getOverviewMap();
		GEvent.addListener(map, 'maptypechanged', function(){
//			ov_map.setMapType(G_NORMAL_MAP);
		}); 
		updateLink();
		if (mapState['driveFrom'] && mapState['driveTo']) {
			getDirections();
		}

	}
}

function addCustomMapType(mName,layers,maxRes,minRes) {
	var TerrainN = new GMapType(layers, normalProj, mName, {maxResolution:maxRes, minResolution:minRes, errorMessage:'Boom!'}); 
	map.addMapType(TerrainN);
}

function mouseMove(mousePt) {
	mouseLatLng = mousePt;
	
	var zoom = map.getZoom();
	var mousePx = normalProj.fromLatLngToPixel(mousePt, zoom);
	var oStatusDiv = document.getElementById("mouseTrack")	
	if (oStatusDiv) {
		oStatusDiv.innerHTML = 'Mouse LatLng: ' + mousePt.y.toFixed(6) + ', ' + mousePt.x.toFixed(6) ;
		oStatusDiv.innerHTML += '<br> ';
		oStatusDiv.innerHTML += 'Mouse Px: ' + mousePx.x + ', ' + mousePx.y;
		oStatusDiv.innerHTML += '<br>';
		oStatusDiv.innerHTML += 'Tile: ' + Math.floor(mousePx.x / 256) + ', ' + Math.floor(mousePx.y / 256);
	}

getNearestVertex(mouseLatLng);

}

function mapTypeChenged() {
	if (typeChanging) {
		return;
	}
	typeChanging = true;

	var mtype = map.getCurrentMapType().getName();
	if (mtype == 'Terrain N') {
		opacity = 0.4;
	}
	else {
		opacity = 1;
	}
	var currentType = map.getCurrentMapType();
	map.setMapType(G_NORMAL_MAP);
	map.setMapType(currentType);
	typeChanging = false;

	updateLink();
}

function moveEnd() {
	updateLink();
}

function zoomEnd(oldZ,zoom) {
	updateLink();
}

function updateLink() {
	var center = map.getCenter();
	var zoom = map.getZoom();
	var mTypes = map.getMapTypes();
	for (var n = 0 ; n < mTypes.length ; n++ ) {
		if (mTypes[n] == map.getCurrentMapType()) {
			mType = n;
		}
	}

	var bounds = map.getBounds();
	var SW = bounds.getSouthWest();
	var NE = bounds.getNorthEast();

	var oCoords = document.getElementById("coords");
	oCoords.innerHTML = 'Map center: (' + center.lat().toFixed(6) + ',' + center.lng().toFixed(6) + ') - zoom: ' + zoom;
	oCoords.innerHTML += '<br> ';
	oCoords.innerHTML += 'SW: ' + SW.y.toFixed(6) + ', ' + SW.x.toFixed(6);
	oCoords.innerHTML += '<br> ';
	oCoords.innerHTML += 'NE: ' + NE.y.toFixed(6) + ', ' + NE.x.toFixed(6);

	var oDriveFrom = document.getElementById('driveFrom');
	var oDriveTo = document.getElementById('driveTo');
	var oDriveVia = document.getElementById('driveVia');
	var oLocale = document.getElementById('locale');
	
	var link = window.location.pathname + '?lat=' + center.lat() + '&lon=' + center.lng() + '&z=' + zoom + '&mType=' + mType;
	link += '&driveFrom=' + oDriveFrom.value;
	link += '&driveTo=' + oDriveTo.value;
	link += '&driveVia=' + oDriveVia.value;
	link += '&locale=' + oLocale.value;
}
//
function mapClick(marker, point) {
	if (clckTimeOut) {
		window.clearTimeout(clckTimeOut);
		clckTimeOut = null;
		doubleClick(marker, point);
	}
	else {
		clckTimeOut = window.setTimeout(function(){singleClick(marker, point)},500);
	}
}

function doubleClick(marker, point) {
}

function singleClick(marker, point) {
	window.clearTimeout(clckTimeOut);
	clckTimeOut = null;

	if (point) {
		if (!startMarker) {
			var oDriveFrom = document.getElementById('driveFrom');
			startMarker = new GMarker(point,{icon:greenIcon,draggable:true,bouncy:false});
			startMarker.formField = oDriveFrom;
			GEvent.addListener(startMarker,'drag',markerDrag);
			GEvent.addListener(startMarker,'dragend',getDirections);
			map.addOverlay(startMarker);
			oDriveFrom.value = startMarker.getPoint().lat().toFixed(6) + ',' + startMarker.getPoint().lng().toFixed(6);
			return;
		}
		else if (!endMarker) {
			var oDriveTo = document.getElementById('driveTo');
			endMarker = new GMarker(point,{icon:redIcon,draggable:true,bouncy:false});
			endMarker.formField = oDriveTo;
			GEvent.addListener(endMarker,'drag',markerDrag);
			GEvent.addListener(endMarker,'dragend',getDirections);
			map.addOverlay(endMarker);
			oDriveTo.value = endMarker.getPoint().lat().toFixed(6) + ',' + endMarker.getPoint().lng().toFixed(6);
			return;
		}
	}
} 

function markerDrag() {
	this.formField.value = this.getPoint().lat().toFixed(5) + ',' + this.getPoint().lng().toFixed(5);
}


function indicateLoading() {
	loading = true;
	displayLoadingMsg();
}

function displayLoadingMsg() {
	var oLMsg = document.getElementById('loadingMessage');
	oLMsg.style.display = '';
	oLMsg.style.left = map_area.offsetLeft + (map_area.clientWidth / 2) - (oLMsg.clientWidth / 2) + 'px';
	oLMsg.style.top = map_area.offsetTop + (map_area.clientHeight / 2) - (oLMsg.clientHeight / 2) + 'px';
	oLMsg.style.filter="alpha(opacity=70)";

	if (loading){
		var to = window.setTimeout('displayLoadingMsg()',100);
	}
	else {
		oLMsg.style.display = 'none';
	}
}

// Map state -------------------------------------------
function getMapState() {
	var qString = window.location.search;
	qString = qString.substring(1, qString.length);

	var cValues = new Array();
	var separator = '&';
//	return cValues;

	if (!qString) {
		qString = getCookie('map2');
		separator = ',';
	}

	if (qString) {
		var nvPairs = qString.split(separator);

		for (var n = 0 ; n < nvPairs.length ; n++ )	{
			var nvPair = nvPairs[n];
			var nv = nvPair.split('=');

			cValues[nv[0]] = unescape(nv[1]);
			
		}
	}
	return cValues;
}


function getCookie(cookieName) {
	if (document.cookie.length > 0) {
		var cIndex = document.cookie.indexOf(cookieName+"=");
		if (cIndex != -1) {
			cIndex += cookieName.length + 1;
			var cLength = document.cookie.indexOf(";", cIndex);
			if (cLength == -1) {
				cLength = document.cookie.length;
			}
			return unescape(document.cookie.substring(cIndex, cLength)); 
		}
	}
	return null;
}

function setCookie(cookieName, value, expiredays) {
	var exp = "";
	if (expiredays) {
		var ExpireDate = new Date ();
		ExpireDate.setTime(ExpireDate.getTime() + (expiredays * 24 * 3600 * 1000));
		exp = ExpireDate.toGMTString();
	}
	document.cookie = cookieName + "=" + escape(value) + "; expires=" + exp + "; path=/";
}



function delCookie (cookieName) {
	if (getCookie(cookieName)) {
		document.cookie = cookieName + "=" + "; expires=Thu, 01-Jan-70 00:00:01 GMT";
	}
}

// End Map state -------------------------------------------

function resizePage() {

	var oTable = document.getElementById("outerTable");
	var dDiv = document.getElementById("route_information");
	
	oTable.style.width = document.body.clientWidth  + 'px';
	var veHeight = 1000;
	//map_area.style.height = document.body.clientHeight - veHeight  + 'px';
	map_area.style.height = '500'  + 'px';
	//dDiv.style.height = document.body.clientHeight - veHeight + 65 + 'px';

	if (map) {
		var center = map.getCenter();
		var zoom = map.getZoom();
		map.checkResize();
		map.setCenter(center,zoom);
	}
}


function unload() {
	doUnload(0);
}

function doUnload(mReset) {
	if (mReset) {
		delCookie('map3');
		saveState = false;
		window.location = window.location.pathname;
	}

	if (saveState) {
		var cookieStr = '';
		var center = map.getCenter();

		cookieStr += 'lat=' + center.lat() + ',';
		cookieStr += 'lon=' + center.lng() + ',';
		cookieStr += 'z=' + map.getZoom() + ',';
		cookieStr += 'mType=' + mType + ',';
		cookieStr += 'mapMode=' + mapMode;

		setCookie('map3', cookieStr, 365);
	}
	GUnload();
}

function rmOverlays() {
	directionsInfoDiv.innerHTML = '';
	map.clearOverlays();
	resizePage();
	startMarker = null;
	endMarker = null;
}

function getDirections() {
	var oDriveFrom = document.getElementById('driveFrom');
	var oDriveTo = document.getElementById('driveTo');
	var oDriveVia = document.getElementById('driveVia');
	var oLocale = document.getElementById('locale');

	directionsInfoDiv.style.display = '';

	var loadStr;

	if (oDriveFrom.value && oDriveTo.value) {
		loadStr = 'from:' + oDriveFrom.value;
		if (oDriveVia.value) {
			var viaValue = oDriveVia.value.replace(/[\n\r]+/,"");
			var viaSteps = viaValue.split(';');
			for (var n = 0 ; n < viaSteps.length ; n++ ) {
				loadStr += ' to: ' + viaSteps[n];
			}
		}
		loadStr += ' to: ' + oDriveTo.value;
	}
	if (loadStr) {
		indicateLoading();
		dirObj.load(loadStr,{locale:oLocale.value,getPolyline:true,getSteps:true});
		updateLink();
	}

}

function onDirectionsLoad() {
	var html = '';
	var status = dirObj.getStatus();
	var bounds = dirObj.getBounds();


	map.clearOverlays();

	var copyrightHTML = dirObj.getCopyrightsHtml();
	var summaryHTML = dirObj.getSummaryHtml();
	var distance = dirObj.getDistance();
	var duration = dirObj.getDuration();
	var numRoutes = dirObj.getNumRoutes();
	var oDriveFrom = document.getElementById('driveFrom');
	var oDriveTo = document.getElementById('driveTo');
	var startLatLng = dirObj.getRoute(0).getStep(0).getLatLng();
	var endLatLng = dirObj.getRoute(numRoutes-1).getEndLatLng();

	polyline = dirObj.getPolyline();
	pLine = copyPolyline(polyline);
	map.addOverlay(polyline);

	var numGeoCodes = dirObj.getNumGeocodes();
	var startPoint = dirObj.getGeocode(0);
	var endPoint = dirObj.getGeocode(numGeoCodes-1);
	addDragMarker(startPoint);
	
	if (startMarker) {
		var clickStartPoint = startMarker.getPoint();
		if (clickStartPoint.distanceFrom(startLatLng) > 0) {
			html += 'Sorry: The Way you starts some distance fare away from the point you clicked.<br>';
		}
	}

	if (endMarker) {
		var clickEndPoint = endMarker.getPoint();
		if (clickEndPoint.distanceFrom(endLatLng) > 0) {
			html += 'Sorry : The Way you ends some distance fare away from the point you clicked.<br>';
		}
	}

	var realStartMarker = new GMarker(startLatLng,{icon:greenIcon,draggable:true,bouncy:false});
	realStartMarker.formField = oDriveFrom;
	GEvent.addListener(realStartMarker,'drag',markerDrag);
	GEvent.addListener(realStartMarker,'dragend',getDirections);
	map.addOverlay(realStartMarker);

	var realEndMarker = new GMarker(endLatLng,{icon:redIcon,draggable:true,bouncy:false});
	GEvent.addListener(realEndMarker,'drag',markerDrag);
	GEvent.addListener(realEndMarker,'dragend',getDirections);
	realEndMarker.formField = oDriveTo;
	map.addOverlay(realEndMarker);

	html += '<div class="route_initial_dtls">';
	html += '<table cellspacing="0" cellpadding="2" width="100%">';
	html += '<tr><td valign="top">  <b> From : </b>' + startPoint.address + '<br> <b> To </b>' + endPoint.address + '</td></tr>';
	html += '<tr><td valign="top"> '+summaryHTML+'</td></tr>';
	html += '</table></div>';
	html += '<div class="vspace5 clear"></div>';
	html += '<div id="help">Click to view Stoping</div>';

	for (var r = 0 ; r < numRoutes ; r++ ) {
		var route = dirObj.getRoute(r);
		var startGeoCode = dirObj.getGeocode(r);//route.getStartGeocode();
		var endGeoCode = dirObj.getGeocode(r+1);//route.getEndGeocode();
		var endLatLng = route.getEndLatLng();
		var routeSummaryHTML = route.getSummaryHtml();
		var routeDistance = route.getDistance();
		var routeDuration = route.getDuration();
		html += '<div class="route_way_dtls" onclick="toggleSteps('+r+')" title="Click to view steps">';
		html += '<table cellspacing="0" cellpadding="2" width="100%">';
		html += '<tr>';
		
		if (numRoutes == 1) {
			html += '<td valign="top"><img src="'+fullurl+'/img/greenflag.png"><br><img src="'+fullurl+'/img/redflag.png"></td>';
		}
		else {
			if (r == 0) {
				html += '<td valign="top"><img src="'+fullurl+'/img/greenflag.png"><br><img src="'+fullurl+'/img/yellowflag.png"></td>';
				var midMarker = new GMarker(endLatLng,{icon:yellowIcon});
				map.addOverlay(midMarker);
			}
			else if (r == numRoutes - 1) {
				html += '<td valign="top"><img src="'+fullurl+'/img/yellowflag.png"><br><img src="'+fullurl+'/img/redflag.png"></td>';
			}
			else {
				html += '<td valign="top"><img src="'+fullurl+'/img/yellowflag.png"><br><img src="'+fullurl+'/img/yellowflag.png"></td>';
				var midMarker = new GMarker(endLatLng,{icon:yellowIcon});
				map.addOverlay(midMarker);
			}
		}
		
		html += '<td valign="top"><b>' + startGeoCode.address + '</b> to<br> <b>' + endGeoCode.address + '</b><br>'+routeDistance.html+ ' (' + routeDuration.html +  ')</td>';
		html += '</table></div>';

		var numSteps = route.getNumSteps();
		html += '<table cellspacing="0" cellpadding="0" id="routeTable_'+r+'" style="display:none" width="100%">';
		for (var s = 0 ; s < numSteps ; s++ ) {
			var step = route.getStep(s);
			var stepLatLng = step.getLatLng();
			bounds.extend(stepLatLng);

			var stepPolylineIndex = step.getPolylineIndex();
			var stepDescriptionHTML = step.getDescriptionHtml();
			var re = new RegExp(pattern,'g');
			stepDescriptionHTML = stepDescriptionHTML.replace(re,'<b style="color:#CA0039">$1</b>')
			var stepDistance = step.getDistance();
			var stepDuration = step.getDuration();
			html += '<tr class="stopings" onclick="showStep('+r+','+s+')"><td>&nbsp;&nbsp;' + (s+1) + '.</td><td> ' + stepDescriptionHTML + '</td><td>' + stepDistance.html + '</td></tr>';
		}
		html += '</table>';
	}
	
	directionsInfoDiv.innerHTML = html;
	loading = false;

	map.setCenter(bounds.getCenter(map), map.getBoundsZoomLevel(bounds)); 
}

function copyPolyline(p) {
	pLinePoints = Array();
	for (var n = 0 ; n < p.getVertexCount() ; n++ ) {
		pLinePoints.push(p.getVertex(n));

	}
	var pLine = new GPolyline(pLinePoints,'#F7098A');
	return pLine;
}

function addDragMarker(placemark) {
	markerDragging = false;

	var point = new GLatLng(placemark.Point.coordinates[1],placemark.Point.coordinates[0])

	dragMarker = new GMarker(point, {icon:redIcon8,draggable:true,bouncy:false});
	GEvent.addListener(dragMarker, 'dragend', function(){
		var oDriveVia = document.getElementById('driveVia');
		if (oDriveVia.value) {
			oDriveVia.value += ';\n';
		}
		oDriveVia.value += dragMarker.getPoint().lat().toFixed(5) + ',' + dragMarker.getPoint().lng().toFixed(5);
		if (dragMarker) {
			map.removeOverlay(dragMarker);
		}
		getDirections();

	});

	GEvent.addListener(dragMarker, 'dragstart', function(){
		markerDragging = true;
	});

	map.addOverlay(dragMarker);
	dragMarker.hide();
}

function getNearestVertex(mouseLatLng) {
	if (markerDragging) {
		return;
	}
	if (!dragMarker) {
		return;
	}

	if (pLinePoints.length > 1){
		var bounds = map.getBounds();
		var SW = bounds.getSouthWest();
		var NE = bounds.getNorthEast();
		var diag = SW.distanceFrom(NE);
		threshold = diag / 100;
		var minDist = 9999999999;
		var intermediateIndex = Math.round(pLinePoints.length / 100);

		for (var n = 0 ; n < pLinePoints.length-intermediateIndex ; n+= intermediateIndex ) {
			if (mouseLatLng.distanceFrom(pLinePoints[n]) < minDist) {
				minDist = mouseLatLng.distanceFrom(pLinePoints[n]);
				if (minDist < threshold) {
					dragMarker.show();
					dragMarker.setLatLng(pLinePoints[n]);
				}
				else {
					dragMarker.hide();
				}
			}
		}
	}
}


function onDirectionsError() {
	loading = false;
	directionsInfoDiv.innerHTML = 'Error: ' + dirObj.getStatus().code;
}

function toggleSteps(routeNo) {
	oRouteTable = document.getElementById('routeTable_' + routeNo);
	oRouteTable.style.display = oRouteTable.style.display == 'none' ? '' : 'none';
}

function showStep(r,s) {
	map.closeInfoWindow();
	var step = dirObj.getRoute(r).getStep(s);
	var stepLatLng = step.getLatLng();
	var stepDescriptionHTML = step.getDescriptionHtml();
	var re = new RegExp(pattern,'g');
	stepDescriptionHTML = stepDescriptionHTML.replace(re,'<b style="color:#CA0039">$1</b>')
	var stepDistance = step.getDistance();
	var stepDuration = step.getDuration();

	var infoHTML = '<div id="tab1" class="bubble">';
	infoHTML += '<table>';
	infoHTML += '<tr class="stopings"><td>&nbsp;&nbsp;' + (s+1) + '.</td><td> ' + stepDescriptionHTML + '</td><td>' + stepDistance.html + '</td></tr>';
	infoHTML += '<tr class="stopings"><td>&nbsp;&nbsp;</td colspan="2"><td> ' + stepLatLng + '</td></tr>';
	infoHTML += '</table>';
	infoHTML += '</div>';

	var tab1 = new GInfoWindowTab("Location", '<div id="detailmap"></div>');
	var tab2 = new GInfoWindowTab("Info", infoHTML);
	var infoTabs = [tab1,tab2];

	map.openInfoWindowTabsHtml(stepLatLng,infoTabs);

//	detailmap = null;
// Minimap for driving directions
	var dMapDiv = document.getElementById("detailmap");
	detailmap = new GMap2(dMapDiv);
	detailmap.setCenter(stepLatLng,15);

	detailmap.addOverlay(pLine);

	var CopyrightDiv = dMapDiv.firstChild.nextSibling;
	var CopyrightImg = dMapDiv.firstChild.nextSibling.nextSibling;
	CopyrightDiv.style.display = "none"; 
	CopyrightImg.style.display = "none"; 

	detailmap.addControl(new GSmallMapControl());

}
//]]>
