// JavaScript Document


//var gLang = getLanguageCookie();
var gLoginTimer;


function isValidEmail(email, required) {
    if (required==undefined) {   // if not specified, assume it's required
        required=true;
    }
    if (email==null) {
        if (required) {
            return false;
        }
        return true;
    }
    if (email.length==0) {  
        if (required) {
            return false;
        }
        return true;
    }
    if (! allValidChars(email)) {  // check to make sure all characters are valid
        return false;
    }
    if (email.indexOf("@") < 1) { //  must contain @, and it must not be the first character
        return false;
    } else if (email.lastIndexOf(".") <= email.indexOf("@")) {  // last dot must be after the @
        return false;
    } else if (email.indexOf("@") == email.length) {  // @ must not be the last character
        return false;
    } else if (email.indexOf("..") >=0) { // two periods in a row is not valid
	return false;
    } else if (email.indexOf(".") == email.length) {  // . must not be the last character
	return false;
    }
    return true;
}

function allValidChars(email) {
  var parsed = true;
  var validchars = "abcdefghijklmnopqrstuvwxyz0123456789@.-_";
  for (var i=0; i < email.length; i++) {
    var letter = email.charAt(i).toLowerCase();
    if (validchars.indexOf(letter) != -1)
      continue;
    parsed = false;
    break;
  }
  return parsed;
}



function isValidURL(url)
{ 
    var RegExp = /^(([\w]+:)?\/\/)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,4}(:[\d]+)?(\/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?$/; 
    if(RegExp.test(url))
        return true; 
	else
        return false; 
}


function isValidPLZOrt(str)
{
	if (str.length == 0)
		return true;
		
	var plz = parseInt(str.substr(0,4),10);
	var ort = str.substring(5,str.length);
	if (plz >= 1000 && plz <= 9999 && ort.length >= 2)
		return true;
	else
		return false;
}


function isValidJahrgang(str)
{
	if (str.length == 0)
		return true;
		
	var jg = parseInt(str.substr(0,4),10);
	if (jg >= 1900 && jg <= 2008)
		return true;
	else
		return false;
}



