// Copyright (c) 2007 Peter Buckner
// derived from general math routines. You may reuse without acknowledgement.

function boundingBoxForArray(arry, radius) {
    // create bounding box, and then continue to expand it for the other points
    var bb = new GLatLngBounds();
    for (var i=0;i<arry.length;i++) {
	var bb2 = distanceAroundPoint(arry[i], radius);
	var sw = bb2.getSouthWest();
	var ne = bb2.getNorthEast();
	bb.extend(sw);
	bb.extend(ne);
    }
    return bb;
}

function distanceAroundPoint(pt, radius) {
    // calculates a bounding box, such that the box is centered on pt (GLatLng),
    // and includes all points within dist miles in every direction
    var lat = pt.lat();
    var lng = pt.lng();
    var R = 3963.1676; //in miles
    var d = parseFloat(radius)/R; // angular distance covered on surface
    var lat_rad = lat * Math.PI / 180;
    var lng_rad = lng * Math.PI / 180;

    var new_lat = Math.asin(Math.sin(lat_rad)*Math.cos(d)); // need to determine distance in longitude;
    
    //zero is "up"
    var angle = 270 * Math.PI / 180; // rad to the west
    var west = ((lng_rad + Math.atan2(Math.sin(angle)*Math.sin(d)*Math.cos(lat_rad), Math.cos(d)-Math.sin(lat_rad)*Math.sin(new_lat))) * 180) / Math.PI;
    angle = 90 * Math.PI / 180;
    var east = ((lng_rad + Math.atan2(Math.sin(angle)*Math.sin(d)*Math.cos(lat_rad), Math.cos(d)-Math.sin(lat_rad)*Math.sin(new_lat))) * 180) / Math.PI;

    angle = 0 * Math.PI / 180;
    var south =  Math.asin(Math.sin(lat_rad)*Math.cos(d) + Math.cos(lat_rad)*Math.sin(d)*Math.cos(angle)) * 180 / Math.PI;
    
    angle = 180 * Math.PI / 180;
    var north =  Math.asin(Math.sin(lat_rad)*Math.cos(d) + Math.cos(lat_rad)*Math.sin(d)*Math.cos(angle)) * 180 / Math.PI;

    var sw = new GLatLng(south, west);
    var ne = new GLatLng(north, east);
    var bounds = new GLatLngBounds(sw, ne);
    return bounds;
};

function XmlGetValue(root, tagname) {
    var node = root.getElementsByTagName(tagname);
    if (node.length > 0) {
	if (node[0].firstChild != null) {
	    return node[0].firstChild.nodeValue;
	}
    };
    return "";
};

function GetParam(name, cookie) {
    var start=location.search.indexOf("?"+name+"=");
    if(start<0) start = location.search.indexOf("&"+name+"=");
    if(start<0) {
	// Not found in URL, try cookie
	var s=readCookie(cookie);
	if (s == null) return "";
	start=s.indexOf("&"+name+"=");
	if (start<0){
	    if (name+"=" == s.substr(0,name.length+1)){
		start = -1; // we add two below at name.length+2...
	    } else {
		return "";
	    }
	};
	start += name.length+2;
	var end=s.indexOf("&",start)-1;
	if (end<0) end = s.length;
	var result = '';
	for (var i=start;i<=end;i++){
	    var c=s.charAt(i);
	    result = result+(c=='+'?' ':c);
	};
	return unescape(result);
    };
    start += name.length+2;
    var end=location.search.indexOf("&",start)-1;
    if (end<0) end=location.search.length;
    var result='';
    for(var i=start;i<=end;i++){
	var c=location.search.charAt(i);
	result=result+(c=='+'?' ':c);
    };
    return unescape(result);
};

function GetIdValue(id) {
    var theElement = document.getElementById(id);
    if(theElement) {
	switch(theElement.type){
	case "checkbox": return theElement.checked; break;
	default: return theElement.value;break;
	}
    } else {
	return "";
    }
};

