//------------------------Extend Array functions---------------------------------------
Array.prototype.addItem=function(item){this[this.length] = item}
Array.prototype.addAll=function(items){for(var i=0;i<items.length;i++)this[this.length] = items[i];}
Array.prototype.getById = function(id){for(var i=0;i<this.length;i++)if(this[i].id == id || this[i]==id)return this[i];return null;}
Array.prototype.contains = function(item){
	for(var i=0;i<this.length;i++){
		if((item.objectId && item.object &&  this[i].id == item.objectId && this[i].type == item.object) ||	item == this[i] || (item.value && this[i].value && item.value == this[i].value)){
			return true;
		}
	}
	return false;
}	
Array.prototype.getValues = function(){var result = new Array();
	for(var i=0;i<this.length;i++){
		var v = this[i].value;
		if(v){
			result.addItem(v);
		}else{
			result.addItem(this[i]);
		}
	 }
	 return result;
}

Date.prototype.add = function(sInterval, iNum) {
    var dTemp = this;
    if (!sInterval || iNum == 0) return dTemp;
    switch (sInterval.toLowerCase()) {
        case "ms":
            dTemp.setMilliseconds(dTemp.getMilliseconds() + iNum);
            break;
        case "s":
            dTemp.setSeconds(dTemp.getSeconds() + iNum);
            break;
        case "mi":
            dTemp.setMinutes(dTemp.getMinutes() + iNum);
            break;
        case "h":
            dTemp.setHours(dTemp.getHours() + iNum);
            break;
        case "d":
            dTemp.setDate(dTemp.getDate() + iNum);
            break;
        case "mo":
            dTemp.setMonth(dTemp.getMonth() + iNum);
            break;
        case "y":
            dTemp.setFullYear(dTemp.getFullYear() + iNum);
            break;
    }
    return dTemp;
}

Date.prototype.toShortFormat = function() {
    var d = (this.getDate() < 10) ? "0" + this.getDate() : this.getDate();
    var m = (this.getMonth() < 10) ? "0" + (this.getMonth() + 1) : (this.getMonth() + 1);
    var y = this.getFullYear();

    return d + "." + m + "." + y;
}


function parseJSON(json) {
    try {
        if (/^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/.test(json)) {
            var j = eval('(' + json + ')');
            return j;
        }
    } catch (e) {
    }
    throw new SyntaxError("parseJSON");
}

//------------------------Browser & Useragent  -----------------------------------------------------

var Browser = {
	FIREFOX:(navigator.userAgent.indexOf("Firefox")!=-1)? true:false,
	FIREFOX2:(navigator.userAgent.indexOf("Firefox/2.0")!=-1)? true:false,
	NETSCAPE:(navigator.userAgent.indexOf("Gecko")!=-1)?true:false,
	NS4:(document.layers)?true:false,
	NS6:(this.NETSCAPE && navigator.userAgent.indexOf("6.")!=-1 && !this.FIREFOX)?true:false,
	NS61:(parseInt(navigator.productSub)>=20010726)?true:false,
	NS7:(this.NETSCAPE && navigator.userAgent.indexOf("7.")!=-1 && !this.FIREFOX)?true:false,
	NS8:(this.NETSCAPE && navigator.userAgent.indexOf("8.")!=-1 && !this.FIREFOX)?true:false,
	MAC:(navigator.appVersion.indexOf("Mac")!=-1)?true:false,
	MAC45:(navigator.appVersion.indexOf("MSIE 4.5")!=-1)?true:false,
	OPERA:(navigator.userAgent.indexOf("Opera")!=-1)?true:false,
	OPERA8:(navigator.userAgent.indexOf("Opera\/8")!=-1)?true:false,
	OPERA9:(navigator.userAgent.indexOf("Opera\/9")!=-1)?true:false,
	IE:(navigator.userAgent.indexOf("MSIE")!=-1)? true:false,
	IE4:(!document.getElementById && document.all)?true:false,
	IE5:(navigator.userAgent.indexOf("MSIE 5.")!=-1)? true:false,
	IE6:(navigator.userAgent.indexOf("MSIE 6.")!=-1)? true:false,
	IE7:(navigator.userAgent.indexOf("MSIE 7.")!=-1)? true:false,
	KONQ:(navigator.userAgent.indexOf("Konqueror")!=-1)?true:false,
	SAFARI:(navigator.userAgent.indexOf("Safari")!=-1)? true:false,
	
	getUserAgent:function(){return(navigator.userAgent) ? navigator.userAgent : navigator.appVersion },
 	getDocumentHeight:function(){return (this.NS6)? parseInt(document.height):parseInt(document.documentElement.scrollHeight);},
 	getDocumentWidth:function(){return (this.NS6)? parseInt(document.width):parseInt(document.documentElement.scrollWidth);},
	getWindowHeight:function(){return (this.NETSCAPE)? parseInt(window.innerHeight) : parseInt(document.documentElement.clientHeight);},
	getWindowWidth:function(){return(this.NETSCAPE)? parseInt(window.innerWidth) : parseInt(document.documentElement.clientWidth);},
	getScrollY :function(){return (this.NETSCAPE)? parseInt(window.pageYOffset) + 6 :  parseInt(document.body.scrollTop);},
 	getScrollX :function(){return (this.NETSCAPE)? parseInt(window.pageXOffset) + 6 :  parseInt(document.body.scrollLeft);}
}
//-------------------------------------------------------------------------------
// because of the afterwards load Ads we need to correct the xy event/element cooordinates using a fix div in the page
var OffsetDiff={
	getX: function(){ return $('wz-main')? $('wz-main').offsetLeft:0;},
	getY: function(){ return $('head')? $('head').offsetTop:0;}
}