function checkDate(objName) 
{
	
//var strDatestyle = "US"; //United States date style
	var strDatestyle = "EU";  //European date style
	var strDate;
	var strDateArray;
	var strDay;
	var strMonth;
	var strYear;
	var intday;
	var intMonth;
	var intYear;
	var booFound = false;
	var datefield = objName;
	var strSeparatorArray = new Array("-"," ","/",".");
	var intElementNr;
	var err = 0;
	var strMonthArray = new Array(12);
	strMonthArray[0] = "Jan";
	strMonthArray[1] = "Feb";
	strMonthArray[2] = "Mar";
	strMonthArray[3] = "Apr";
	strMonthArray[4] = "May";
	strMonthArray[5] = "Jun";
	strMonthArray[6] = "Jul";
	strMonthArray[7] = "Aug";
	strMonthArray[8] = "Sep";
	strMonthArray[9] = "Oct";
	strMonthArray[10] = "Nov";
	strMonthArray[11] = "Dec";
	strDate = datefield.value;
	if (strDate.length < 1) {
		return true;
	}
	for (intElementNr = 0; intElementNr < strSeparatorArray.length; intElementNr++) {
		if (strDate.indexOf(strSeparatorArray[intElementNr]) != -1) {
			strDateArray = strDate.split(strSeparatorArray[intElementNr]);
			if (strDateArray.length != 3) {
				err = 1;
				return false;
			}
			else {
				strDay = strDateArray[0];
				strMonth = strDateArray[1];
				strYear = strDateArray[2];
			}
			booFound = true;
		}
	}
	if (booFound == false) {
		if (strDate.length>5) {
			strDay = strDate.substr(0, 2);
			strMonth = strDate.substr(2, 2);
			strYear = strDate.substr(4);
   		}
	}
	if (strYear.length == 2) {
		strYear = '20' + strYear;
	}
	// US style
	if (strDatestyle == "US") {
		strTemp = strDay;
		strDay = strMonth;
		strMonth = strTemp;
	}
	intday = parseInt(strDay, 10);
	if (isNaN(intday)) {
		err = 2;
		return false;
	}
	intMonth = parseInt(strMonth, 10);
	if (isNaN(intMonth)) {
		for (i = 0;i<12;i++) {
			if (strMonth.toUpperCase() == strMonthArray[i].toUpperCase()) {
				intMonth = i+1;
				strMonth = strMonthArray[i];
				i = 12;
   			}
		}
		if (isNaN(intMonth)) {
			err = 3;
			return false;
		}
	}
	intYear = parseInt(strYear, 10);
	if (isNaN(intYear)) {
		err = 4;
		return false;
	}
	if (intMonth>12 || intMonth<1) {
		err = 5;
		return false;
	}
	if ((intMonth == 1 || intMonth == 3 || intMonth == 5 || intMonth == 7 || intMonth == 8 || intMonth == 10 || intMonth == 12) && (intday > 31 || intday < 1)) {
		err = 6;
		return false;
	}
	if ((intMonth == 4 || intMonth == 6 || intMonth == 9 || intMonth == 11) && (intday > 30 || intday < 1)) {
		err = 7;
		return false;
	}
	if (intMonth == 2) {
		if (intday < 1) {
			err = 8;
			return false;
		}
		if (LeapYear(intYear) == true) {
			if (intday > 29) {
				err = 9;
				return false;
			}
		}
		else {
			if (intday > 28) {
				err = 10;
				return false;
			}
		}
	}
	if (strDatestyle == "US") {
		datefield.value = strMonthArray[intMonth-1] + " " + intday +" " + strYear;
	}
	else {
		datefield.value = strYear + "-" + ((intMonth < 10) ? "0" + intMonth : intMonth) + "-" + ((intday < 10) ? "0" + intday : intday);
	}
	return true;
}


function LeapYear(intYear)
{
	if (intYear % 100 == 0) {
		if (intYear % 400 == 0) { return true; }
	}
	else {
		if ((intYear % 4) == 0) { return true; }
	}
	return false;
}



function checkDateForFuture(str)
{
	var thedate = new Date(parseInt(str.substr(0,4),10),parseInt(str.substr(5,2),10) - 1,parseInt(str.substr(8,2),10),0,0,0);	// YYYY-MM-DD
	var today = new Date();
	
	if ((thedate.getTime() <= today.getTime()) && thedate.getMonth() <= 11)		// no entries after October 11 should be 9
		return true;
	else
		return false;
}



function checkDateForPast(str)
{
	var thedate = new Date(parseInt(str.substr(0,4),10),parseInt(str.substr(5,2),10) - 1,parseInt(str.substr(8,2),10),0,0,0);	// YYYY-MM-DD
	var today = new Date();
	
	var twentyDays = 1000 * 3600 * 24 * 21;		// 21
	
	if (thedate.getTime() >= (today.getTime() - twentyDays))
		return true;
	else
		return false;
}



function dateOlderThanFreezeTime(str)
{
	var thedate = new Date();
	var month = convertMonthNameToNum(str.substr(4,3));				// Fri Feb 15 11:53:44 2008
	var thedate = new Date(parseInt(str.substr(20,4),10),month,parseInt(str.substr(8,2),10),parseInt(str.substr(11,2),10),parseInt(str.substr(14,2),10),0);	
	var now = new Date(); 
	var gmtCor = now.getTimezoneOffset() * 60 * 1000;
	now.setTime(now.getTime() + gmtCor);
	
	var freezeTime = 1000 * kAddTrackFreezeTime;
	if (thedate.getTime() <= (now.getTime() - freezeTime))
		return false;
	else
		return true;
}


