//<!-- Begin
/***************************************************************************************************
 * FUNCTION:	lltowl(lat,lon)
 * 
 * DESCRIPTION:	This function converts a given Latitude and Longitude pair to Worldlocator.
 * 
 * PARAMETERS:	-lat -> a given latitude using "decimal degree" notation
 * 				-lon -> a given longitude using "decimal degree" notation
 * 				On both, the "-" signal means South for latitude and West for longitude.
 * 
 * RETURNS:		A string on Word Locator notation. i.e. GG48LH
 * 
 **************************************************************************************************/
function lltowl(lat,lon){
	
	mPi = Math.PI;
	mPi2 = mPi / 2;
	
	// Convert values to number and degrees to radians
	lat = Math.eval(lat) * ((2 * mPi)/360);
	lon = Math.eval(lon) * ((2 * mPi)/360);
	
	la = (lat + mPi2)/mPi;
	lo = (lon + mPi)/(mPi * 2);
	la = la + 0.000000000000001;
	lo = lo + 0.000000000000001;
	
	wl="";
	
	la = 18 * (la - Math.floor(la));
	lo = 18 * (lo - Math.floor(lo));
	
	wl = wl + sprintf("%c%c", 65+Math.floor(lo), 65+Math.floor(la));
	
	var i = null;
	for(i=0;i < 4;++i) {
		
		la = 10 * (la - Math.floor(la));
		lo = 10 * (lo - Math.floor(lo));
		
		wl = wl + sprintf("%d%d", Math.floor(lo), Math.floor(la));
		
		la = 24 * (la - Math.floor(la));
		lo = 24 * (lo - Math.floor(lo));
		
		wl = wl + sprintf("%c%c", 65+Math.floor(lo), 65+Math.floor(la));
	}
	
	return wl;
} // end lltowl
	
/***************************************************************************************************
 * FUNCTION:	wltoll(wl)
 * 
 * DESCRIPTION:	This function converts a given Latitude and Longitude to Worldlocator.
 * 
 * PARAMETERS:	A string representing a valid Word Locator like "GG48LJ".	
 * 
 * RETURNS:		An array of two elements. The first is the latitude and second is the longitude both
 *	 			using decimal degrees notataion (i.e. -21.4556). The "-" means South or West.
 * 				If it returns null means invalid World Locator string.
 * 
 **************************************************************************************************/	
function wltoll(wl){
	// Maiuscualas
	$(wl).value = $(wl).value.toString().toUpperCase();
	var str = $(wl).value;
	
	var sref = "ABCDEFGHIJKLMNOPQRSTUVXW";
	var nref = "0123456789";
	mPi = Math.PI; 
	var delta = 1.0;
	var BADINPUT = 0;
	
	var lat = 0.0;
	var lon = 0.0;
	var ret = new Array(null , null);
	
	while (1) {
		//First pair of Chars (base 18)
		LO = str.substr(0,1);
        LA = str.substr(1,1);
        str = str.substr(2);
        
        if (LO == "" || LA == "") break;
        
        if (sref.indexOf(LO) == -1 ||
            sref.indexOf(LA) == -1) {
            BADINPUT = 1;
            break;
        }
        lo = LO.charCodeAt(0) - 'A'.charCodeAt(0);
        la = LA.charCodeAt(0) - 'A'.charCodeAt(0);
        
        delta = delta / 18;
        lat = lat + (delta * la);
        lon = lon + (delta * lo);
        
        while (str && !BADINPUT) {
        	// 2nd/4th/6th pair, digits, base 10
        	LO = str.substr(0,1);
        	LA = str.substr(1,1);
        	str = str.substr(2);
        	
        	if (LO == "" || LA == "" ||
                nref.indexOf(LO) == -1 ||
                nref.indexOf(LA) == -1) {
                BADINPUT = 1;
                break;
            }
            
            lo = LO.charCodeAt(0) - '0'.charCodeAt(0);
        	la = LA.charCodeAt(0) - '0'.charCodeAt(0);
        	
        	delta = delta / 10;
        	lat = lat + (delta * la);
        	lon = lon + (delta * lo);
        	
        	if (str == "") { break; }
        	
        	// 3rd/5th/7th pair, alphabets, base 24
        	LO = str.substr(0,1);
        	LA = str.substr(1,1);
        	str = str.substr(2);
        
        	if (LO == "" || LA == "") break;
        
        	if (sref.indexOf(LO) == -1 ||
            	sref.indexOf(LA) == -1) {
            	BADINPUT = 1;
            	break;
        	}
        	lo = LO.charCodeAt(0) - 'A'.charCodeAt(0);
        	la = LA.charCodeAt(0) - 'A'.charCodeAt(0);
        
        	delta = delta / 24;
        	lat = lat + (delta * la);
        	lon = lon + (delta * lo);
        }
        break;
	}
	if (!BADINPUT){
		// Radians
		//ret[0] = ((lat - 0.5) * mPi) + (delta * mPi * 0.5);
		//ret[1] = ((lon - 0.5) * mPi * 2) + (delta * mPi);
		
		// Degrees
		ret[0] = (180.0*lat)-90.0;
		ret[1] = (360.0*lon)-180.0;
	}
	return ret;
} // end wltoll