//--------------------------Screen------------------------------------------------
var Screen = {
    getHeight:function(){return parseInt(screen.height)},
    getWidth:function(){return parseInt(screen.width)}
}
//--------------------------Element---------------------------------------------------
var Element = {
	INPUTFIELD : 'text',
	SPAN : 'span',
	hide:		function(el){if($(el)) $(el).style.display="none";},
	show:		function(el,t){if($(el))$(el).style.display = (t)? t:"block";},
	isHidden:	function(el){return ($(el).style.display=="none") ? true:false;},
	toggle:		function(el){$(el).style.display = (this.isHidden(el))? "block":"none"},
	addClass:	function(el,cssClass){ if($(el)){if(!this.hasClass(el,cssClass)) $(el).className+=" " + cssClass}},
 	removeClass:function(el,cssClass){if($(el)){$(el).className= $(el).className.replace(cssClass,"")}},
 	hasClass:	function(el,cssClass){return ($(el).className.match(new RegExp("(^|\\s)" + cssClass + "(\\s|$)")))? true:false},
	setLeft:	function(el,x){$(el).style.left=x+"px";},
	setTop:		function(el,y){$(el).style.top=y+"px";},
	getHeight:	function(el){var tH = ($(el).style.height)? parseInt($(el).style.height):0;return (tH==0) ? $(el).offsetHeight:tH;},
	getWidth:	function(el){var tW = ($(el).style.width)? parseInt($(el).style.width):0;return (tW==0) ? $(el).offsetWidth:tW;},
 	setWidth:	function(el,w){$(el).style.width=w+"px";},
  	setHeight:	function(el,h){$(el).style.height=h+"px";},
  	setDimension: function(el,w,h){this.setWidth(el,w);this.setHeight(el,h);},
	setXY:		function(el,x,y){this.setLeft(el,x);this.setTop(el,y)},
	setText:	function(el,text){ $(el).value ?  $(el).value=text : $(el).innerHTML=text},
	getText:	function(el){return $(el).value ?  $(el).value:$(el).innerHTML},
	getAbsTop:	function(el) {return  (Browser.OPERA)? $(el).offsetTop: getAbsTop($(el));},
    getAbsLeft:	function(el) {return  (Browser.OPERA)? $(el).offsetLeft: getAbsLeft($(el));},
    getBottom:	function(el) { return  Element.getAbsTop(el) + Element.getHeight(el)},
    getRight:	function(el) { return  Element.getAbsLeft(el) + Element.getWidth(el)},
    remove:		function(elem){var el = $(elem);if(el && el.parentNode)el.parentNode.removeChild(el);},
    disable:	function(el){$(el).disabled = !($(el).disabled);},
    replace:	function(el,newEl){if($(el) && $(el).parentNode){var p = $(el).parentNode;var b = $(el).nextSibling;p.removeChild($(el));p.insertBefore(newEl,b);}},
    convert:	function(id,newType){var el = $(id);if(el && newType==Element.INPUTFIELD){newEl = createElement('input',id,el.className);newEl.type="text";newEl.value=el.innerHTML;el.parentNode.replaceChild(newEl,el); }if(el && newType==Element.SPAN){newEl = createElement('span',id,el.className);newEl.innerHTML=el.value;el.parentNode.replaceChild(newEl,el);}},
	outOfView:	function(el){var wH = Browser.getWindowHeight();var eBottom = Element.getAbsTop(el) + Element.getHeight(el) - document.documentElement.scrollTop;return (wH >= eBottom)? false:true;},
    clean: 		function(el){el = $(el);if(el){while(el.childNodes.length > 0){el.removeChild(el.firstChild);}}},
	move:		function(el,newParent){tmpNode = $(el);Element.remove(el);$(newParent).appendChild(tmpNode);},
	copy:		function(el,newParent){$(newParent).appendChild($(el).cloneNode(true));},
	alignRightWith:	function(el,ref,offsetX){
		if($(el) && $(ref)){
			var maxR = Element.getAbsLeft(ref) + Element.getWidth(ref) + (offsetX!=null ? offsetX:0)  ;
			var layR = Element.getAbsLeft(el) + Element.getWidth(el);
			var moveLeft = layR - maxR;
			if(moveLeft>0)
				$(el).style.left = ($(el).offsetLeft - moveLeft) + "px"; }
		},
	centerByWindow:	function(el){if($(el)){Element.setLeft(el,(Browser.getWindowWidth()/2) - ($(el).offsetWidth/2) + Browser.getScrollX());Element.setTop(el,(Browser.getWindowHeight()/2) - ($(el).offsetHeight/2)  + ((Browser.IE)? document.documentElement.scrollTop : 0));$(el).style.position= (Browser.NETSCAPE)? "fixed":"absolute";}	},
	scrolIntoView:	function(el){var wH = Browser.getWindowHeight()-100;eBottom = this.getAbsTop(el) + this.getHeight(el) - document.documentElement.scrollTop;if(!(wH >= eBottom)){window.scrollBy(0,10);scrolTimer = window.setTimeout('Element.scrolIntoView("' + el + '")',20);}},
	create: function(tagName, id, cssClass, value) {
	    var el = document.createElement(tagName);
	    if (el) {
	        if (id)
	            el.id = id;
	        if (cssClass)
	            el.className = cssClass;
	        if (value)
	            (el.value) ? el.value = value : el.innerHTML = value;
	    }
	    return el;

	}	
}//end Element


