//--------------------------- Globals -----------------------------
var qiblaLat = 21.42252;
var qiblaLng = 39.82621; 
//var ipcity = geoip_city();
//var ipregion = geoip_region();
//var ipcountry = geoip_country_name();
var addrEmptyMsg = 'Enter address, zipcode, country or lat,lng';
var map, geocoder, centerMarker;
var kaba = new GLatLng(qiblaLat, qiblaLng);

//--------------------------- Initialize -----------------------------
// initialization function
function init(startAddr, startLat, startLng, startZoom) {
	if (!GBrowserIsCompatible())
		return;

	if (!startAddr) startAddr = '';
	if (!startLat) startLat = 30.6186;
	if (!startLng) startLng = -96.3361;
	if (!startZoom) startZoom = 11;

	//startLat = geoip_latitude();
	//startLng = geoip_longitude();
	
	startLng = parseFloat(geoip_longitude());
	startLat = parseFloat(geoip_latitude());

	var params = {};
	try {
		var paramsArr = String(document.location).split('?')[1].split('&');
		for (var i = 0; i < paramsArr.length; ++i) {
			var p = paramsArr[i].split('=');
			params[p[0]] = p[1];
		}
	}
	catch (e) {}				
					
	startLat = (params['ltd'] ? parseFloat(params['ltd']) : startLat);
	startLng = (params['lng'] ? parseFloat(params['lng']) : startLng);
	startZoom = (params['z'] ? parseInt(params['z']) : startZoom);
	startAddr = (params['address'] ? params['address'] : startAddr);

	map = new GMap2(document.getElementById("map"));
	geocoder = new GClientGeocoder();
	var home = new GLatLng(startLat, startLng);

	map.addControl(new GLargeMapControl());
	map.addControl(new GMenuMapTypeControl());
	map.addControl(new GScaleControl());
	map.setCenter(home, startZoom);
	
	var icon = new GIcon(null, 'http://images.listenarabic.com/images/crosshair.gif');
	icon.iconSize = new GSize(17, 17);
	icon.iconAnchor = new GPoint(8, 8);
	centerMarker = new GMarker(home, {icon: icon, clickable: false});

	//GEvent.addListener(map, 'load', setMap);
	GEvent.addListener(map, 'move', mapDraw);
	document.getElementById('roundRect').value = startAddr;
	leaveAddressBar();
	//setMap(startLat, startLng, startZoom);
	mapDraw();	
}

//------------------------- Map Functions -----------------------------
function setMap(startLat, startLng, startZoom) {
	var iphome = new GLatLng(startLat, startLng);
	map.setCenter(iphome, startZoom);
	var qiblaDir = -getDirection(startLat, startLng, qiblaLat, qiblaLng);
	map.clearOverlays();
	centerMarker.setPoint(iphome);
	map.addOverlay(centerMarker);
	var line = getLine(startLat, startLng, qiblaDir);
	map.addOverlay(line);	
	writeData(iphome, qiblaDir);
}

// update map 
function mapDraw() {
	var center = map.getCenter();
	var lng = center.lng();
	var lat = center.lat();
	var qiblaDir = -getDirection(lat, lng, qiblaLat, qiblaLng);
	map.clearOverlays();
	centerMarker.setPoint(center);
	map.addOverlay(centerMarker);
	var line = getLine(lat, lng, qiblaDir);
	map.addOverlay(line);	
	writeData(center, qiblaDir);
	shareLink();
}

//write information
function writeData(center, qiblaDir) {
	if (qiblaDir < 0) qiblaDir += 360;
	var long = center.lng();
	var lati = center.lat();
	var longf = long.toFixed(4);
	var latif = lati.toFixed(4);
	writeItem('curLng', longf);
	writeItem('curLat', latif);				
	writeItem('direction', qiblaDir.toFixed(2)+ '&deg;&nbsp;N');	
	if (document.getElementById('units').checked) {
		var converter = 1609.344;   //miles
		var distance = center.distanceFrom(kaba)/ converter; 
		writeItem('distance', distance.toFixed(0)+ '&nbsp;mi');	
	}
	else {
		var converter = 1000;     //kilometers
		var distance = center.distanceFrom(kaba)/ converter; 
		writeItem('distance', distance.toFixed(0)+ '&nbsp;km');	
	}
}