/** * * Javascript sprintf 
 * 
 * http://www.webtoolkit.info/ 
 * 
 * **/
 sprintfWrapper = { 
 	init : function () { 
 		if (typeof arguments == "undefined") { 
 			return null; 
 		} 
 		if (arguments.length < 1) { 
 			return null; 
 		} 
 		if (typeof arguments[0] != "string") { 
 			return null;
 		} 
 		if (typeof RegExp == "undefined") { 
 			return null; 
 		} 
 		
 		var string = arguments[0]; 
 		var exp = new RegExp(/(%([%]|(\-)?(\+|\x20)?(0)?(\d+)?(\.(\d)?)?([bcdfosxX])))/g); 
 		var matches = new Array(); 
 		var strings = new Array(); 
 		var convCount = 0; 
 		var stringPosStart = 0; 
 		var stringPosEnd = 0; 
 		var matchPosEnd = 0; 
 		var newString = ''; 
 		var match = null; 
 		
 		while (match = exp.exec(string)) { 
 			if (match[9]) { 
 				convCount += 1; 
 			}
 			 
 			stringPosStart = matchPosEnd; 
 			stringPosEnd = exp.lastIndex - match[0].length; 
 			strings[strings.length] = string.substring(stringPosStart, stringPosEnd); 
 			matchPosEnd = exp.lastIndex; 
 			matches[matches.length] = { match: match[0], left: match[3] ? true : false, sign: match[4] || '', pad: match[5] || ' ', min: match[6] || 0, precision: match[8], code: match[9] || '%', negative: parseInt(arguments[convCount]) < 0 ? true : false, argument: String(arguments[convCount]) };
 		} 
 		
 		strings[strings.length] = string.substring(matchPosEnd); 
 		
 		if (matches.length == 0) { 
 			return string; 
 		} 
 		if ((arguments.length - 1) < convCount) { 
 			return null; 
 		} 
 		
 		var code = null; 
 		var match = null; 
 		var i = null; 
 		
 		for (i=0; i<matches.length; i++) { 
 			if (matches[i].code == '%') { 
 				substitution = '%' 
 			} else if (matches[i].code == 'b') { 
 				matches[i].argument = String(Math.abs(parseInt(matches[i].argument)).toString(2)); 
 				substitution = sprintfWrapper.convert(matches[i], true); 
 			} else if (matches[i].code == 'c') { 
 				matches[i].argument = String(String.fromCharCode(parseInt(Math.abs(parseInt(matches[i].argument))))); 
 				substitution = sprintfWrapper.convert(matches[i], true); 
 			} else if (matches[i].code == 'd') { 
 				matches[i].argument = String(Math.abs(parseInt(matches[i].argument))); 
 				substitution = sprintfWrapper.convert(matches[i]); 
 			} else if (matches[i].code == 'f') { 
 				matches[i].argument = String(Math.abs(parseFloat(matches[i].argument)).toFixed(matches[i].precision ? matches[i].precision : 6)); 
 				substitution = sprintfWrapper.convert(matches[i]); 
 			} else if (matches[i].code == 'o') { 
 				matches[i].argument = String(Math.abs(parseInt(matches[i].argument)).toString(8)); 
 				substitution = sprintfWrapper.convert(matches[i]); 
 			} else if (matches[i].code == 's') { 
 				matches[i].argument = matches[i].argument.substring(0, matches[i].precision ? matches[i].precision : matches[i].argument.length); 
 				substitution = sprintfWrapper.convert(matches[i], true); 
 			} else if (matches[i].code == 'x') { 
 				matches[i].argument = String(Math.abs(parseInt(matches[i].argument)).toString(16)); 
 				substitution = sprintfWrapper.convert(matches[i]); 
 			} else if (matches[i].code == 'X') { 
 				matches[i].argument = String(Math.abs(parseInt(matches[i].argument)).toString(16)); 
 				substitution = sprintfWrapper.convert(matches[i]).toUpperCase(); 
 			} else { 
 				substitution = matches[i].match; 
 			} 
 			
 			newString += strings[i]; 
 			newString += substitution; 
 		} 
 		newString += strings[i]; 
 		return newString; 
 	}, convert : function(match, nosign){ if (nosign) { match.sign = ''; } else { match.sign = match.negative ? '-' : match.sign; } var l = match.min - match.argument.length + 1 - match.sign.length; var pad = new Array(l < 0 ? 0 : l).join(match.pad); if (!match.left) { if (match.pad == "0" || nosign) { return match.sign + pad + match.argument; } else { return pad + match.sign + match.argument; } } else { if (match.pad == "0" || nosign) { return match.sign + match.argument + pad.replace(/0/g, ' '); } else { return match.sign + match.argument + pad; } } } } 