//------------------------------------------------------------------------------------

function addElementToPage(el) {
    myBody = document.getElementsByTagName('body')[0];
    if (myBody)
        myBody.appendChild(el);
}

//------------------------------------------------------------------------------------
var Msgbox = {
  OkOnly:1,OkCancel:2,CancelOnly:3,
  wzInf:'/static/img/dialog/dialog-info.gif',
  wzErr:'/static/img/dialog/dialog-alert.gif',
  wzSuc:'/static/img/dialog/dialog-checkmark.gif',
  wzReq:'/static/img/dialog/dialog-question.gif',
  
  show : function(msg,title,icoType,onOk,onCancel,btnType){
    
   if(!$('msg-bg')) this.create();
	
	Element.setText('msg-title',title==null ? 'Wazap!':title );
	
	if(icoType!= null)
		$('msg-icon').src = icoType;
	else	
		$('msg-icon').src = Msgbox.wzInf;
		
   	Element.setText('msg-msg',msg);Element.show('msg-bg'); Element.show('msg-box');
	Element.setDimension('msg-bg',Browser.getDocumentWidth(),(Browser.getDocumentHeight()> Browser.getWindowHeight() ? Browser.getDocumentHeight():Browser.getWindowHeight()));
	Element.centerByWindow('msg-box');
	
	/*eval IE hack*/
	if(Browser.IE6 && $('applybox')){
		$('msg-box').style.top	= $('applybox').offsetTop;
	}
	if(Browser.IE6 && $('mwz-start')){
		$('msg-box').style.top	= $('mwz-start').offsetTop;
	}
	
	
	if(btnType==null || btnType==1) {Element.show('msgBtnOk','inline');Element.hide('msgBtnCancel');}
	if(btnType==2) {Element.show('msgBtnOk','inline');Element.show('msgBtnCancel','inline');}
	if(btnType==3) {Element.hide('msgBtnOk');Element.show('msgBtnCancel','inline');}	
	
	(onOk)? $('msgBtnOk').onclick=onOk : function(){Msgbox.hide();docOnClick();return false};
	(onCancel)? $('msgBtnCancel').onclick=onCancel : function(){Msgbox.hide();docOnClick();return false};
	docOnClick();
	this.stopKeyListener();
	window.setTimeout('Msgbox.startKeyListener()',500);
   },
   stopKeyListener:function(){document.onkeypress= function(){return false;}},
   startKeyListener: function(){document.onkeypress=function(e){Event.onEnter(e,function(){$('msgBtnOk').click();});Event.onEscape(e,function(){$('msgBtnCancel').click();})}},
   hide:	function(){Element.hide('msg-bg'); Element.hide('msg-box');},
   create:	function(){
   		var bg = createElement('div','msg-bg','msgbg tc');
			bg.innerHTML="&zwnj;";
		var msgbx = createElement('div','msg-box','msgbox tc');
		var msg = createElement('div','msg-msg','msg tl');
		var msgtitle = createElement('div','msg-title','msgtitle tl');
		var msgicon = createElement('img','msg-icon','msgicon');
			msgicon.src="/static/img/dialog/dialog-info.gif";
			msgicon.alt="Wazap!";
		var btn = createElement('input','msgBtnOk','button cpointer');
			btn.type="button"
			btn.value="OK";
			btn.onclick=function(){Msgbox.hide();return true;}
		var btnC = createElement('input','msgBtnCancel','spc-l button cpointer');
			btnC.onclick=function(){Msgbox.hide();return false;}
			btnC.type="button";
			btnC.value=Messages.get("misc.cancel");
			msgbx.appendChild(msgtitle);
			msgbx.appendChild(msgicon);
			msgbx.appendChild(msg);
			msgbx.appendChild(btn);
			msgbx.appendChild(btnC);
			addElementToPage(bg);
			addElementToPage(msgbx);
   }
 }
 

