/*==============================================================================
	FILE				:	global.js
	AUTHOR			:	kl (c)2005-
	DESCRIPTION	:	global JS-functions as used throughout the project modules
==============================================================================*/

// browser sniffer
function Is() {
 agent = navigator.userAgent.toLowerCase();
 this.major = parseInt(navigator.appVersion);
 this.minor = parseFloat(navigator.appVersion);
 this.ns = ((agent.indexOf('mozilla') != -1) && ((agent.indexOf('spoofer') == -1) && (agent.indexOf('compatible') == -1)));
 this.ns4b = (this.ns && (this.major == 4) && (this.minor <= 4.03));
 this.ns4 = (this.ns && (this.major == 4) && (this.major < 5));
 this.ns6 = (this.ns && (this.major >= 5));
 this.ie = (agent.indexOf("msie") != -1);
 this.ie4 = (this.ie && (this.major == 4) && (agent.indexOf("msie 5.0") == -1));
 this.ie5 = (this.ie && (this.major == 4) && (agent.indexOf("msie 5.0") != -1));
 this.ie55 = (this.ie && (this.major == 4) && (agent.indexOf("msie 5.5") != -1));
 this.ie6 = (this.ie && (this.major == 4) && (agent.indexOf("msie 6.0") != -1));
 
 this.ierecent = ((this.ie55) || (this.ie6)) ? true : false; 

}

var is = new Is();

if ( is.ns6 || is.ns4 || is.ns4b ) {
 doc = (is.ns6) ? 'document.getElementById("' : 'document["';
 sty = (is.ns6) ? '")' : '"]';
}
else {
 doc = 'document.all["';
 sty = '"].style';
}


var ftbtny;
var WinWidth;
var WinHeight;

//------------------------------------------------------------------------------
// GLOBAL VARS
//------------------------------------------------------------------------------
var gUrl					= null;
var gTimer				= null;

// for form-field evaluation 
var gForm					= null;
var	gSave					= null;
var gCapts				= null;
var gFields				= null;
var gFldIsSelect	= null;

var gStrIsAMust   = 'Dieses Feld darf nicht leer sein.\n';
var gStrErrStart	= 'FEHLER: Folgende Felder weisen falsche bzw. fehlende Angaben auf ...\n\n';
var gStrSubmitConfirm	= 'Das Daten scheinen in Ordnung zu sein. '
                			+ 'Klicken Sie auf <OK>, um die Daten zu speichern '
											+ 'oder auf <ABBRUCH>, um Änderungen vorzunehmen.\n';
var gTestErrors		= '';
var gRegExErrMsg	= '';
var gOut					= '';					
var gTimedCmd			= '';


//------------------------------------------------------------------------------
// Image button related stuff
//------------------------------------------------------------------------------
var btnImgesLo 	= new Array(6);
var btnImgesHi 	= new Array(6);

var cMAX_BTNS		= 4;
var gCurrBtn;

//------------------------------------------------------------------------------
function preloadBtns() {
	var i;
	for ( i = 0; i < cMAX_BTNS; i++ ) {
		btnImgesLo[i] = new Image();
		btnImgesHi[i] = new Image();
		btnImgesLo[i].src = "./img/btn_" + (i+ 1) + "_lo.gif";
		btnImgesHi[i].src = "./img/btn_" + (i+ 1) + "_hi.gif";
	}
}

//------------------------------------------------------------------------------
function setCurrBtn(btnNr) {
	document.images['imgBtn' + btnNr].src = btnImgesHi[(btnNr - 1)].src;
	gCurrBtn = btnNr;
}

//------------------------------------------------------------------------------
function hoverBtn(btnNr,isHoverIn) {
	if ( gCurrBtn != btnNr ) {
		if ( isHoverIn ) {		
			document.images['imgBtn' + btnNr].src = btnImgesHi[(btnNr - 1)].src;
		}
		else {
			document.images['imgBtn' + btnNr].src = btnImgesLo[(btnNr - 1)].src;
		}
	}
}