sprintf = sprintfWrapper.init;
// End -->//<!-- Begin
/***************************************************************************************************
 * FUNCTION:	lltowl(lat,lon)
 * 
 * DESCRIPTION:	This function converts a given Latitude and Longitude pair to Worldlocator.
 * 
 * PARAMETERS:	-lat -> a given latitude using "decimal degree" notation
 * 				-lon -> a given longitude using "decimal degree" notation
 * 				On both, the "-" signal means South for latitude and West for longitude.
 * 
 * RETURNS:		A string on Word Locator notation. i.e. GG48LH
 * 
 **************************************************************************************************/
function lltowl(lat,lon){
	
	mPi = Math.PI;
	mPi2 = mPi / 2;
	
	// Convert values to number and degrees to radians
	lat = Math.eval(lat) * ((2 * mPi)/360);
	lon = Math.eval(lon) * ((2 * mPi)/360);
	
	la = (lat + mPi2)/mPi;
	lo = (lon + mPi)/(mPi * 2);
	la = la + 0.000000000000001;
	lo = lo + 0.000000000000001;
	
	wl="";
	
	la = 18 * (la - Math.floor(la));
	lo = 18 * (lo - Math.floor(lo));
	
	wl = wl + sprintf("%c%c", 65+Math.floor(lo), 65+Math.floor(la));
	
	var i = null;
	for(i=0;i < 4;++i) {
		
		la = 10 * (la - Math.floor(la));
		lo = 10 * (lo - Math.floor(lo));
		
		wl = wl + sprintf("%d%d", Math.floor(lo), Math.floor(la));
		
		la = 24 * (la - Math.floor(la));
		lo = 24 * (lo - Math.floor(lo));
		
		wl = wl + sprintf("%c%c", 65+Math.floor(lo), 65+Math.floor(la));
	}
	
	return wl;
} // end lltowl
	