//------------------------------------------------------------------------------------
var Url = {
	getHost:function(myurl){var regex = /http:\/\/([^\/:]+)/;regex.exec(myurl);return RegExp.$1;},
 	isExternalUrl:	function(myurl) {var h1 = this.getHost(document.URL).toLowerCase();var h2 = this.getHost(myurl).toLowerCase();return (h1 != h2);},
 	encode:			function(targetUrl){if (typeof encodeURIComponent == 'function') {targetUrl = encodeURIComponent(targetUrl);}return   targetUrl;},
 	decode:	function(targetUrl){if (typeof decodeURIComponent == 'function') {targetUrl = decodeURIComponent(targetUrl);}return   targetUrl;},
 	amp:function(text){return text.replace(/&/g,'&amp;');}
}
//------------------------------------------------------------------------------------
var Request={
	getQueryString:	function(){return window.location.search;},
  	getParameter:		function(key){var page = new PageQuery(window.location.search);	return unescape(page.getValue(key));},
 	getParameterList:	function(){	var page = new PageQuery(window.location.search);return page.getKeyValuePairs();}
}
//------------------------------------------------------------------------------------

var Event = {
	getX:	function(ev){var e = (!ev)? window.event:ev;return ((e.pageX) ? e.pageX:(e.clientX) ? e.clientX + document.documentElement.scrollLeft :0) - OffsetDiff.getX();},
  	getY:	function(ev){var e = (!ev)? window.event:ev; return ((e.pageY) ? e.pageY:(e.clientY) ? e.clientY + document.documentElement.scrollTop :0) - OffsetDiff.getY();},
 	getButton:	function(e){return (e.which)? e.which:event.button;},
	onKeyPress:	function(e,actionKey,func){var pressedKey =(e)? e.keyCode : (window.event)? window.event.keyCode:null;if(!pressedKey) return;if(pressedKey==actionKey)func();},
	onEnter:function(e,func){this.onKeyPress(e,13,func)},
	pressedEnter:function(e){var pressedKey =(e)? e.keyCode : (window.event)? window.event.keyCode:null; return (pressedKey==13)? true:false},
	onEscape:function(e,func){this.onKeyPress(e,27,func)},
	getSource: function(ev){var targ; var e = (!ev) ? window.event:ev ;if (e.target) targ = e.target;else if (e.srcElement) targ = e.srcElement;if (targ.nodeType == 3) targ = targ.parentNode;}
}
//------------------------------------------------------------------------------------
var Exception = {
	handle :function(msg){
   		/*
   		if(DEBUG){
		  if(Browser.FIREFOX && console){
		  	console.error(this.handleException.caller, msg);
		  }else{
			alert("ERROR:\n" + msg);
		  }
		}
		*/
	},
	xmlRequestError: function(code){
		Msgbox.show('Internal Error'+ code,'System',Msgbox.wzErr);
	}
 }