//------------------------------------------------------------------------------
// hover funcs
//------------------------------------------------------------------------------
function setBg(id, bkgCol) {
	var el = getStyleContainerById(id);
	if ( typeof( el ) != "undefined" ) {
		el.backgroundColor = bkgCol;
	}
}



//------------------------------------------------------------------------------
function SetScrCol(c) {
  var dbs = document.body.style;
  if( (is.ierecent) && (document.all) ) {
    dbs.scrollbarBaseColor      = c;
    dbs.scrollbarArrowColor     = '#ffffff';
    dbs.scrollbarFaceColor      = '#99BBD3';
    dbs.scrollbarShadowColor    = '#739CB9';
    dbs.scrollbar3dLightColor   = '#739CB9';
    dbs.scrollbarDarkShadowColor= '#ffffff';
    dbs.scrollbarTrackColor     = '#BDD6EA';
    dbs.scrollbarHighlightColor = '#BDD6EA';
  }
}


//------------------------------------------------------------------------------
// general layer handling routines
//------------------------------------------------------------------------------
var gFormStyles = null;
function storeFormFieldStyles() {
	var cnt = i = j = k = l = 0;
	var sty = frm = fld = null;
	var s = "";
	
	gFormStyles		 = new Array();
	
	for ( i = 0; i < document.forms.length; i++ ) {
		frm = document.forms[i];											// get the form ...
		for ( j = 0; j < frm.length; j++ ) {
			fld = frm[j];
			sty = getStyleContainerById(fld.id);
			if ( sty != null ) {
				gFormStyles[k] 		= new Array(4);
				gFormStyles[k][0]	= fld.id;
				gFormStyles[k][1]	= getStyleAttribute(sty, "color");
				gFormStyles[k][2]	= getStyleAttribute(sty, "backgroundColor");
				gFormStyles[k][3]	= getStyleAttribute(sty, "borderColor");
				k++;
			}
		}
	}
}
	
function _testStoredVals() {
	var i = j = 0;
	var frm = fld = null;
	var s = "";
	for ( i = 0; i < gFormStyles.length; i++ ) {
		frm = gFormStyles[i];		 
		s += 	"Feld: " + gFormStyles[i][0] + "\n"
				+	" ==> Textfarbe: " + gFormStyles[i][1] + "\n"
				+	" ==> BKG-Farbe: " + gFormStyles[i][2] + "\n"
				+	" ==> Bord.Farb: " + gFormStyles[i][3] + "\n";
	}
	alert( s );
}
//------------------------------------------------------------------------------
function getStyleContainerById(id) {
	var el = ( document.all ) ? document.all[id] : document.getElementById(id);
	return ( (el == null) ? null : el.style );
}
//------------------------------------------------------------------------------
function getStyleAttribute(sty,attr) {	
	var a = ( document.all ) ? sty.getAttribute(attr,"false") : sty[attr];
	return( a ); 
}
//------------------------------------------------------------------------------
function getLayerByName(lyrname) {
	var lyr = eval( doc + lyrname + sty );
	return( lyr );
}
//------------------------------------------------------------------------------
function setFormFieldToErrorStyle( id ) {
	var l = getStyleContainerById(id);
  l.backgroundColor = '#ffffff';
  l.borderColor = '#cc0000';
}
//------------------------------------------------------------------------------
function resetFormFieldStyle( id, mand ) {
	var l = getStyleContainerById(id);
  l.backgroundColor = (mand) ? '#FAECBA' : '#F9FAFD';
  l.borderColor = '#004294';
}

//==============================================================================
// browser-window related
//==============================================================================
function getInnerWidth() {
  return( ( (is.ns4 || is.ns4b || is.ns6) ? innerWidth : document.body.clientWidth ) );
}

function getInnerHeight() {
  return( parseInt( (is.ns4 || is.ns4b || is.ns6) ? innerHeight : document.body.clientHeight ) );
}