function checkDateContestRange(str)
{
//	var thedate = new Date(parseInt(str.substr(0,4),10),parseInt(str.substr(5,2),10) - 1,parseInt(str.substr(8,2),10),0,0,0);	// YYYY-MM-DD
	var thedate = new Date(parseInt(str.substr(6,4),10),parseInt(str.substr(3,2),10) - 1,parseInt(str.substr(0,2),10),0,0,0);	// DD.MM.YYYY
	if ((thedate.getMonth() >= 1  && thedate.getMonth() <= 9))
		return true;
	else
		return false;
}



function convertDBDateToShortDateTime(str)
{
	if (str.length < 3)
		return "";
	var thedate = new Date();
	var month = convertMonthNameToNum(str.substr(4,3));				// Fri Feb 15 11:53:44 2008
	var thedate = new Date(parseInt(str.substr(20,4),10),month,parseInt(str.substr(8,2),10),parseInt(str.substr(11,2),10),parseInt(str.substr(14,2),10),0);	
	var now = new Date();	
	var day = "";
//	if ((now.getTime() - thedate.getTime()) > (60 * 1000 * 60 * 20))
		day = thedate.getDate()+"."+(parseInt(thedate.getMonth(),10)+1)+". ";

	var gmtCor = Math.abs(now.getTimezoneOffset() * 60 * 1000);
	now.setTime(thedate.getTime() + gmtCor);

	var hrs = now.getHours();
	var mins = now.getMinutes();
	return day + ((hrs < 10) ? "0" + hrs : hrs) + ":" + ((mins < 10) ? "0" + mins : mins);
}


function convertDBDateToShortDate(str)
{
	if (str.length < 3)
		return "";
	var thedate = new Date();
	var month = convertMonthNameToNum(str.substr(4,3));				// Fri Feb 15 11:53:44 2008
	var thedate = new Date(parseInt(str.substr(20,4),10),month,parseInt(str.substr(8,2),10),parseInt(str.substr(11,2),10),parseInt(str.substr(14,2),10),0);	
	var now = new Date();	
	var day = "";
//	if ((now.getTime() - thedate.getTime()) > (60 * 1000 * 60 * 20))
		day = thedate.getDate()+"."+(parseInt(thedate.getMonth(),10)+1)+". ";

	var gmtCor = Math.abs(now.getTimezoneOffset() * 60 * 1000);
	now.setTime(thedate.getTime() + gmtCor);

	return day;
}


function convertMinutestoHHMM(minutes)
{
	if (minutes <= 0)
		return "00:00";
		
	var hrs = Math.floor(minutes / 60);
	var mins = minutes - (hrs * 60);
	
	return ((hrs < 10) ? "0" + hrs : hrs) + ":" + ((mins < 10) ? "0" + mins : mins);
}



function formatDateFromDB(dd) // from yyyy-mm-dd to dd.mm.yyyy
{
	return dd.substr(8,2) + "." + dd.substr(5,2) + "." + dd.substr(0,4);
}


function convertMonthNameToNum(mon)
{
	switch (mon) {
		case "Jan":		return 0;
		case "Feb":		return 1;
		case "Mar":		return 2;
		case "Apr":		return 3;
		case "May":		return 4;
		case "Jun":		return 5;
		case "Jul":		return 6;
		case "Aug":		return 7;
		case "Sep":		return 8;
		case "Oct":		return 9;
		case "Nov":		return 10;
		case "Dec":		return 11;
	}
}


function displayDateObj(obj)
{
	var dateStr = obj.getDate() + "." + (obj.getMonth() + 1) + "." + obj.getFullYear();
	
	var hrs = obj.getHours();
	var mins = obj.getMinutes();
	var timeStr = ((hrs < 10) ? "0" + hrs : hrs) + ":" + ((mins < 10) ? "0" + mins : mins);
	
	return dateStr + " " + timeStr;
}



function truncateStr(str,num)
{
	
	if (str.length > num) {
		if (str.length <= (num + 2))
			return str;
		else
			return str.substr(0,num) + "...";		// 19
	}
	else
		return str;
}



function limitText(limitField,limitNum) {
	if (limitField.value.length > limitNum) {
		limitField.value = limitField.value.substring(0, limitNum);
	}
}



