//---------------------------------------------------------
/* 
Sat-direction v0.1
Original code from : QiblaLocator.com
*/



//--------------------------- Globals -----------------------------

var dst = false;
var tz = 1;
var am = 2;
var langua = 0;
var satLat = 21.42252;
var satLng = 39.82621; 

//var satLat = 1e-6;
//var satLng = 13;

var addrEmptyMsg = 'Enter address, zipcode, country or lat,lon';
var map, geocoder, centerMarker;


//---------------- mine 

function LoadAwqat(lat, lng) {
        var httpObject = null;
        if (window.ActiveXObject) httpObject = new ActiveXObject("Microsoft.XMLHTTP");
        else if (window.XMLHttpRequest) httpObject = new XMLHttpRequest();
        else{
                alert("Your browser does not support AJAX.");
                return null;
        }
        if (httpObject != null) {
                httpObject.onreadystatechange = function(){
                        if(httpObject.readyState == 4){
                                document.getElementById("awqat").innerHTML = httpObject.responseText;
				document.getElementById("awqat_osbou3").innerHTML = document.getElementById("temphiddtab").innerHTML;
				document.getElementById("temphiddtab").innerHTML = "";
                        }
                }
                httpObject.open("GET", "http://www.salat-time.com/getpraytime.php?lat="+lat+"&lng="+lng+"&dst="+dst+"&tz="+tz+"&am="+am, true);
                httpObject.send(null);
        }
}



//--------------------------- Initialize -----------------------------


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

        startLng = parseFloat(geoip_longitude());
        startLat = parseFloat(geoip_latitude());
	
	
	if (!startAddr) startAddr = '';
	if (!startLat) startLat = 36.8001;
	if (!startLng) startLng = 10.1864;
	if (!startZoom) startZoom = 12;

	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['latitude'] ? parseFloat(params['latitude']) : startLat);
	startLng = (params['longitude'] ? parseFloat(params['longitude']) : startLng);
	startZoom = (params['zoom'] ? parseInt(params['zoom']) : 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.addMapType(G_PHYSICAL_MAP); 
        map.addMapType(G_SATELLITE_3D_MAP);
	map.addControl(new GScaleControl());
// 	map.setMapType(G_HYBRID_MAP);
	map.setCenter(home, startZoom);

	var icon = new GIcon(null, 'http://www.salat-time.com/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, 'moveend', mapDraw);
	GEvent.addListener(map, 'move', updateMap);
	document.getElementById('roundRect').value = startAddr;
	leaveAddressBar();
	mapDraw();
	
}


function init_webmaster(startAddr, startLat, startLng, startZoom)
{
	if (!GBrowserIsCompatible())
		return;

//         startLng = parseFloat(geoip_longitude());
//         startLat = parseFloat(geoip_latitude());
	
	
	if (!startAddr) startAddr = '';
	if (!startLat) startLat = 36.8001;
	if (!startLng) startLng = 10.1864;
	if (!startZoom) startZoom = 12;

	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['latitude'] ? parseFloat(params['latitude']) : startLat);
	startLng = (params['longitude'] ? parseFloat(params['longitude']) : startLng);
	startZoom = (params['zoom'] ? parseInt(params['zoom']) : 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.addMapType(G_PHYSICAL_MAP);
        map.addMapType(G_SATELLITE_3D_MAP);
	map.addControl(new GScaleControl());
	map.setCenter(home, startZoom);

	var icon = new GIcon(null, 'http://www.salat-time.com/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, 'moveend', mapDraw_webmaster);
	GEvent.addListener(map, 'move', mapDraw_webmaster);
	mapDraw_webmaster();
	
}

function mapDraw_webmaster()
{
	var center = map.getCenter();
	var code = "";
	
	map.clearOverlays();
	centerMarker.setPoint(center);
	map.addOverlay(centerMarker);
	writeItem('curLng', center.lng().toFixed(4));
	writeItem('curLat', center.lat().toFixed(4));
	
	code = code + "&lt;div id=&quot;salattime_html_id&quot;&gt;\n";
	code = code + "&lt;a id=&quot;salattime_link&quot; href=&quot;http://www.salat-time.com/&quot;&gt;Salat time anywhere&lt;/a&gt;\n";
	code = code + "&lt;div id=&quot;salattime_awqat&quot;&gt; &lt;/div&gt;\n";
	code = code + "&lt;/div&gt;\n";
	code = code + "&lt;script type=&quot;text/javascript&quot;&gt;\n";
	code = code + 'var lat = '+center.lat().toFixed(4)+';\n';
	code = code + 'var lng = '+center.lng().toFixed(4)+';\n';
	code = code + 'var dst = '+dst+';\n';
	code = code + 'var tz = '+tz+';\n';
	code = code + 'var am = '+am+';\n';
	code = code + 'var langua = '+langua+';\n';
	code = code + "&lt;/script&gt;\n";
	code = code + "&lt;script type=&quot;text/javascript&quot;  src=&quot;http://www.salat-time.com/webmastertool.js&quot; &gt;";
	code = code + "&lt;/script&gt;\n";
	document.getElementById("copycode").innerHTML = "<textarea rows=\"20\" name=\"S1\" cols=\"96\">" + code + "</textarea>";
}

//------------------------- Map Functions -----------------------------


function updateMap()
{
	var center = map.getCenter();
	var lng = center.lng();
        var lat = center.lat();
	
	centerMarker.setPoint(center);
	writeData(center, 0);
}

// update map 
function mapDraw()
{
	var center = map.getCenter();
	var lng = center.lng();
	var lat = center.lat();

	var qiblaDir = -getDirection(lat, lng, satLat, satLng);

	map.clearOverlays();
	centerMarker.setPoint(center);
	map.addOverlay(centerMarker);
	
	getLine(lat, lng, qiblaDir, 0);
	writeData(center, qiblaDir);
	
	LoadAwqat(lat, lng);
}

// 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.sat-direction.com/?latitude=' + lat + '&longitude=' + lng + '&zoom=' + zoom;
}


//write information
function writeData(center, qiblaDir)
{
	var kaba = new GLatLng(satLat, satLng);
	//checkunit();
	//var distance = center.distanceFrom(kaba)/ 1000; 
	if (qiblaDir < 0) qiblaDir += 360;
	writeItem('curLng', center.lng().toFixed(4));
	writeItem('curLat', center.lat().toFixed(4));				
// 	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, iter)
{
	if (iter > 10) return 0;
// 	alert(lat);
	var cc = 0;
	var arrived = false;
		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- satLng)){
			to = new GPoint(satLng, satLat);
			arrived = true;
// 			alert(str(cc));
			map.addOverlay(new GPolyline([ from, to ], '#FF0000', 4, .70));
		}
		else{
			map.addOverlay(new GPolyline([ from, to ], '#FF0000', 4, .70));
			lat = lat2;
			lng = lng+ dLng;
			getLine(lat, lng, -getDirection(lat, lng, satLat, satLng), iter+1);
		}
	return 0;
}



//-------------------------- 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";
//     }
//    }
// }