//==============================================================================
// various utility funcs
//==============================================================================
function launchPopUp( pg, tit, wd, ht, scroll ) {
	var w = wd;
	var h = ht;
	var l = parseInt( ( screen.width  / 2 ) - ( w / 2 ) );
  var t = parseInt( ( screen.height / 2 ) - ( h / 2 ) );
	var scr = (scroll) ? 'scrollbars=yes' : 'scrollbars=no';
	var props	= "location=no," + scr + ",menubar=no,toolbar=no,resizable=no" 
						+ ",left=" + l + ",top=" + t + ",width=" + w + ",height=" + h;

	var popwin = window.open(pg, tit, props);
}

//==============================================================================
// various launch-wrappers
//==============================================================================
function showHelp(url) {	launchPopUp( url, "Hilfe", 680, 480, true );	}

//-------------------------------------------------------------------
function closeWin() {
	window.close();
}

//-------------------------------------------------------------------
function launchResize( pg, tit, wd, ht, scroll ) {
	var w = wd;
	var h = ht;
	var l = parseInt( ( screen.width  / 2 ) - ( w / 2 ) );
  var t = parseInt( ( screen.height / 2 ) - ( h / 2 ) );
	var scr = (scroll) ? 'scrollbars=yes' : 'scrollbars=no';


	var props	= "location=no," + scr + ",menubar=no,toolbar=no,resizable=yes" 
						+ ",left=" + l + ",top=" + t + ",width=" + w + ",height=" + h;


	var popwin = window.open(pg, tit, props);
}

function launchAnfahrt() {
	alert("Hier kommt der Anfahrtsplan");
}

//==============================================================================
// form control funcs 
//==============================================================================
function setFocusTo(formName,fieldName) {
	var frm = document.forms[formName];
	var fld = null;
	if ( typeof(frm) != "undefined" ) {
		fld = frm[fieldName];
		if ( typeof(fld) != "undefined" ) {
			fld.focus();
		}
	}
}
//------------------------------------------------------------------------------
function checkOnChange(formName,fieldName) {
	// tests if the field-value has been altered and sets a dirty-flag
	
}
//------------------------------------------------------------------------------
function checkNotEmpty(formName,fieldName) {
	var val = _getValFromForm(formName,fieldName);
	return ( val.length != 0 );
}
//------------------------------------------------------------------------------
function checkOnInteger(formName,fieldName) {
	var val = _getValFromForm(formName,fieldName);
	return ( _regexTestNumbers(val) );
}
//------------------------------------------------------------------------------
function checkShortDate(formName,fieldName,isMandatory) {	
	var val = _getValFromForm(formName,fieldName);
	var res = _regexTestDate(val);
	var ln	=	val.length;
	if ( ! isMandatory ) { 
		if ( ln == 0 ) { 
			return;
		}
		else {
			if ( ! res ) {
				restoreVal(formName,fieldName);
				return;
			}
		}
	}
	if ( ! res ) {
		_alertAndRestore("[Datumsfeld ohne Trennzeichen]\n" + ( ((ln==0)&&(isMandatory)) ? gStrIsAMust : "") + gRegExErrMsg,formName,fieldName);
	}
	return ( res );
}
// wrappers --------------------------------------------------------------------
function checkShortDateOptional(formName,fieldName) {
	return ( checkShortDate(formName,fieldName,false) );
}
//------------------------------------------------------------------------------
function checkShortDateMandatory(formName,fieldName) {
	return ( checkShortDate(formName,fieldName,true) );
}
//------------------------------------------------------------------------------
function checkDateFormattet(formName,fieldName) {
	var val = _getValFromForm(formName,fieldName);
	var res = _regexTestDateFormatted(val); 
	if ( ! res ) {
		_alertAndRestore("[Datumsfeld mit Trennzeichen]\n" + gRegExErrMsg,formName,fieldName);
	}
	return ( res );
}
//------------------------------------------------------------------------------
function _alertAndRestore(msg,formName,fieldName) {
	alert(msg);
	restoreVal(formName,fieldName);
}