function getLocStr(key)
{
	try {
		switch (gLang) {
			case "de": var ret = localizedStringsDe[key];	break;
			case "fr": var ret = localizedStringsFr[key];	break;
			case "en": var ret = localizedStringsEn[key];	break;
			case "it": var ret = localizedStringsIt[key];	break;
			default:	var ret = null;
		}
		if (ret == undefined)
			ret = key;
		return ret;
	} catch (ex) {}

	return key;
}

/*
var localizedStrings = new Array;

localizedStrings['Station:'] = 'Station/Name:';
*/



function xor_str(encStr,key)
{
	var res = "";
	for(i=0;i<encStr.length;++i) {
		res += String.fromCharCode(key^encStr.charCodeAt(i));
	}
	return encodeURIComponent(res);
}



function decrypt_str(decStr,key)
{
	var res = "";
	var str = decodeURIComponent(decStr);

	for(i=0;i<str.length;i++)
	{
		res += String.fromCharCode(key^str.charCodeAt(i));
	}
	return res;
}


function roundNumber(num,dig)
{
	var n = Math.pow(10,dig);
	var m = Math.round(num * n) / n;
	return m;
}


function wgsLatToSwiss(lng,lat)
{
	
	var ea = (lat - 7.43863) / 57.2957795;
	var na = (lng - 46.95108) / 57.2957795;
	
	return roundNumber(600.000 + 1841.627 * ea + 2520.1147 * Math.sin(ea) - 4654.4 * ea * na,3);
}


function wgsLngToSwiss(lng,lat)
{
	var ea = (lat - 7.43863) / 57.2957795;
	var na = (lng - 46.95108) / 57.2957795;
	
	
	
	return roundNumber(200.000 + 6369.76 * Math.sin(na) + 1591.87 * ea * ea * (1-na / 0.91) + 23.9 * na * na,3);
	
}


function swissToWgsLat(x,y)
{
	var xb = (x / 1000) - 600.000;
	var yb = (y / 1000) - 200.000;
	
	
	return 46.95108 + yb / 111.18143955 - xb * xb / 1332636;
}


function swissToWgsLng(x,y)
{
	var xb = (x / 1000) - 600.000;
	var yb = (y / 1000) - 200.000;
	
	return 7.43863 + 57.29577951 * Math.atan(xb / 4360.68 + xb * yb / 26378264);
}


// -----------------------------------------------------------
// Timer
// -----------------------------------------------------------

function setLogoutTimer()
{
	gLoginTimer = window.setInterval("doLogout(\"" + getLocStr('Msg-Login-Timeout') + "\")",1000 * kLoginTimeSec);
}


function resetTimer()
{
	if (gLoginTimer) {
		clearTimer();
		setLogoutTimer();
	}
}


function clearTimer()
{
	if (gLoginTimer) {
		window.clearInterval(gLoginTimer);
		gLoginTimer = null;
	}
}




// -----------------------------------------------------------
// XML Helper
// -----------------------------------------------------------

// retrieve text of an XML document element, including
// elements using namespaces
function getElementTextNS(prefix, local, parentElem, index) {
    var result = "";
    if (prefix && isIE) {
        // IE/Windows way of handling namespaces
        result = parentElem.getElementsByTagName(prefix + ":" + local)[index];
    } else {
        result = parentElem.getElementsByTagName(local)[index];
    }
    if (result) {
        // get text, accounting for possible
        // whitespace (carriage return) text nodes 
        if (result.childNodes.length > 1) {
            return result.childNodes[1].nodeValue;
        } else {
			if (result.firstChild == null)
				return "";
            return result.firstChild.nodeValue;    		
        }
    } else {
        return "n/a";
    }
}

function getLocStr(key)
{
	try {
		switch (gLang) {
			case "de": var ret = localizedStringsDe[key];	break;
			case "fr": var ret = localizedStringsFr[key];	break;
			case "en": var ret = localizedStringsEn[key];	break;
			case "it": var ret = localizedStringsIt[key];	break;
			default:	var ret = null;
		}
		if (ret == undefined)
			ret = key;
		return ret;
	} catch (ex) {}

	return key;
}