function SetLink(id) {
    var theLinkElement=document.getElementById(id);
    var zoom="";
    var center="";
    var mapType="";
    if (map != null && map.isLoaded()) {
	zoom = "&zoom="+escape(map.getZoom());
	center = "&center="+escape(map.getCenter().lat()+":"+map.getCenter().lng());
	switch(map.getCurrentMapType()){
	case G_NORMAL_MAP:;
	    mapType = "&mapType=G_NORMAL_MAP"; break;
	case G_SATELLITE_MAP:;
	    mapType = "&mapType=G_SATELLITE_MAP"; break;
	case G_HYBRID_MAP:;
	    mapType = "&mapType=G_HYBRID_MAP"; break;
	case G_PHYSICAL_MAP:;
	    mapType = "&mapType=G_PHYSICAL_MAP"; break;
	default:;
	    break;
	}
    } else {
	zoom = "";
	center = "";
    };
    var data = "address="+escape(GetIdValue('address'))+
	"&radius="+escape(GetIdValue('radius'))+
	"&duration="+escape(GetIdValue('duration'))+
	"&opacity="+escape(GetIdValue('opacity'))+
	"&timezone="+escape(GetIdValue('timezone'))+
	"&showTurbulence="+escape(GetIdValue('showTurbulence'))+
	"&showIce="+escape(GetIdValue('showIce'))+
	"&showMetars="+escape(GetIdValue('showMetars'))+
	"&showOther="+escape(GetIdValue('showOther'))+
	"&showTafs="+escape(GetIdValue('showTafs'))+
	"&showBasePrecip="+escape(GetIdValue('showBasePrecip'))+
	"&showSigTurb="+escape(GetIdValue('showSigTurb'))+
	"&showSigIce="+escape(GetIdValue('showSigIce'))+
	"&showSigConv="+escape(GetIdValue('showSigConv'))+
	"&showAirTurb="+escape(GetIdValue('showAirTurb'))+
	"&showAirIce="+escape(GetIdValue('showAirIce'))+
	"&showAirMtn="+escape(GetIdValue('showAirMtn'))+
	"&showAirIfr="+escape(GetIdValue('showAirIfr'))+
	"&showWinds="+escape(GetIdValue('showWinds'))+
	"&showTfr="+escape(GetIdValue('showTfr'))+
	"&showStadiumTfr="+escape(GetIdValue('showStadiumTfr'))+
	"&rawOnly="+escape(GetIdValue('rawOnly'))+
	"&public="+escape(GetIdValue('public'))+
	mapType+
	zoom+
	center;
    
    theLinkElement.href=location.pathname+"?" + data;
    saveCookie("view", data, 365);
};

function SetParam(p){
    var v=GetParam(p, "view");
    if (v != ""){
	theElement=document.getElementById(p);
	if(theElement) {
	    switch(theElement.type){
	    case "text":;
		theElement.value=v;
		break;
	    case "checkbox":;
		theElement.checked=(v=="true"?true:false);
		break;
	    case "select-one": ;
		for (var i=0;i<theElement.options.length;i++){
		    if(theElement.options[i].value == v){
			theElement.options[i].selected = true;
		    } else {
			theElement.options[i].selected = false;
		    };
		};
		break;
	    default:;
		break;
	    }
	}
    }
};

function Viewport() { 
    var windowX = (document.documentElement && document.documentElement.clientWidth) ||
	window.innerWidth || self.innerWidth ||	document.body.clientWidth; 
    var windowY = (document.documentElement && document.documentElement.clientHeight) ||
	window.innerHeight || self.innerHeight || document.body.clientHeight; 
    var scrollX = (document.documentElement && document.documentElement.scrollLeft) ||
	window.pageXOffset || self.pageXOffset || document.body.scrollLeft; 
    var scrollY = (document.documentElement && document.documentElement.scrollTop) ||
	window.pageYOffset || self.pageYOffset || document.body.scrollTop; 
    var pageX = (document.documentElement && document.documentElement.scrollWidth) ? document.documentElement.scrollWidth : (document.body.scrollWidth > document.body.offsetWidth) ? document.body.scrollWidth : document.body.offsetWidth; 
    var pageY = (document.documentElement && document.documentElement.scrollHeight) ? document.documentElement.scrollHeight : (document.body.scrollHeight > document.body.offsetHeight) ? document.body.scrollHeight : document.body.offsetHeight;
    return new Array(windowX, windowY, scrollX, scrollY, pageX, pageY);
};

function isIPhone() {
    return navigator.userAgent.indexOf('iPhone') != -1 || navigator.userAgent.indexOf('Aspen') != -1;
}

function isIE() {
    return navigator.userAgent.indexOf('MSIE') != -1;
}