/***************************************************************************************************
 * FUNCTION:	wltoll(wl)
 * 
 * DESCRIPTION:	This function converts a given Latitude and Longitude to Worldlocator.
 * 
 * PARAMETERS:	A string representing a valid Word Locator like "GG48LJ".	
 * 
 * RETURNS:		An array of two elements. The first is the latitude and second is the longitude both
 *	 			using decimal degrees notataion (i.e. -21.4556). The "-" means South or West.
 * 				If it returns null means invalid World Locator string.
 * 
 **************************************************************************************************/	
function wltoll(wl){
	// Maiuscualas
	$(wl).value = $(wl).value.toString().toUpperCase();
	var str = $(wl).value;
	
	var sref = "ABCDEFGHIJKLMNOPQRSTUVXW";
	var nref = "0123456789";
	mPi = Math.PI; 
	var delta = 1.0;
	var BADINPUT = 0;
	
	var lat = 0.0;
	var lon = 0.0;
	var ret = new Array(null , null);
	
	while (1) {
		//First pair of Chars (base 18)
		LO = str.substr(0,1);
        LA = str.substr(1,1);
        str = str.substr(2);
        
        if (LO == "" || LA == "") break;
        
        if (sref.indexOf(LO) == -1 ||
            sref.indexOf(LA) == -1) {
            BADINPUT = 1;
            break;
        }
        lo = LO.charCodeAt(0) - 'A'.charCodeAt(0);
        la = LA.charCodeAt(0) - 'A'.charCodeAt(0);
        
        delta = delta / 18;
        lat = lat + (delta * la);
        lon = lon + (delta * lo);
        
        while (str && !BADINPUT) {
        	// 2nd/4th/6th pair, digits, base 10
        	LO = str.substr(0,1);
        	LA = str.substr(1,1);
        	str = str.substr(2);
        	
        	if (LO == "" || LA == "" ||
                nref.indexOf(LO) == -1 ||
                nref.indexOf(LA) == -1) {
                BADINPUT = 1;
                break;
            }
            
            lo = LO.charCodeAt(0) - '0'.charCodeAt(0);
        	la = LA.charCodeAt(0) - '0'.charCodeAt(0);
        	
        	delta = delta / 10;
        	lat = lat + (delta * la);
        	lon = lon + (delta * lo);
        	
        	if (str == "") { break; }
        	
        	// 3rd/5th/7th pair, alphabets, base 24
        	LO = str.substr(0,1);
        	LA = str.substr(1,1);
        	str = str.substr(2);
        
        	if (LO == "" || LA == "") break;
        
        	if (sref.indexOf(LO) == -1 ||
            	sref.indexOf(LA) == -1) {
            	BADINPUT = 1;
            	break;
        	}
        	lo = LO.charCodeAt(0) - 'A'.charCodeAt(0);
        	la = LA.charCodeAt(0) - 'A'.charCodeAt(0);
        
        	delta = delta / 24;
        	lat = lat + (delta * la);
        	lon = lon + (delta * lo);
        }
        break;
	}
	if (!BADINPUT){
		// Radians
		//ret[0] = ((lat - 0.5) * mPi) + (delta * mPi * 0.5);
		//ret[1] = ((lon - 0.5) * mPi * 2) + (delta * mPi);
		
		// Degrees
		ret[0] = (180.0*lat)-90.0;
		ret[1] = (360.0*lon)-180.0;
	}
	return ret;
} // end wltoll