// -----------------------------------------------------------
// Utilities
// -----------------------------------------------------------


function loadingMessage() 
{
	return "<span class='messageYellow'>"+getLocStr('Loading data...')+"</span>";
}


function getWindowWidth() 
{
	if (window.self && self.innerWidth) {
		return self.innerWidth;
	}
	if (document.documentElement && document.documentElement.clientWidth) {
		return document.documentElement.clientWidth;
	}
	return 0;
}



function openSimpleWin(filename,width,height)
{	
	var winLeft = (getWindowWidth() / 2) - (width / 2);
	
	simpleWindow = window.open(filename,"","width=" + width + ",height=" + height + ",left=" + winLeft + ",top=70,scrollbars=yes");
	simpleWindow.focus();
}



// -----------------------------------------------------------
// Profile Picture
// -----------------------------------------------------------



function profilePictureBoxString(picture,nickname,fullname,gender,desc,interest)
{
	var str = "";
	
	if (picture.length <= 1)
		switch (gender) {
			case 1: str = "<img src='img/icon/profile32Female.png' onmouseover='showProfileDetailBox(event,\""+nickname+" "+fullname+"\",\"img/icon/profile120Female.jpg\",\""+desc+"\",\""+interest+"\");' onmouseout='hideProfileDetailBox();' />"; 	break;
			case 2: str = "<img src='img/icon/profile32Male.png' onmouseover='showProfileDetailBox(event,\""+nickname+" "+fullname+"\",\"img/icon/profile120Male.jpg\",\""+desc+"\",\""+interest+"\");' onmouseout='hideProfileDetailBox();' />"; 	break;
			default: str = "<img src='img/icon/profile32Undefined.png' onmouseover='showProfileDetailBox(event,\""+nickname+" "+fullname+"\",\"img/icon/profile120Undefined.jpg\",\""+desc+"\",\""+interest+"\");' onmouseout='hideProfileDetailBox();' />";
		}
		else
			str = "<img src='usr-img/profile/sml_"+picture+".png' onmouseover='showProfileDetailBox(event,\""+nickname+"\",\"usr-img/profile/std_"+picture+".jpg\",\""+desc+"\",\""+interest+"\");' onmouseout='hideProfileDetailBox();' />";

	return str;
}


function showProfileDetailBox(evnt,nickname,picture,text,interest)
{
	var posx = 0;
	var posy = 0;

	if (!evnt) 
		var evnt = window.event;
	if (evnt.pageX || evnt.pageY) 	{
		posx = evnt.pageX;
		posy = evnt.pageY;
	}
	else if (evnt.clientX || evnt.clientY) 	{
		posx = evnt.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
		posy = evnt.clientY + document.body.scrollTop + document.documentElement.scrollTop;
	}

	document.getElementById("detailUserBox").style.top = (posy - 210) + "px";
	document.getElementById("detailUserBox").style.left = (posx + 10) + "px";
//	document.getElementById("detailUserBox").style.visibility = "visible";
	document.getElementById("detailUserBox").style.display = "block";
	
	var txt = "";	
	txt += "<table width='100%' border='0'>";
	txt += "<tr><td colspan='2' class='boxTitleWhite'>" + nickname + "</td></tr>";
	txt += "<tr><td width='125'><img src='"+ picture+"' /></td><td class='boxText' align='left' valign='top'>"+getLocStr('Ueber mich')+": ";
	if (text.length > 0)
		txt += decodeURIComponent(text);
	else
		txt += "-";
		
	if (!isNaN(interest))
		txt += "<br><br>"+getLocStr('Hauptinteresse')+": "+getWalkTypeDesc(parseInt(interest,10));
	txt += "</td></tr></table>";
	
	document.getElementById("detailUserContent").innerHTML = txt;
}


function hideProfileDetailBox()
{
	document.getElementById("detailUserBox").style.display = "none";	
}