//update a data item
function writeItem(itemID, value) {
	document.getElementById(itemID).innerHTML = value;
}

// create a direction line
function getLine(lat, lng, angle) {
	var factor = 8;
	var zoom = map.getZoom();
	var dLng = factor/ Math.pow(2, zoom- 7);
	if (zoom < 7) dLng = factor;

	dLng = dLng* Math.sin(dtr(angle));

	var from = new GPoint(lng, lat);
	var lat2 = getLat(lat, angle, dLng)
	var to = new GPoint(lng+ dLng, lat2);
	if (Math.abs(dLng) > Math.abs(lng- qiblaLng))
		to = new GPoint(qiblaLng, qiblaLat);
	var line = new GPolyline([ from, to ], '#FF0000', 4);
	return line;
}

// generate share-able link
function shareLink() {
	var center = map.getCenter();
	var lng = center.lng().toFixed(4);
	var lat = center.lat().toFixed(4);
	var zoom = map.getZoom();
	var link = document.getElementById('sharelink');
	link.value = 'http://www.listenarabic.com/qibla-locator.php?ltd=' + lat + '&lng=' + lng + '&z=' + zoom;
}

//-------------------------- Calculating Functions -----------------------
// definitions:
// point1 = (lat1, lng1), point2 = (lat2, lng2)
// dLng = lng1- lng2
// direction = angle of the line connecting point1 to point2 (CW from North)
// find the direction
function getDirection(lat1, lng1, lat2, lng2) {
	var dLng = lng1- lng2;
	return rtd(getDirectionRad(dtr(lat1), dtr(lat2), dtr(dLng)));
}

function getDirectionRad(lat1, lat2, dLng) {
	return Math.atan2(Math.sin(dLng), Math.cos(lat1)* Math.tan(lat2)- Math.sin(lat1)* Math.cos(dLng));
}

// find lat2 for a given direction
function getLat(lat1, angle, dLng) {
	return rtd(getLatRad(dtr(lat1), dtr(angle), dtr(dLng)));
}

function getLatRad(lat1, angle, dLng) {
	return Math.atan((Math.sin(dLng)+ Math.tan(angle)* Math.sin(lat1)* Math.cos(dLng))/ (Math.tan(angle)* Math.cos(lat1)));
}

//-------------------------- Angle Unit Conversion ----------------------
// degree to radian
function dtr(d) {
	return (d* Math.PI)/ 180.0;
}

// radian to degree
function rtd(r) {
	return (r* 180.0)/ Math.PI;
}

//-------------------------- Geocoder Functions -----------------------
// locate address
function locateAddress() {
	var address = document.getElementById('roundRect').value;
	if (address == '' || address == addrEmptyMsg) {
		alert(addrEmptyMsg);
		return;
	}
	geocoder.getLocations(address, showAddressOnMap);
}

// show address on map
function showAddressOnMap(response) {
	if (!response || response.Status.code != 200) 
		alert('Address not found');
	else {
		place = response.Placemark[0];
		point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);
		map.setCenter(point, 8+ place.AddressDetails.Accuracy);
		marker = new GMarker(point);
		map.addOverlay(marker);
		marker.openInfoWindowHtml(place.address);
	}
}

//-------------------------- Misc Functions  -----------------------
// called when address bar is focused
function focusAddressBar() {
	var address = document.getElementById('roundRect');
	address.style.color = '#000000';
	if (address.value == addrEmptyMsg)
		address.value = '';
}

// called when address bar lose focus
function leaveAddressBar() {
	var address = document.getElementById('roundRect');
	if (address.value == '' || address.value == addrEmptyMsg) {
		address.style.color = '#999999';
		address.value = addrEmptyMsg;
	}
}

//distance mile/km selector
function checkunit() {
	if (document.dUnit.unit[0].checked==true) converter = 1609.344;   //miles
	if (document.dUnit.unit[1].checked==true) converter = 1000;     //kilometers
}

// toggle hidden element
function toggle( targetId ) {
	if ( document.getElementById ) {
		target = document.getElementById( targetId );
		if ( target.style.display == "none" ) {
			target.style.display = "";
		} else {
			target.style.display = "none";
		}
	}
}