/** * * Javascript sprintf 
 * 
 * http://www.webtoolkit.info/ 
 * 
 * **/
 sprintfWrapper = { 
 	init : function () { 
 		if (typeof arguments == "undefined") { 
 			return null; 
 		} 
 		if (arguments.length < 1) { 
 			return null; 
 		} 
 		if (typeof arguments[0] != "string") { 
 			return null;
 		} 
 		if (typeof RegExp == "undefined") { 
 			return null; 
 		} 
 		
 		var string = arguments[0]; 
 		var exp = new RegExp(/(%([%]|(\-)?(\+|\x20)?(0)?(\d+)?(\.(\d)?)?([bcdfosxX])))/g); 
 		var matches = new Array(); 
 		var strings = new Array(); 
 		var convCount = 0; 
 		var stringPosStart = 0; 
 		var stringPosEnd = 0; 
 		var matchPosEnd = 0; 
 		var newString = ''; 
 		var match = null; 
 		
 		while (match = exp.exec(string)) { 
 			if (match[9]) { 
 				convCount += 1; 
 			}
 			 
 			stringPosStart = matchPosEnd; 
 			stringPosEnd = exp.lastIndex - match[0].length; 
 			strings[strings.length] = string.substring(stringPosStart, stringPosEnd); 
 			matchPosEnd = exp.lastIndex; 
 			matches[matches.length] = { match: match[0], left: match[3] ? true : false, sign: match[4] || '', pad: match[5] || ' ', min: match[6] || 0, precision: match[8], code: match[9] || '%', negative: parseInt(arguments[convCount]) < 0 ? true : false, argument: String(arguments[convCount]) };
 		} 
 		
 		strings[strings.length] = string.substring(matchPosEnd); 
 		
 		if (matches.length == 0) { 
 			return string; 
 		} 
 		if ((arguments.length - 1) < convCount) { 
 			return null; 
 		} 
 		
 		var code = null; 
 		var match = null; 
 		var i = null; 
 		
 		for (i=0; i<matches.length; i++) { 
 			if (matches[i].code == '%') { 
 				substitution = '%' 
 			} else if (matches[i].code == 'b') { 
 				matches[i].argument = String(Math.abs(parseInt(matches[i].argument)).toString(2)); 
 				substitution = sprintfWrapper.convert(matches[i], true); 
 			} else if (matches[i].code == 'c') { 
 				matches[i].argument = String(String.fromCharCode(parseInt(Math.abs(parseInt(matches[i].argument))))); 
 				substitution = sprintfWrapper.convert(matches[i], true); 
 			} else if (matches[i].code == 'd') { 
 				matches[i].argument = String(Math.abs(parseInt(matches[i].argument))); 
 				substitution = sprintfWrapper.convert(matches[i]); 
 			} else if (matches[i].code == 'f') { 
 				matches[i].argument = String(Math.abs(parseFloat(matches[i].argument)).toFixed(matches[i].precision ? matches[i].precision : 6)); 
 				substitution = sprintfWrapper.convert(matches[i]); 
 			} else if (matches[i].code == 'o') { 
 				matches[i].argument = String(Math.abs(parseInt(matches[i].argument)).toString(8)); 
 				substitution = sprintfWrapper.convert(matches[i]); 
 			} else if (matches[i].code == 's') { 
 				matches[i].argument = matches[i].argument.substring(0, matches[i].precision ? matches[i].precision : matches[i].argument.length); 
 				substitution = sprintfWrapper.convert(matches[i], true); 
 			} else if (matches[i].code == 'x') { 
 				matches[i].argument = String(Math.abs(parseInt(matches[i].argument)).toString(16)); 
 				substitution = sprintfWrapper.convert(matches[i]); 
 			} else if (matches[i].code == 'X') { 
 				matches[i].argument = String(Math.abs(parseInt(matches[i].argument)).toString(16)); 
 				substitution = sprintfWrapper.convert(matches[i]).toUpperCase(); 
 			} else { 
 				substitution = matches[i].match; 
 			} 
 			
 			newString += strings[i]; 
 			newString += substitution; 
 		} 
 		newString += strings[i]; 
 		return newString; 
 	}, convert : function(match, nosign){ if (nosign) { match.sign = ''; } else { match.sign = match.negative ? '-' : match.sign; } var l = match.min - match.argument.length + 1 - match.sign.length; var pad = new Array(l < 0 ? 0 : l).join(match.pad); if (!match.left) { if (match.pad == "0" || nosign) { return match.sign + pad + match.argument; } else { return pad + match.sign + match.argument; } } else { if (match.pad == "0" || nosign) { return match.sign + match.argument + pad.replace(/0/g, ' '); } else { return match.sign + match.argument + pad; } } } } 
sprintf = sprintfWrapper.init;
// End -->