//------------------------------------------------------------------------------------	
var Validation={
	checkEmpty:function(val,defaultVal){return (val==null || val.length==0) ? defaultVal:val;},
 	checkNumber:function(val,defaultVal){return (isNaN(val))? defaultVal:val},
 	encodeData:function(text){var 	result = encodeURI(text);
 									result = result.replace(/\&/gi,encodeURIComponent("&amp;"));
 									return result;},
 	decodeData:function(text){var 	result = decodeURI(text);
 									result = result.replace(/amp;/gi,'');
 									return result;},
	isValidEmail: function(strEmail){
		var emailRegExp = /^[\w-]+(?:\.[\w-]+)*@(?:[\w-]+\.)+[a-zA-Z]{2,7}$/
		return emailRegExp.test(strEmail);
	},
 	
 	isValidDate: function( strValue ) {
		  //paddern dd.MM.yyyy;	
		  var objRegExp = /^\d{1,2}(\.)\d{1,2}\1\d{4}$/
		 
		  //check to see if in correct format
		  if(!objRegExp.test(strValue)){
		    return false; //doesn't match pattern, bad date
		  }else{
		    var strSeparator = strValue.substring(2,3) 
		    var arrayDate = strValue.split(strSeparator); 
		    //create a lookup for months not equal to Feb.
		    var arrayLookup = { '01' : 31,'03' : 31, 
		                        '04' : 30,'05' : 31,
		                        '06' : 30,'07' : 31,
		                        '08' : 31,'09' : 30,
		                        '10' : 31,'11' : 30,'12' : 31}
		    var intDay = parseInt(arrayDate[0],10);  
		
		    //check if month value and day value agree
		    if(arrayLookup[arrayDate[1]] != null) {
		      if(intDay <= arrayLookup[arrayDate[1]] && intDay != 0)
		        return true; //found in lookup table, good date
		    }
		    
		    //check for February (bugfix 20050322)
		    //bugfix  for parseInt kevin
		    //bugfix  biss year  O.Jp Voutat
		    var intMonth = parseInt(arrayDate[1],10);
		    if (intMonth == 2) { 
		       var intYear = parseInt(arrayDate[2]);
		       if (intDay > 0 && intDay < 29) {
		           return true;
		       }
		       else if (intDay == 29) {
		         if ((intYear % 4 == 0) && (intYear % 100 != 0) || 
		             (intYear % 400 == 0)) {
		              // year div by 4 and ((not div by 100) or div by 400) ->ok
		             return true;
		         }   
		       }
		    }
		  }  
		  return false; //any other values, bad date
		},
	isFutureDate: function(userDate){
			var today= new Date();
			var datediff = ((today-userDate)/(24*60*60*1000)) ;
			return (datediff < 0) ? true:false;
	}	
} 
//------------------------------------------------------------------------------------
var UTF8={
	encode: function(rohtext) {
             // dient der Normalisierung des Zeilenumbruchs
             rohtext = rohtext.replace(/\r\n/g,"\n");
             var utftext = "";
             for(var n=0; n<rohtext.length; n++)
                 {
                 // ermitteln des Unicodes des  aktuellen Zeichens
                 var c=rohtext.charCodeAt(n);
                 // alle Zeichen von 0-127 => 1byte
                 if (c<128)
                     utftext += String.fromCharCode(c);
                 // alle Zeichen von 127 bis 2047 => 2byte
                 else if((c>127) && (c<2048)) {
                     utftext += String.fromCharCode((c>>6)|192);
                     utftext += String.fromCharCode((c&63)|128);}
                 // alle Zeichen von 2048 bis 66536 => 3byte
                 else {
                     utftext += String.fromCharCode((c>>12)|224);
                     utftext += String.fromCharCode(((c>>6)&63)|128);
                     utftext += String.fromCharCode((c&63)|128);}
                 }
             return utftext;
         	},
       decode: function(utftext) {
             var plaintext = ""; var i=0; var c=c1=c2=0;
            // while-Schleife, weil einige Zeichen uebersprungen werden
            while(i<utftext.length)
                {
                 c = utftext.charCodeAt(i);
                if (c<128) {
                     plaintext += String.fromCharCode(c);
                     i++;}
                 else if((c>191) && (c<224)) {
                     c2 = utftext.charCodeAt(i+1);
                     plaintext += String.fromCharCode(((c&31)<<6) | (c2&63));
                     i+=2;}
                 else {
                     c2 = utftext.charCodeAt(i+1); c3 = utftext.charCodeAt(i+2);
                     plaintext += String.fromCharCode(((c&15)<<12) | ((c2&63)<<6) | (c3&63));
                    i+=3;}
                 }
             return plaintext;
         }
} 
