//Copyright 2008, Robert Gibson, Scouts Australia
//Email tyakunda@gmail.com

//code executed after xhtml elements loaded
//note: < and > not html escaped.


function dummyFunction(){}
function GClientGeocoder(){
	this.setBaseCountryCode=dummyFunction;
	this.setCache=dummyFunction;
};

function GIcon() {}
var TYAKUNDA_URL="http://tyakunda.scoutsqld.com.au/";
function GSize() {}
function GPoint() {}
function GMap2() {
	this.addOverlay=dummyFunction;
}
function GMarker(){
	this.setPoint=dummyFunction;
}
function GMarkerManager(){
	this.addMarker=dummyFunction;
	this.refresh=dummyFunction;
}
var map=new GMap2();
function GLatLng(){}

function GEvent(){
	this.addListener=dummyFunction;
};
GEvent.addListener=dummyFunction;


function createCities(){}
function moveMarkers(){}

	function mergeMarkerList(m) {
		var left,right,mid,i;
		left=[];right=[];
		if (m.length<2) return m;
		mid=Math.round(m.length/2);
		for (i=0;i<mid;i++) {
			left.push(m[i]);
		}
		for (i=mid;i<m.length;i++) {
			right.push(m[i]);
		}

		left=mergeMarkerList(left);

		right=mergeMarkerList(right);
		
		return mergeM(left,right);
	}
	function mergeM(left,right) {
		result=[];
		l=0;r=0;
		while (l<left.length && r<right.length) {
			if (left[l].sortTitle<=right[r].sortTitle) {
				result.push(left[l++]);
			} else {
				result.push(right[r++]);
			}
		}
		while (l<left.length) {
			result.push(left[l++]);
		}
		while (r<right.length) {
			result.push(right[r++]);
		}
		return result;
	}

function mergeGroupList(m) {
	//window.status="mgl "+m.length;
	
	var left,right,mid,i;
	left=[];right=[];
	if (m.length<2) return m;
	mid=Math.round(m.length/2);
	for (i=0;i<mid;i++) {
		left.push(m[i]);
	}
	for (i=mid;i<m.length;i++) {
		right.push(m[i]);
	}

	left=mergeGroupList(left);

	right=mergeGroupList(right);
	
	return merge(left,right);
}

function merge(left,right) {
	result=[];
	l=0;r=0;
	while (l<left.length && r<right.length) {
		if (left[l].distance<=right[r].distance) {
			result.push(left[l++]);
		} else {
			result.push(right[r++]);
		}
	}
	while (l<left.length) {
		result.push(left[l++]);
	}
	while (r<right.length) {
		result.push(right[r++]);
	}
	return result;
}

var sortedGroups=[];

function updateDistances(target) {
	var tgtLng=target.lng;
	var tgtLat=target.lat;
	var i,distance;
	var EARTH_RADIUS = 6371; // km
	
	for (i=0;i<groups.length;i++) {
				
		//adapted from code at http://www.movable-type.co.uk/scripts/latlong.html
		
		var dLat = rad(tgtLat-groups[i].lat);
		var dLon = rad(tgtLng-groups[i].lng); 
		var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
		Math.cos(rad(groups[i].lat)) * Math.cos(rad(tgtLat)) * 
		Math.sin(dLon/2) * Math.sin(dLon/2); 
		var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
		var d = EARTH_RADIUS * c;
		
		distance=d;//(Math.sqrt(Math.pow(tgtX-nxtX,2)+Math.pow(tgtY-nxtY,2))); //Math.round
		//window.status=groups[i].title+" "+distance;
		groups[i].distance=distance;
	}	
	sortedGroups=mergeGroupList(groups);
	//rankList(groups);
}

function rad (deg) {
	return deg*Math.PI/180;
}

function dflt(obj,key,val) {
	if (typeof obj[key]=='undefined') {
		obj[key]=val;
	}
}

function getZLinks(id,options) {

	var zbounds=zobjs[id];
	var groupsInside=[];
	if (!zbounds) return "unavailable";
	var retval="";
	var sg;
	var title="";

	var i;
	for (i=0;i<groups.length;i++) {
		sg=groups[i];
		if (contains(zbounds,sg)) {
			groupsInside.push(sg);
			
		}
	}
	if (groupsInside.length>options.num) {
		groupsInside=groupsInside.sort(signedRand);
		title="Random ";
	} else {
		options.num=groupsInside.length;
		groupsInside=groupsInside.sort(compareMarkers);
		
	}
	title+=" Scout Groups in "+zbounds.name;
	if (options.heading) retval+="<b>"+title+"</b><br />";
	
	for (i=0;i<options.num;i++) {
		sg=groupsInside[i];
		retval+=("<a href=\""+sg.url+"\">"+sg.title+"</a> (<a href=\"http://tyakunda.scoutsqld.com.au/"+options.page+options.septype+sg.identifier+"\">map</a>)<br />");

	}
	if (options.footer) retval+=("<span style=\"font-size:0.8em\">Powered by the "+"Australian Scout Group Locator".link(TYAKUNDA_URL+"locator.html")+"</span><br />");
	return retval;
	
}

function getLinks(id,options) {
	var retval="";

	if (typeof options!='object') {
		options={};
	}
	dflt(options,"heading",true);
	dflt(options,"page","locator.html");
	dflt(options,"num",10);
	dflt(options,"footer",true);
	dflt(options,"septype","?");

	var target=zmarker[id];
	if (typeof target!='object') { 
		return getZLinks(id,options);
	}
	
	updateDistances(target);
	if (options.heading) retval+=("<b>Scout Groups near "+target.title+"</b><br />");
	var sg;
	var num;
	num=target.isGroup?options.num+1:options.num;
	for (i=0;i<num;i++) {
		sg=sortedGroups[i];
		if (sg!=target) {
			if ((typeof sg.url)=='undefined') {
				retval+=(sg.title+" (<a href=\"http://tyakunda.scoutsqld.com.au/"+options.page+options.septype+sg.identifier+"\">map</a>)<br />");
			} else {
				retval+=("<a href=\""+sg.url+"\">"+sg.title+"</a> (<a href=\"http://tyakunda.scoutsqld.com.au/"+options.page+options.septype+sg.identifier+"\">map</a>)<br />");
			}
		}
	} 
	if (options.footer) retval+=("<span style=\"font-size:0.8em\">Powered by the "+"Australian Scout Group Locator".link(TYAKUNDA_URL+"locator.html")+"</span><br />");
	return retval;
}

function contains(zmarker,marker) {
	return ((zmarker.n>marker.lat) && (zmarker.e>marker.lng) && (zmarker.s<marker.lat) && (zmarker.w<marker.lng));
}

function links(id,options) {
	document.write(getLinks(id,options));
}

function compareMarkers(a,b) {
	return (a.sortTitle<b.sortTitle)?-1:1;
}

function signedRand() {
	return Math.random()-0.5;
}