﻿/*Qibla Button*/
function QiblaControl() 
{
}
QiblaControl.prototype = new GControl();
QiblaControl.prototype.initialize = function (map) {
    var container = document.createElement("div");
    container.style.width = "350px";

    var qiblaButtonOuter = document.createElement("div");
    var qiblaButtonInner = document.createElement("div");
    var isActive = false;

    this.setOuterButtonStyle_(qiblaButtonOuter);
    this.setInnerButtonStyleInactive_(qiblaButtonInner, "جهت قبله");

    container.appendChild(qiblaButtonOuter);
    qiblaButtonOuter.appendChild(qiblaButtonInner);

    GEvent.addDomListener(qiblaButtonOuter, "click", function () { initQibla(); });

    map.getContainer().appendChild(container);
    return container;
}
// By default, the control will appear in the top left corner of the map with 7 pixels of padding.
QiblaControl.prototype.getDefaultPosition = function () {
    return new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(220, 6));
}

QiblaControl.prototype.setInnerButtonStyleInactive_ = function (button, name) {

    button.style.borderStyle = "solid;";
    button.style.borderColor = "white rgb(176, 176, 176) rgb(176, 176, 176) white";
    button.style.borderWidth = "1px";
    button.style.fontSize = "12px";
    button.title = name;
    button.innerHTML = name;
    button.style.display = "inline-block";
}

QiblaControl.prototype.setOuterButtonStyle_ = function (button) {

    button.style.border = "1px solid black";
    button.style.backgroundColor = "white";
    button.style.textAlign = "center";
    button.style.width = "6em";
    button.style.height = "18px";
    button.style.cursor = "pointer";
    button.style.display = "inline-block";
}

QiblaControl.prototype.setInnerButtonStyleActive_ = function (button, name) {

    button.style.borderStyle = "solid";
    button.style.borderColor = "rgb(52, 86, 132) rgb(108, 157, 223) rgb(108, 157, 223) rgb(52, 86, 132)";
    button.style.borderWidth = "1px";
    button.style.fontSize = "12px";
    button.style.fontWeight = "bold";
    button.title = name;
    button.innerHTML = name;
}
/***/
/* qlblog.js: QiblaLocator.com direction algorithm.*/
var qiblaLat = 21.42252;
var qiblaLng = 39.82621;
var geocoder, centerMarker;
//--------------------------- Initialize -----------------------------
// initialization function
function initQibla()
{
	var icon = new GIcon(null, 'http://www.mashhadmap.com/img/crosshair.gif');
	icon.iconSize = new GSize(17, 17);
	icon.iconAnchor = new GPoint(8, 8);
	var home = new GLatLng(36.2938901476139, 59.6028900146484);
	centerMarker = new GMarker(home, {icon: icon, clickable: false});
	GEvent.addListener(myGmap, 'move', mapDraw);
	mapDraw();
	alert("جهت قبله با خط قرمز بر روی نقشه مشخص می شود");
}
//------------------------- Map Functions -----------------------------
// update map 
function mapDraw()
{
    var center = myGmap.getCenter();
	var lng = center.lng();
	var lat = center.lat();
	
	var qiblaDir = -getDirection(lat, lng, qiblaLat, qiblaLng);

	myGmap.clearOverlays();
	centerMarker.setPoint(center);
	myGmap.addOverlay(centerMarker);

	var line = getLine(lat, lng, qiblaDir);
	myGmap.addOverlay(line);	
	writeData(center, qiblaDir);
}

//write information
function writeData(center, qiblaDir)
{
	var kaba = new GLatLng(qiblaLat, qiblaLng);
	if (qiblaDir < 0) qiblaDir += 360;	
	writeItem('direction','جهت قبله:'+ qiblaDir.toFixed(0)+ 'درجه&nbsp;N');
	var converter = 1000;   //km
	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 = myGmap.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, .70);
	return line;
}
// 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;
}
//-------------------------- Misc Functions  -----------------------