//------------------------------------------------------------------------------
// BOOKMARK : ERR-MSG CONSTANTS AND FUNCS
//------------------------------------------------------------------------------
var cALERT_BLINK_TIME	= 2000;

var cMSG_NORMAL	=	0;
var cMSG_ALERT	=	1;
var cMSG_WARNING=	2;
var cMSG_INFO		=	3;

var cMSG_COLORS	= new Array(
										new Array( "#455c81", "#cfdae7" ),	// NORMAL STYLE
										new Array( "#ffff00", "#cc0000" ),	// ALERT 		(yellow on red)
										new Array( "#ffffff", "#c792b5" ),	// WARNING	(white on violet)
										new Array( "#ffffff", "#427746" )		// WARNING	(white on green)
									);
var cMSG_COLOR_TEXT	=	0;
var cMSG_COLOR_BKG	=	1;
//------------------------------------------------------------------------------
function __msgTxtColor( whatStyle ) { return( cMSG_COLORS[whatStyle][cMSG_COLOR_TEXT] ); }
function __msgBkgColor(	whatStyle ) { return( cMSG_COLORS[whatStyle][cMSG_COLOR_BKG] 	); }
//------------------------------------------------------------------------------
function _statusMsg(msg) 	{	__usrMessage(msg, cMSG_NORMAL	);		}
function _errorMsg(msg) 	{	__usrMessage(msg, cMSG_ALERT	);		}
function _warningMsg(msg) {	__usrMessage(msg, cMSG_WARNING);		}
function _infoMsg(msg) 		{	__usrMessage(msg, cMSG_INFO		);		}
//------------------------------------------------------------------------------
function __usrMessage(msg, whatStyle) {
	var fld = _getHelpField();
	if ( fld != false ) {		
		fld.value = msg;			// display message and make an appropriate blink
		switch ( whatStyle ) {
			//------------------------------------------------------------------------
			case cMSG_ALERT:		
				__startBlink(__msgTxtColor(cMSG_ALERT), __msgBkgColor(cMSG_ALERT));
				break;
			//------------------------------------------------------------------------
			case cMSG_WARNING:
				__startBlink(__msgTxtColor(cMSG_WARNING), __msgBkgColor(cMSG_WARNING));
				break;
			//------------------------------------------------------------------------
			case cMSG_INFO:
				__startBlink(__msgTxtColor(cMSG_INFO), __msgBkgColor(cMSG_INFO));
				break;
		}				
	}	
}
//------------------------------------------------------------------------------
function __startBlink(textCol,bkgCol) {
	__setMsgFieldStye(textCol, bkgCol );
	setTimeout("resetFormFieldStyle()", cALERT_BLINK_TIME );	
}
//------------------------------------------------------------------------------
function __setMsgFieldStye( textCol, bkgCol ) {
	var l 	= getLayerByName("_StatusMsg");
  l.color = textCol;
  l.backgroundColor = bkgCol;
}
//------------------------------------------------------------------------------
function resetFormFieldStyle( id ) {
	__setMsgFieldStye( cMSG_COLORS[cMSG_NORMAL][cMSG_COLOR_TEXT], cMSG_COLORS[cMSG_NORMAL][cMSG_COLOR_BKG] )
}

//------------------------------------------------------------------------------
function _getValFromForm(formName,fieldName) {
	var frm = document.forms[formName]; 
	return ( "" + trim(frm[fieldName].value) ); 
}
function _setValToForm(formName,fieldName,val) {
	var frm = document.forms[formName]; 
	frm[fieldName].value = val;	 
}
//------------------------------------------------------------------------------
function _getHelpField() {
	var frm = document["_StatusMsgForm"];
	if ( typeof(frm) == "undefined" ) {
		return( false );
	}
	var fld = frm["_StatusMsg"];

	if ( typeof(fld) != "undefined" ) {
		return( fld );
	}
	else {
		return( false );
	}
}
//------------------------------------------------------------------------------
function showAlertBox(showIt,msg) {
	if ( ! showIt ) {
		return;
	}
	alert( msg );
}

