<!--

/*
* Copyright (c)2010 Petr Koci, Czech Republic
* homepage: http://www.txtester.com
*/

if(!window['txtester']){
	window['txtester']={};
	txtester.Error=function(mycode,mymessage){
		this.className 		= "Error";
		this.code		= mycode || -1;
		this.message		= mymessage || "This error has no a description.";
	}
}

if(!window['txtester']['gpscoordcalc']){

	window['txtester']['gpscoordcalc']={};

/*
* class CoordDec
*/
	txtester.gpscoordcalc.CoordDec=function(latlonchar,d3,d6){
		this.className 		= "CoordDec";
		this.latlonChar 		= latlonchar //|| ""; 	//valid values: "", "-"
		this.ddd 		= d3 //|| 0;	//format 000
		this.dddddd 		= d6 //|| 0;	//format 000000
	};

/*
* class CoordDM
*/
	txtester.gpscoordcalc.CoordDM=function(latlonchar,d3,m2,m3){
		this.className 		= "CoordDM";
		this.latlonChar 		= latlonchar || "";//valid values: "N", "S", "W", "E"
		this.ddd	 	= d3 //|| 0;	//format 000
		this.mm 		= m2 //|| 0;	//format 00
		this.mmm 		= m3 //|| 0;	//format 000
	};

/*
* class CoordDMS
*/
	txtester.gpscoordcalc.CoordDMS=function(latlonchar,d3,m2,s2,s4){
		this.className 		= "CoordDMS";
		this.latlonChar 		= latlonchar || "";//valid values: "N", "S", "W", "E"
		this.ddd	 	= d3 //|| 0;	//format 000
		this.mm 		= m2 //|| 0;	//format 00
		this.ss 		= s2 //|| 0;	//format 00
		this.ssss	 	= s4 //|| 0;	//format 0000
	};

/*
* class LatLon
*/
	txtester.gpscoordcalc.LatLon=function(latitude,longitude){
		this.className 		= "LatLon";
		this.lat 		= latitude;	//null;
		this.lon	 	= longitude;	//null;
	};

/*
* class Coordinates
*/
	txtester.gpscoordcalc.Coordinates=function(LLDec,LLDM,LLDMS){
		this.className 		= "Coordinates";
		this.LatLonDec		= LLDec || new txtester.gpscoordcalc.LatLon(new txtester.gpscoordcalc.CoordDec, new txtester.gpscoordcalc.CoordDec);
		this.LatLonDM		= LLDM  || new txtester.gpscoordcalc.LatLon(new txtester.gpscoordcalc.CoordDM, new txtester.gpscoordcalc.CoordDM);
		this.LatLonDMS		= LLDMS || new txtester.gpscoordcalc.LatLon(new txtester.gpscoordcalc.CoordDMS, new txtester.gpscoordcalc.CoordDMS);
	};


/*
* txtester.gpscoordcalc
*/
	txtester.gpscoordcalc.errorcode={
		NAO_LATLON:1,	//Not a Object LatLon
		LAT_CHAR:18,
		LON_CHAR:19,
		LAT_DDD:20,
		LON_DDD:21,
		LAT_DDDDDD:22,
		LON_DDDDDD:23,
		LAT_OVERFLOWE:24,
		LON_OVERFLOWE:25,
		LAT_MM:26,
		LON_MM:27,
		LAT_MMM:28,
		LON_MMM:29,
		LAT_SS:30,
		LON_SS:31,
		LAT_SSSS:32,
		LON_SSSS:33,
		GETLATLON_NO_COORDINATES: 34	// The global function getLatLon 
	}

/*
* txtester.gpscoordcalc.validate()
*/

	txtester.gpscoordcalc.validate=function(objLatLon,fc){

		var result=function(){
			this.error=false;
			this.LatLon=null;
		};

		var result_char=function(){
			this.error=false;
			this.char="";	//"N","S","E","W","","-"
		}

		try{
			if(objLatLon.className!="LatLon"){
				result.error=new txtester.Error(txtester.gpscoordcalc.errorcode.NAO_LATLON);
				fc(result);
				return;
			}
		}
		catch(e){
			result.error=new txtester.Error(txtester.gpscoordcalc.errorcode.NAO_LATLON);
			fc(result);
			return;
		}

		switch(objLatLon.lat.className){
			case "CoordDec" :
				result.LatLon=m_validateDec(objLatLon);
				fc(result);
				return;
			case "CoordDM" :
				result.LatLon=m_validateDM(objLatLon);
				fc(result);
				return;
			case "CoordDMS" :
				result.LatLon=m_validateDMS(objLatLon);
				fc(result);
				return;
		}

		function m_validateDec(objLatLon_in){
			var i=0;
			var _ddd;
			var _ddd_max = 90;
			var code=0;

			var objDec = objLatLon_in.lat;
			var objLatLon_out = new txtester.gpscoordcalc.LatLon(new txtester.gpscoordcalc.CoordDec,new txtester.gpscoordcalc.CoordDec);
			var objLatLon = new txtester.gpscoordcalc.LatLon(new txtester.gpscoordcalc.CoordDec,new txtester.gpscoordcalc.CoordDec);

			for(i=0;i<2;i++){
				with(objDec){
					m_char(latlonChar,i,true,function(result){
						if(result_char.error){
							//result.error = new txtester.Error(result_char.error.code);
							result.error = result_char.error;
							return(objLatLon);
						}
						else{
							latlonChar=result_char.char;
						}
					})

					if(!m_isPositiveInteger(ddd)){

						if(i==0)code=txtester.gpscoordcalc.errorcode.LAT_DDD;
						else code=txtester.gpscoordcalc.errorcode.LON_DDD;
			
						result.error = new txtester.Error(code);
						return(objLatLon);
					}
					ddd=parseInt(ddd,10);

					if(!m_isPositiveInteger(dddddd)){

						if(i==0)code=txtester.gpscoordcalc.errorcode.LAT_DDDDDD;
						else code=txtester.gpscoordcalc.errorcode.LON_DDDDDD;
					
						result.error = new txtester.Error(code);
						return(objLatLon);
					}
					//100807dddddd=parseInt(dddddd,10);

					ddd = ddd + parseFloat("0." + dddddd.toString(),10);
					dddddd=ddd.toFixed(6);
					ddd=parseInt(dddddd,10);

					dddddd-=ddd;
					dddddd=dddddd.toFixed(6);

					dddddd=dddddd.toString();
					dddddd=dddddd.substr(2,dddddd.length-2);
					//100807dddddd=parseInt(dddddd,10);


					//Control value: _ddd
					if(ddd > _ddd_max){

						if(i==0) code=txtester.gpscoordcalc.errorcode.LAT_OVERFLOWE;
						else code=txtester.gpscoordcalc.errorcode.LON_OVERFLOWE;
					
						result.error = new txtester.Error(code);
						return(objLatLon);
					}	

					_ddd_max += 90; // 90.0 --> 180.0 for i=1

					//Update values
					if(i==0){
						objLatLon_out.lat = objDec;
						objDec = null;
						objDec = objLatLon_in.lon;
					}
					else{
						objLatLon_out.lon = objDec;
						objDec = null;
					}
				}
			}
			objLatLon = null;
			return(objLatLon_out);
		}//m_validateDec

		function m_validateDM(objLatLon_in){
			var i=0;
			var _ddd_max = 90;
			var code=0;
			var bol_max = false;

			var objDM = objLatLon_in.lat;
			var objLatLon_out = new txtester.gpscoordcalc.LatLon(new txtester.gpscoordcalc.CoordDM, new txtester.gpscoordcalc.CoordDM);
			var objLatLon = new txtester.gpscoordcalc.LatLon(new txtester.gpscoordcalc.CoordDM, new txtester.gpscoordcalc.CoordDM);

			for(i=0;i<2;i++){

				with(objDM){

					m_char(latlonChar,i,false,function(result){
						if(result_char.error){
							//result.error = new txtester.Error(result_char.error.code);
							result.error = result_char.error;
							return(objLatLon);
						}
						else{
							latlonChar=result_char.char;
						}
					})

					//Control value: ddd
					if(!m_isPositiveInteger(ddd)){
						if(i==0)code=txtester.gpscoordcalc.errorcode.LAT_DDD;
						else code=txtester.gpscoordcalc.errorcode.LON_DDD;
			
						result.error = new txtester.Error(code);
						return(objLatLon);
					}
					ddd=parseInt(ddd,10);

					//Control value: mm
					if(!m_isPositiveInteger(mm)){
						if(i==0)code=txtester.gpscoordcalc.errorcode.LAT_MM;
						else code=txtester.gpscoordcalc.errorcode.LON_MM;
			
						result.error = new txtester.Error(code);
						return(objLatLon);
					}
					mm=parseInt(mm,10);

					//Control value: mmm
					if(!m_isPositiveInteger(mmm)){
						if(i==0)code=txtester.gpscoordcalc.errorcode.LAT_MMM;
						else code=txtester.gpscoordcalc.errorcode.LON_MMM;
			
						result.error = new txtester.Error(code);
						return(objLatLon);
					}
					mmm=parseInt(mmm,10);

					//Control range: ddd
					if(ddd>_ddd_max){
						if(i==0)code=txtester.gpscoordcalc.errorcode.LAT_OVERFLOWE;
						else code=txtester.gpscoordcalc.errorcode.LON_OVERFLOWE;

						result.error = new txtester.Error(code);
						return(objLatLon);
					}

					if(ddd==_ddd_max)bol_max = true;
					_ddd_max += 90; //90.0 => 180.0 for i=1

					//Control overflowe
					if(bol_max&&(mm>0||mmm>0)){
						if(i==0)code=txtester.gpscoordcalc.errorcode.LAT_OVERFLOWE;
						else code=txtester.gpscoordcalc.errorcode.LON_OVERFLOWE;

						result.error = new txtester.Error(code);
						return(objLatLon);
					}

					//Control range: mm
					if(mm>59){
						if(i==0)code=txtester.gpscoordcalc.errorcode.LAT_OVERFLOWE;
						else code=txtester.gpscoordcalc.errorcode.LON_OVERFLOWE;

						result.error = new txtester.Error(code);
						return(objLatLon);
					}

					mmm = m_intfix(mmm,3);

					//Update values
					if(i==0){
						objLatLon_out.lat = objDM;
						objDM = null;
						objDM = objLatLon_in.lon;
						bol_max=false;
					}
					else{
						objLatLon_out.lon = objDM;
						objDM = null;
					}

				}//with
			}//for

			objLatLon = null;
			return(objLatLon_out);
		}//m_validateDM

		function m_validateDMS(objLatLon_in){

			var i=0;
			var _ddd_max = 90;
			var code=0;
			var bol_max =false;

			var objDMS = objLatLon_in.lat;
			var objLatLon_out = new txtester.gpscoordcalc.LatLon(new txtester.gpscoordcalc.CoordDMS, new txtester.gpscoordcalc.CoordDMS);
			var objLatLon = new txtester.gpscoordcalc.LatLon(new txtester.gpscoordcalc.CoordDMS, new txtester.gpscoordcalc.CoordDMS);

			for (i=0;i<2;i++){
				with(objDMS){

					m_char(latlonChar,i,false,function(result){
						if(result_char.error){
							//result.error = new txtester.Error(result_char.error.code);
							result.error = result_char.error;
							return(objLatLon);
						}
						else{
							latlonChar=result_char.char;
						}
					})

					//Control value: ddd
					if(!m_isPositiveInteger(ddd)){
						if(i==0)code=txtester.gpscoordcalc.errorcode.LAT_DDD;
						else code=txtester.gpscoordcalc.errorcode.LON_DDD;
			
						result.error = new txtester.Error(code);
						return(objLatLon);
					}
					ddd=parseInt(ddd,10);

					//Control value: mm
					if(!m_isPositiveInteger(mm)){
						if(i==0)code=txtester.gpscoordcalc.errorcode.LAT_MM;
						else code=txtester.gpscoordcalc.errorcode.LON_MM;
			
						result.error = new txtester.Error(code);
						return(objLatLon);
					}

					mm=parseInt(mm,10);

					//Control value: ss
					if(!m_isPositiveInteger(ss)){
						if(i==0)code=txtester.gpscoordcalc.errorcode.LAT_SS;
						else code=txtester.gpscoordcalc.errorcode.LON_SS;
			
						result.error = new txtester.Error(code);
						return(objLatLon);
					}
					ss=parseInt(ss,10);

					//Control value: ssss
					if(!m_isPositiveInteger(ssss)){
						if(i==0)code=txtester.gpscoordcalc.errorcode.LAT_SSSS;
						else code=txtester.gpscoordcalc.errorcode.LON_SSSS;
			
						result.error = new txtester.Error(code);
						return(objLatLon);
					}
					ssss=parseInt(ssss,10);

					//Control range: ddd
					if(ddd>_ddd_max){
						if(i==0)code=txtester.gpscoordcalc.errorcode.LAT_OVERFLOWE;
						else code=txtester.gpscoordcalc.errorcode.LON_OVERFLOWE;

						result.error = new txtester.Error(code);
						return(objLatLon);
					}

					if(ddd==_ddd_max)bol_max = true;
					_ddd_max += 90; //90.0 => 180.0 for i=1

					//Control overflowe
					if(bol_max&&(mm>0||ss>0||ssss>0)){
						if(i==0)code=txtester.gpscoordcalc.errorcode.LAT_OVERFLOWE;
						else code=txtester.gpscoordcalc.errorcode.LON_OVERFLOWE;

						result.error = new txtester.Error(code);
						return(objLatLon);
					}

					//Control range: mm,ss
					if(mm>59||ss>59){
						if(i==0)code=txtester.gpscoordcalc.errorcode.LAT_OVERFLOWE;
						else code=txtester.gpscoordcalc.errorcode.LON_OVERFLOWE;

						result.error = new txtester.Error(code);
						return(objLatLon);
					}

					ssss = m_intfix(ssss,4);

					//Update values
					if(i==0){
						objLatLon_out.lat = objDMS;
						objDMS = null;
						objDMS = objLatLon_in.lon;
					}
					else{
						objLatLon_out.lon = objDMS;
						objDMS = null;
					}
				}//with
			}//for
			objLatLon = null;
			return(objLatLon_out);
		}m_validateDMS
	

		function m_isInteger(value){
			if(value.toString()==((parseInt(value)).toString()),10)return (true);
			return(false);
		}

		function m_isPositiveInteger(value){
			value=value.toString();
			if(value.search(/[^0-9]/)==-1)return(true)
			return(false)
		}

		function m_intfix(value,i){
			value="0."+value.toString();
			value=parseFloat(value,10);
			value=value.toFixed(i);
			value=value.toString();
			value=value.substr(2, value.length-2);
			value=parseInt(value,10);	
			return(value);
		}

		function m_char(char,bolLon,bolDec,fc){
			var code;
			if(char==undefined)char="";			
			char=char.toString();
			char=char.toUpperCase();
			char=char.replace(/\x20/g,"");	//spaces(hex20) to ""
			bolLon=bolLon.valueOf();
			if(!bolLon){
				if(char=="" || char=="+")char="N";
				if(char=="-")char="S";
				if(char=="S" || char=="N"){
					if(bolDec){
						if(char=="N")char="";
						if(char=="S")char="-";
					}
					result_char.char=char;
					fc(result_char);
					return;
				}
				code=txtester.gpscoordcalc.errorcode.LAT_CHAR;
			}
			else{
				if(char=="" || char=="+")char="E";
				if(char=="-")char="W";
				if(char=="E" || char=="W"){
					if(bolDec){
						if(char=="E")char="";
						if(char=="W")char="-";
					}
					result_char.char=char;
					fc(result_char);
					return;
				}
				code=txtester.gpscoordcalc.errorcode.LON_CHAR;
			}
			result_char.error= new txtester.Error(code);
			fc(result_char);
		}//m_char

	}//txtester.gpscoordcalc.validate

/*
* txtester.gpscoordcalc.calculate()
*/

	txtester.gpscoordcalc.calculate	= function(objLatLon_in,fc){
	
		var result=function(){
				this.error=false;
				this.Coordinates=null;
			};

			var result_lr=function(){
				this.error=false;
				this.l=0;	//left value of float number
				this.r=0;	//right value of float number
			}

			var cn = objLatLon_in.lat.className;
			if(cn != objLatLon_in.lon.className){
				this.err = 1;
				return;
			}

			var coords = new txtester.gpscoordcalc.Coordinates;

			switch(cn){
				case "CoordDec":
					coords.LatLonDec = objLatLon_in;
					coords.LatLonDM = m_convertDectoDM(objLatLon_in);
					coords.LatLonDMS = m_convertDMtoDMS(coords.LatLonDM);
					result.Coordinates=coords;
					fc(result);
					return;
				case "CoordDM":
					coords.LatLonDM = objLatLon_in;
					coords.LatLonDec = m_convertDMtoDec(objLatLon_in);
					coords.LatLonDMS = m_convertDMtoDMS(coords.LatLonDM);
					result.Coordinates=coords;
					fc(result);
					return;
				case "CoordDMS":
					coords.LatLonDMS = objLatLon_in;
					coords.LatLonDM = m_convertDMStoDM(objLatLon_in);
					coords.LatLonDec = m_convertDMtoDec(coords.LatLonDM);
					result.Coordinates=coords;
					fc(result);
					return;
			}//switch

			function m_convertDectoDM(objLatLon_in){
				var _mm;
				var _mmm;
				var objDM = null;
				var objLatLon_out = new txtester.gpscoordcalc.LatLon(new txtester.gpscoordcalc.CoordDM, new txtester.gpscoordcalc.CoordDM);
				var i;
				var objDec = objLatLon_in.lat;

				for(i=0;i<2;i++){
					_mm=objDec.dddddd; 
					_mm="0." + _mm.toString();
					_mm=parseFloat(_mm,10)*60;
					m_get_lr(_mm,3,function(result_lr){
						if(!result_lr.error){
							_mm=result_lr.l;
							_mmm=result_lr.r;
						}
					})

					objDM = new txtester.gpscoordcalc.CoordDM;
					with(objDM){
						ddd = objDec.ddd;
						mm = _mm;
						mmm = _mmm;
					}
					if(i==0){
						objDM.latlonChar=m_latlonChar_fromDec(objDec.latlonChar,true);
						objLatLon_out.lat = objDM;
						objDec = null;
						objDec = objLatLon_in.lon;
					}
					else{
						objDM.latlonChar=m_latlonChar_fromDec(objDec.latlonChar,false);
						objLatLon_out.lon = objDM;
					}
					objDM = null;
				}//for
				return(objLatLon_out);
			}//m_convertDectoDM

			function m_convertDMtoDec(objLatLon_in){
				var _dddddd;
				var objDec = null;
				var objLatLon_out = new txtester.gpscoordcalc.LatLon(new txtester.gpscoordcalc.CoordDec, new txtester.gpscoordcalc.CoordDec);
				var objDM = objLatLon_in.lat;
				for(var i=0;i<2;i++){
					_dddddd=objDM.mmm;
					_dddddd="0."+ _dddddd.toString();
					_dddddd=objDM.mm + parseFloat(_dddddd,10);
					_dddddd=_dddddd/60;
					m_get_lr(_dddddd,6,function(result_lr){
						if(!result_lr.error){
							_dddddd=result_lr.r;
						}
					})
					objDec = new txtester.gpscoordcalc.CoordDec;
					with(objDec){
						latlonChar = m_latlonChar_toDec(objDM.latlonChar);
						ddd = objDM.ddd;
						dddddd = _dddddd;
					}
					if(i==0){
						objLatLon_out.lat = objDec;
						objDM = null;
						objDM = objLatLon_in.lon;
					}
					else{
						objLatLon_out.lon = objDec;
					}
					objDec = null;
				}
				return(objLatLon_out);
			}//m_convertDMtoDec

			function m_convertDMtoDMS(objLatLon_in){
				var _ss;
				var _ssss;
				var objDMS = null;
				var objLatLon_out = new txtester.gpscoordcalc.LatLon(new txtester.gpscoordcalc.CoordDMS, new txtester.gpscoordcalc.CoordDMS);		
				var objDM = objLatLon_in.lat;

				for(i=0;i<2;i++){
					_ss=objDM.mmm;
					_ss="0."+ _ss.toString();
					_ss=parseFloat(_ss,10)*60;
					m_get_lr(_ss,4,function(result_lr){
						if(!result_lr.error){
							_ss=result_lr.l;
							_ssss=result_lr.r;
						}
					})
					objDMS = new txtester.gpscoordcalc.CoordDMS;
					with (objDMS){
						latlonChar = objDM.latlonChar;
						ddd = objDM.ddd;
						mm = objDM.mm;
						ss = _ss;
						ssss = _ssss;
					}
					if(i==0){
						objLatLon_out.lat = objDMS;
						objDM = null;
						objDM = objLatLon_in.lon;
					}
					else{
						objLatLon_out.lon = objDMS;
					}
					objDMS = null;
				}
				return(objLatLon_out);
			}//m_convertDMtoDMS

			function m_convertDMStoDM(objLatLon_in){

				var _mm, _mmm;
				var objDM = null;
				var objLatLon_out = new txtester.gpscoordcalc.LatLon(new txtester.gpscoordcalc.CoordDM, new txtester.gpscoordcalc.CoordDM);
				var objDMS = objLatLon_in.lat;

				for(var i=0;i<2;i++){
					_mmm=objDMS.ssss;
					_mmm="0."+ _mmm.toString();
					_mmm=parseFloat(_mmm,10);
					_mmm = (objDMS.ss + _mmm)/60;
					m_get_lr(_mmm,3,function(result_lr){
						if(!result_lr.error){
							_mmm=result_lr.r;
						}
					})
					objDM = new txtester.gpscoordcalc.CoordDM;
					with(objDM){
						latlonChar = objDMS.latlonChar;
						ddd = objDMS.ddd;
						mm = objDMS.mm;
						mmm = _mmm;
					}
					if(i==0){
						objLatLon_out.lat = objDM;
						objDMS = null;
						objDMS = objLatLon_in.lon;
					}
					else{
						objLatLon_out.lon = objDM;
					}
					objDM = null;
				}
				return(objLatLon_out);
			}//m_convertDMStoDM

			function m_get_lr(value,digits_r,fc){
//alert("m_get_lr=" + value)
				var _r=parseFloat(value,10);
				var _l=parseInt(_r,10);
				_r=_r-_l;
				_r=_r.toFixed(digits_r);
				_r=_r.toString();
				_r=_r.substr(2,_r.length-2);
//13.7.2010				_r=parseInt(_r,10);
				result_lr.l=_l;
				result_lr.r=_r;	
				fc(result_lr);
			}//m_get_lr

			function m_latlonChar_toDec(char){
				if(char=="S" || char=="W")return("-");
				return("");
			}

			function m_latlonChar_fromDec(char, bolLat){
				if(char=="-"){
					if(bolLat)return("S");
					return("W");
				}
				if(bolLat)return("N");
				return("E");
			}


	}//txtester.gpscoordcalc.calculate

/*
* txtester.gpscoordcalc.getLatLon()
* pokud strText obsahuje souřadnice,
* vrátí funkce objekt třídy LatLon
*/
	txtester.gpscoordcalc.getLatLon = function (strText,fc){

		var result=function(){
			this.error=false;
			this.LatLon=null;
		};

		var arr = m_getArray(strText.toUpperCase());
		var intFormatId = m_getFormatId(arr);

		if((intFormatId==4)||(intFormatId==6)||(intFormatId==8)) result.LatLon = m_validate(arr,intFormatId);
		else result.error=new txtester.Error(34);

		fc(result);

/*
* text rozseka na sekvence a vrati 2rozmerne pole
*/
		function m_getArray(strText){
			var i = 0;
			var intDelka = 0;
			var index = -1;
			var intStart = -1;
			var strT = "";
			var varChar;
			var bolRadaCisel = false;
			var arr = new Array();
			var intL = strText.length;
			for (i=0; i<intL; i++){
				varChar = strText.substr(i,1);
				varChar = parseInt(varChar,10);
				if(isNaN(varChar)){
					//konec ciselne rady, zacatek rady znaku
					if(bolRadaCisel){
						bolRadaCisel = false;
						index++;
						intDelka = i - intStart;
						strT = strText.substr(intStart, intDelka);
						arr[index]= new Array(strT, true);
						intStart = i;
					}
				}
				else{
					//zacatek ciselne rady, konec rady znaku
					if(!bolRadaCisel){
						bolRadaCisel = true;			
						if(intStart==-1) intStart = 0;
						if(i>0){
							index++;
							intDelka = i - intStart;
							strT = strText.substr(intStart, intDelka);
							arr[index]= new Array(strT, false);
						}
						intStart = i;
					}
				}
				//poslední sekvence
				if((i+1)==intL){
					index++;
					intDelka = intL - intStart;
					strT = strText.substr(intStart, intDelka);
					arr[index]= new Array(strT, bolRadaCisel);		
				}
			}//for
			return(arr);
		}//m_getArray	

		function m_getFormatId(arr){
			var i = 0;
			var a = 0;
			var intL = arr.length;
			for(i=0;i<intL;i++) if(arr[i][1]) a++;	//pocet ciselnych sekvenci 
			if((a==4)||(a==6)||(a==8)) return(a);	//format pro Dec, DM, DMS
			return(0);				//neplatny format
		}

		function m_validate(arr, intFormat){
			var strT = "";
			var strLat = "";
			var strLon = "";
			var intLat = 0;
			var intLon = 0;
			var intS = 0;
			var bolStartNum = arr[0][1];
			var intL = arr.length;
			var intStartIndex = intFormat;
			var objLatLon = null;

			//lat vlevo?
			if (!bolStartNum){
				strT = arr[0][0];
				strLat = m_searchLatLon(strT, true);
			}
			else{
				if(intFormat==4) strLat = "N";
				intStartIndex-=1 ;
			}

			if((intFormat==4) && (strLat=="")) return(null);

			//lat uprostred?
			strT = arr[intStartIndex][0];

			if(strLat==""){
				strLat = m_searchLatLon(strT, true);
				if(strLat=="")return(null);

				//lon musi byt vpravo
				intStartIndex += intFormat;
				strT = arr[(arr.length)-1][0];
				strLon = m_searchLatLon(strT, false);
				if(strLon=="")return(null);
			}
			//lon uprostred?
			else{
				strLon = m_searchLatLon(strT, false);
				if(strLon=="")return(null);
			}

			intStartIndex = 0;
			if (!bolStartNum)intStartIndex++;

			switch(intFormat){
				case 4:
					objLatLon = m_getDec(arr,intStartIndex, strLat, strLon);
					break;
				case 6:
					objLatLon = m_getDM(arr,intStartIndex, strLat, strLon);
					break;
				case 8:
					objLatLon = m_getDMS(arr,intStartIndex, strLat, strLon);
					break;
			}

			return(objLatLon);
		}//m_validate

		function m_searchLatLon(strT, bolLat){
			var strL = "";
			var intL = 0;
			if ((strT.search(/N/i))>-1){
				if(!bolLat) return("");
				intL++;
				strL = "N";
			}		
			if ((strT.search(/S/i))>-1){
				if(!bolLat) return("");
				intL++;
				strL = "S";
			}
			if ((strT.search(/E/i))>-1){
				if(bolLat) return("");
				intL++;
				strL = "E";
			}
			if ((strT.search(/W/i))>-1){
				if(bolLat) return("");
				intL++;
				strL = "W";
			}

			if (strT.search(/-/i)>-1){
				if(bolLat)strL = "S";
				else strL = "W";
				intL++;
			}

			if (strT.search(/\x2b/)>-1){
				if(bolLat)strL = "N";
				else strL = "E";
				intL++;
			}

			strT=strT.replace(/\x20/g,"");	//spaces(hex20) to ""
			if(intL==0 && strL=="" && strT==""){
				if(bolLat)strL = "N";
				else strL = "E";
				intL=1;
			}

			if(strT.length==1 && intL==0 && !bolLat){
				strT=strT.toLowerCase();
				if(strT.search(/[a-z]/)==-1){
					strL="E";
					intL=1;
				}
			}

			if(intL!=1) return("");
			return(strL);
		}//m_searchLatLon

		function m_getDec(arr,intStartIndex, strLat, strLon){
			var i = 0;
			var objLatLon = new txtester.gpscoordcalc.LatLon(null,null);
			var objDec = null;
			for(i=0;i<2;i++){
				objDec = new txtester.gpscoordcalc.CoordDec;
				with (objDec){
					ddd = arr[intStartIndex][0];
					intStartIndex+=2;
					dddddd = arr[intStartIndex][0];
					intStartIndex+=2;
					if(i==0){
						latlonChar = strLat;
						objLatLon.lat = objDec;
					}
					else{
						latlonChar = strLon;
						objLatLon.lon = objDec;
					}
					objDec = null;
				}
			}
			return(objLatLon);
		}//m_getDec

		function m_getDM(arr,intStartIndex, strLat, strLon){
			var i = 0;
			var objLatLon = new txtester.gpscoordcalc.LatLon(null,null);
			var objDM = null;

			for(i=0;i<2;i++){
				objDM = new txtester.gpscoordcalc.CoordDM;
				with (objDM){
					ddd = arr[intStartIndex][0];
					intStartIndex+=2;
					mm = arr[intStartIndex][0];
					intStartIndex+=2;
					mmm = arr[intStartIndex][0];
					intStartIndex+=2;
					if(i==0){
						latlonChar = strLat;
						objLatLon.lat = objDM;
					}
					else{
						latlonChar = strLon;
						objLatLon.lon = objDM;
					}
					objDM = null;
				}
			}//for
			return(objLatLon);
		}//m_getDM

		function m_getDMS(arr,intStartIndex, strLat, strLon){
			var i = 0;
			var objLatLon = new txtester.gpscoordcalc.LatLon(null,null);
			var objDMS = null;
			for(i=0;i<2;i++){
				objDMS = new txtester.gpscoordcalc.CoordDMS;
				with (objDMS){
					ddd = arr[intStartIndex][0];
					intStartIndex+=2;
					mm = arr[intStartIndex][0];
					intStartIndex+=2;
					ss = arr[intStartIndex][0];
					intStartIndex+=2;
					ssss = arr[intStartIndex][0];
					intStartIndex+=2;
					if(i==0){
						latlonChar = strLat;
						objLatLon.lat = objDMS;
					}
					else{
						latlonChar = strLon;
						objLatLon.lon = objDMS;
					}
					objDMS = null;
				}//with
			}//for
			return(objLatLon);
		}//m_getDMS

	}//txtester.gpscoordcalc.getLatLon


};//if(!window['txtester']['gpscoordcalc'])

-->