//------------------------------------------------------------------------------
// BOOKMARK : DATE RELATED
//------------------------------------------------------------------------------
function isDateGood(val, isShort) {
	var	monStart, dayStart;
	if ( isShort ) {											// val = "20050131"
		monStart = 4;
		dayStart = 6;
	}
	else {																// val = "2005-01-31"
		monStart = 5;
		dayStart = 8;
	}
	
	var year= parseInt(val.substring(0,4),10);
	var	mon	= parseInt(val.substring(monStart,dayStart),10);
	var	day	= parseInt(val.substring(dayStart),10);
	return( isMonthValid(mon) && isDayValid(year,mon,day) );
}
//------------------------------------------------------------------------------
function isMonthValid(mon) {
	return( isValWithinBounds(mon,1,12) ); 
}
//------------------------------------------------------------------------------
function isDayValid(year,mon,day) {
	var days = new Array( 0,31,28,31,30,31,30,31,31,30,31,30,31 );
	var	m = parseInt(mon);
	var dayMax = (m != 2) ? days[m] : days[2] + ( (isLeapYear(year)) ? 1 : 0);
	return( isValWithinBounds(day,1,dayMax) );
}
//------------------------------------------------------------------------------
function isLeapYear(year) {
	return (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
}
//------------------------------------------------------------------------------
function _checkDate(val) {
	return( _doDateTest(false,val) );	
}
//------------------------------------------------------------------------------
function _checkDateFormatted(val) {
	return( _doDateTest(true,val) );
}
//------------------------------------------------------------------------------
function _doDateTest(isFormatted,val) {	
	val = '' + val;		// force to string

	var m = d = 0;
	var monStart = (isFormatted) ? 5 : 4;
	var dayStart = monStart + 2;
	var res = (isFormatted) ? _regexTestDateFormatted(val) : _regexTestDate(val);	
	if ( res ) {
		m = val.substring(monStart,dayStart);
		d = val.substring(dayStart);
		return ( isValWithinBounds(m,1,12) && isValWithinBounds(d,1,31) );
	}
	return( res );
}

//------------------------------------------------------------------------------
function isValWithinBounds(val,min,max) {
	return ( (val >= min) && (val <= max) );
}
//------------------------------------------------------------------------------
// BOOKMARK : REGEX FUNCS FOR VARIOUS TYPES
//------------------------------------------------------------------------------
function _regexTestEMail(s){
	gRegExErrMsg = "";
	var regex = /^([_a-zA-Z0-9-]+)(\.[_a-zA-Z0-9-]+)*@([a-zA-Z0-9-]+\.)+([a-zA-Z]{2,3})$/;
	return( _setRegexMsg("Die angegebene eMail-Adresse hat kein gültiges Format (Bsp: 'name.nachname@mailserver.com').",regex.test(s)) );
}
//------------------------------------------------------------------------------
function _regexTestNumbers(s) {
	gRegExErrMsg = "";
	var regex = /^([0-9]+)$/;
	return( _setRegexMsg("nur Zahlen ohne Leerzeichenformattierung; Bsp.: 1234567890",regex.test(s)) );
}
//------------------------------------------------------------------------------
function _regexTestFloat(s) {
	gRegExErrMsg = "";
	var regex = /^([0-9\,]+)$/;
	return( _setRegexMsg("nur Zahlen und Kommazeichen ohne Leerzeichenformattierung; Bsp.: 123,45",regex.test(s)) );
}
//------------------------------------------------------------------------------
function _regexTestTelNumber(s) {
	gRegExErrMsg = "";
	var regex = /^([0-9 +-\/]+)$/;
	return( _setRegexMsg("nur Zahlen und telefon-typische Zeichen; Bsp.: 0..9,+,-,/",regex.test(s)) );
}
//------------------------------------------------------------------------------
function _regexTestAlfa(s) {
	gRegExErrMsg = "";
	var regex = /^([a-zA-Z])+$/;
	return( _setRegexMsg("nur Buchstaben ohne Umlaute; Bsp.: a..z, A..Z",regex.test(s)) );
}
//------------------------------------------------------------------------------
function _regexTestAlfaNum(s) {
	gRegExErrMsg = "";
	var regex = /^([a-zA-Z0-9])+$/;
	return( _setRegexMsg("nur Zahlen und Buchstaben ohne Umlaute, Leer- bzw. Sonderzeichen; Bsp. 0..9,a/A..z/Z",regex.test(s)) );
}
//------------------------------------------------------------------------------
function _regexTestAlfaUmlaut(s) {
	gRegExErrMsg = "";
	var regex = /^([a-zA-ZäÄöÖüÜß])+$/;
	return( _setRegexMsg("nur Buchstaben inkl. Umlaute; Bsp.: a/A..z/Z,äöüß/ÄÖÜ",regex.test(s)) );
}
//------------------------------------------------------------------------------
function _regexTestAlfaNumUmlaut(s) {
	gRegExErrMsg = "";
	var regex = /^([a-zA-Z0-9äÄöÖüÜß])+$/;
	return( _setRegexMsg("nur Zahlen und Buchstaben inkl. Umlaute; Bsp.: 0..9,a/A..z/Z,äöüß/ÄÖÜ",regex.test(s)) );
}
//------------------------------------------------------------------------------
function _regexTestDate(s) {
	gRegExErrMsg = "";
	var regex = /^([0-9]{8})+$/;
	return( _setRegexMsg("nur Zahlen (Bsp: '20050131').",regex.test(s)) );
}
//------------------------------------------------------------------------------
function _regexTestDateFormatted(s) {
	gRegExErrMsg = "";
	var regex = /^([0-9]{4})+([-]{1})+([0-9]{2})+([-]{1})+([0-9]{2})+$/;
	return( _setRegexMsg("nur Zahlen und Bindestriche (Bsp: '2005-01-31').",regex.test(s)) );
}
//------------------------------------------------------------------------------
function _setRegexMsg(msg,res) {
	if ( ! res ) {
		gRegExErrMsg = msg + "\n\n";
	}
	return( res );
}

//------------------------------------------------------------------------------
function getFormVal( frm, field, iscombo ) {
  var f, s;
  f = f = frm[field];
  if( iscombo ) {
    s = trim( f.options[f.selectedIndex].text );
	}
  else {
    s = trim( f.value );
	}
  return s;
}

// submit function used in combination with a setTimeout-command ---------------
function submitForm() {
	gForm.submit();
}

//------------------------------------------------------------------------------
function saveVal(formName,fieldName) {
	var frm = document.forms[formName];	
	gSave = frm[fieldName].value;
}
//------------------------------------------------------------------------------
function restoreVal(formName,fieldName) {
	var frm = document.forms[formName];
	frm[fieldName].value = gSave;
}

//------------------------------------------------------------------------------
/** doFormTest
*   performs a form-test via global parameter arrays 
* 	that have been set up previously from the check-preparing routines
* 	in the various JS-files (e.g. "tboxfuncs.js)
* @param  frm, DOM type, a form
* @return boolean, test result
*///----------------------------------------------------------------------------
function doFormTest( frm ) {
	isOk = true;
	gOut = '';
	for ( var i = 0; i < gFields.length; i++ ) {
		s = trim( getFormVal(frm, gFields[i], false) );
		if ( s.length == 0 ) {
			gOut = gOut + gCapts[i] + ':\t' + gStrIsAMust;
			isOk = false;
		}
	}
	///////////////
	return( isOk );
	///////////////
}

