Date.prototype.getDaysOfMonth = function () {
    var curMon = this.getMonth();
    var day = 28; //28 Tage hat auf jeden Fall jeder Monat
    do {   
        this.setDate(++day);                      
    } while (curMon == this.getMonth());
    return --day;
}

Date.prototype.getWeek = function () {
    var date   = new Date();
    var curMon = this.getMonth();
    var days   = this.getDate();
    var curWeekDay = (this.getDay() == 0)?7:this.getDay();

    for(var i = curMon ; i > 0 ; i--) {        
        date.setMonth((curMon-i));
        days += date.getDaysOfMonth();        
    }
    
    var lastDaysOfYear = days-curWeekDay;
    var weeks = 1;
    
    if(lastDaysOfYear > 0 ) {
        while (lastDaysOfYear > 0){
           weeks++;
           lastDaysOfYear-=7;
        }
    }
        
    date.setDate(4); date.setMonth(0);
    if( (date.getDay()==0?6:date.getDay()-1 ) < 3) weeks--;
        
    return (weeks == 0)?52:weeks;
}         
   
Date.prototype.getFullYear = function () {    
    if(navigator.appName == 'Microsoft Internet Explorer') {
        if(this.getYear() < 100) 
            return 1900+this.getYear();
        else 
            return this.getYear();
    } else {
        return this.getYear()+1900;
    }    
}

Array.prototype.arrayKey = function (search) {
    for(var i = 0 ; i < this.length;i++)
        if(this[i] == search) return i;
}

Array.prototype.inArray = function (search) {
    for(var i=0;i < this.length;i++) {
        if(this[i] == search) return true;
    }
    return false;
}

Array.prototype.merge = function () {
    for(var i = 0 ; i < arguments.length;i++) {
        for(var j = 0 ; j < arguments[i].length;j++) {
            this.push(arguments[i][j]); 
        }
    }
}

Array.prototype.deleteValue = function (search) {
    var buffer = new Array();
    for(var i = 0;i < this.length;i++) {
        if(this[i].toLowerCase() != search.toLowerCase())
            buffer.push(this[i]);
    }
    return buffer;
}

function removeElementFromObject (name,object) {
    var buffer = new Object();
    for(key in object) {   
        if(key == name) continue;
        buffer[key] = object[key];
    }
    return buffer;
}

Object.extend = function (ObjectName,source) {
    for(property in source) {
        ObjectName[property] = source[property]; 
    }
}

var Regexp = {
	datePattern:/^([0-2][0-9]\.|(3(0\.(?=[\d]{1,2})|1\.(?!(04|06|09|11))))(?!02))(0[1-9]|1[0-2])\.(\d{4})$/g,
	simpleDate:/^\d{2}\.\d{2}\.\d{4}$/g,
    timerpattern:/^(?:[0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/,
	mail:/^([\w\d\-\_\.]+)@([\w\d\-\_]+)\.([a-z]{2,3})$/,
    alpha:/^[a-zA-Z\s]+$/
}

if(!Element) var Element = new Object();
Object.extend(Element,{
        /**
                      *generate id for Element
                      *get random letter A-Z a-z
                      *get random number 0-10
                      *finish length 32 chars
                      *@access public
                      *@return String generated ID
                      */
        generateId:function (len) {
            var generatedId = '';
            for(var i = 0 ; i < len;i++){
                while (1) {
                    var letterCode = Math.round(Math.random()*122);                
                    if(letterCode >= 65 && letterCode <= 90 || letterCode >= 97 && letterCode <= 122) {
                        generatedId += String.fromCharCode(letterCode);
                        break;
                    }
                }
                generatedId += ''+Math.round(Math.random()*10);                
            }            
            return generatedId;
        },
        trim:function (obj) {
            if(typeof obj == 'object') {
                obj.innerHTML = obj.innerHTML.replace(/^\s*/,'');
                obj.innerHTML = obj.innerHTML.replace(/\s*$/,'');
            } else {
                obj = obj.replace(/^\s*/,'');
                obj = obj.replace(/\s*$/,'');
            }
            
            return obj;
        },
        /**
                      * HTML Element exists 
                      *@access public
                      *@params String object ID
                      *@params String searchvalue 
                      *@params String attribute Name no need id attribute
                      *@return boolean
                      */
        exists:function(htmlObj,search,attrib) {
            var obj = htmlObj;
            var found = false;
            if(document.getElementById(search) && !attrib) return true; 
            if(!search && !attrib && document.getElementById(htmlObj)) return true;
            else return false;
            
            if(typeof obj != 'object') {
                 if(document.getElementById(htmlObj)) obj = document.getElementById(htmlObj);
                 else if (obj.toLowerCase() == 'body') obj = document.getElementsByTagName('BODY')[0];
                 else return false;
            }
            
            function searchObj (o) {
                for(var i = 0; i < o.childNodes.length;i++) {
                     if(o.childNodes[i].nodeName == '#text')
                         continue;
                    
                    with(o.childNodes[i]) {
                        if (getAttribute(attrib) == search) 
                            found = true;
                        else 
                            if(childNodes.length > 0 && !found) searchObj(o.childNodes[i]);
                    }
                }        
                if(found) return true;
            }
            searchObj(obj);
            return found;
        },
        /**
                      *create HTML Element
                      *@access public 
                      *@params String HTML name
                      *@return object
                      */
        create:function (n,string) {
            var el = document.createElement(n);
            if(typeof string == 'string') {
				el.innerHTML = string;
            }
            return el;
        },
        /**
                      *get HTML object over id
                      *@access public 
                      *@params String object id
                      *@return object
                      */
        get:function (id) {
            return (Element.exists(id))?document.getElementById(id):null;
        },
        getElements:function(element,htmlTag) {
            if(typeof element == 'object') 
                return element.getElementsByTagName(htmlTag);
            else 
                return Element.get(element).getElementsByTagName(htmlTag);
        },
        addEvent:function(element,type,func) {
            if(typeof element == 'string') {
                if(element.match(/body/i)) {
                    var triggerObj = document.getElementsByTagName('BODY')[0];
                } else {
                    var triggerObj = document.getElementById(element);
                }
            } else {
                var triggerObj = element;
            }

            if(document.addEventListener) { //gute Browser
            	 if(type.match(/^on/))  {
                    type = type.replace(/^on/,"");
                }
                triggerObj.addEventListener(type,func,false);
            } else { // IE
            	if(!type.match(/^on/)) type = "on"+type;            	    
                triggerObj.attachEvent(type,func);
            }
        },
        unlinkEvent:function(element,type,func) {
            if(typeof element == 'string') {
                if(element.match(/body/i)) {
                    var triggerObj = document.getElementsByTagName('BODY')[0];
                } else {
                    var triggerObj = document.getElementById(element);
                }
            } else {
                var triggerObj = element;
            }
            
            if(document.removeEventListener) { //gute Browser
            	if(type.match(/^on/))  {
                    type = type.replace(/^on/,"");
                }
                triggerObj.removeEventListener(type,func,false);
            } else { // IE
                if(!type.match(/^on/)) type = "on"+type;            	    
                triggerObj.detachEvent(type,func);
            }
        },
        /**
                      *attach Attribute to HTML Element
                      *@access public           
                      *@params Object HTML Element
                      *@params String name of Attribute
                      *@params [String Attribute Value] [Object Attribute Values [only for style Attribute]]
                      *@return void
                      */
        attrib:function (obj,name,valObj) {        
            if(!name.match(/style/i) ) {            
                if(name == 'class' && navigator.appName == 'Microsoft Internet Explorer') {
                    name = 'className';
                }            
                obj.setAttribute(name,valObj);
            } else {
                for(value in valObj) {
                    eval('obj.style.'+value+'= valObj[value]');
                }
            }
        },
        /**
                       *display Object on Document
                       *@access public
                       *@params obj HTML object
                       *@return void
                       */
        show:function(obj) {
            if(typeof obj == 'object')
                obj.style.display = 'block';
            else 
                document.getElementById(obj).style.display = 'block';
        },
        /**
                       *hide Object on Document
                       *@access public
                       *@params obj HTML object
                       *@return void
                       */
        hide:function(obj) {
            if(typeof obj == 'object')
                obj.style.display = 'none';
            else 
                document.getElementById(obj).style.display = 'none';
        },
        /**
                      *delete HTML Element from Document
                      *@access public
                      *@params Object HTML element
                      *@return void
                      */                       
        unlink:function (element) {
            element.parentNode.removeChild(element);
        },
        /**
                      *bind HTML object to HTML element
                      *@access public 
                      *@params Object HTML ObjT target Element
                      *@params Object HTML Obj bind to Element
                      *@return void
                      */
        bind:function (objT,objS) {        
            if(typeof objS == 'object') {      
                objS.appendChild(objT);
            } else {
                try {
                    if(objS.match(/BODY/i)) {
                        document.getElementsByTagName('BODY')[0].appendChild(objT);
                    } else {
                        if(document.getElementById(objS)) {
                            document.getElementById(objS).appendChild(objT);
                        } else {
                            throw ('Element mit der ID '+objS+' ist nicht belegt');
                        }
                    }
                } catch (e) {
                    alert(e+"  "+objS);
                }
            }
        },
        /**
                     * position ermitteln 
                     * @access private
                     * @param Object HTML Object				  
                     * @return Object
                     */
        getCoords:function(htmlObj) {       
            var body = false;
            
            if(typeof htmlObj == 'string' && !htmlObj.match(/(body|window)/i)) {
                var obj = Element.get(htmlObj);
            } else if (typeof htmlObj == 'object' && !htmlObj.nodeName.match(/(body|window)/i)) {
                var obj = htmlObj;
            } else {
                body = true;
            }

            if(!body) {
                var left = 0;
                var top  = 0;
                var objW = obj.offsetWidth;
                var objH = obj.offsetHeight;
                                    		
                while (obj.offsetParent) {
                    left += obj.offsetLeft;
                    top  += obj.offsetTop;
                    obj = obj.offsetParent;
                }
                
                left += obj.offsetLeft;
                top  += obj.offsetTop;

                return {posX:left,posY:top,w:objW,h:objH};
            } else {
                var height       = window.innerHeight || document.documentElement.offsetHeight;
                var width        = window.innerWidth  || document.documentElement.offsetWidth;
                var scrollHeight = document.documentElement.scrollHeight; 
                
                return {w:width,h:height,sH:scrollHeight};
            }
        },
        /**
                     * Hilfsfunktion für Eventhandling
                     * @access public
                     * @param Object element , welches Object den Event auslöst
                     * @param String type , welcher Eventhandler kommt in Frage
                     * @param String callBack , callBack Funktion welche den event verarbeitet
                     * @param Object returnParams optionale Rückgabe Parameter
                     * @return object event;
                     * @return object html object;
                     */
        bindEvent:function(element,type,callBack,rP,onlyParams) {

            if(typeof element == 'string') {
                if(element.match(/body/i)) {
                    var triggerObj = document.getElementsByTagName('BODY')[0];
                } else {
                    var triggerObj = document.getElementById(element);
                }
            } else {
                var triggerObj = element;
            }

            var returnParams = rP;	
            var event        = type;
            try{
            	if(document.addEventListener) { //gute Browser
            	    if(type.match(/^on/))  {
                       event = type.replace(/^on/,"");
                    }
                    triggerObj.addEventListener(event,handleEvent,false);
            	} else { // IE
            	    if(!type.match(/^on/))	
                        event = "on"+type;            	    
                    triggerObj.attachEvent(event,handleEvent);
            	}
            }catch(e){  }
            	
            function handleEvent (evt) {
                var event  = (evt)?evt:(window.event)?window.event:'';
        
                if(event.stopPropagation) {
                    event.stopPropagation();
                } else {
                    event.cancelBubble = true;
                }
                            		
                var target = event.srcElement || event.currentTarget; 
                if(onlyParams) callBack.call(callBack,(returnParams)?returnParams:null);
                else           callBack.call(callBack,event,target,(returnParams)?returnParams:null);
            }
        },
        /**
                      *clear browser newlines form inner HTML
                      *@access public
                      *@params Object HTML Element
                      *@return Object HTML Element
                      */
        stripBreaks:function(obj) {
            obj.innerHTML = obj.innerHTML.replace(/>\s*/gm,'>'); 
            obj.innerHTML = obj.innerHTML.replace(/\s*</gm,'<'); 
            obj.innerHTML = obj.innerHTML.replace(/>\s*</gm,'><'); 
        },
        /**
                      *css Wert auslesen welche direkt in einen CSS File angegeben sein können
                      *@access public
                      *@params [Object htmlObject | String object id / name] 
                      *@paramsString name CSS 
                      *@return String CSS Value
                      */
        cssValue:function (htmlObj,name) {        
            if(typeof htmlObj == 'string') {
                if(htmlObj.match(/body/i)) {
                    var obj = document.getElementsByTagName('BODY')[0];
                } else {
                    var obj = document.getElementById(htmlObj);
                }
            } else {
                var obj = htmlObj;
            }
            
            if(window.getComputedStyle) {
                var val = window.getComputedStyle(obj,'').getPropertyValue(name);
                
                if(val) {
                    return val
                } else {
                    return eval('obj.style.'+name);
                }
                
            } else {
             if(obj.currentStyle && obj.currentStyle[name]){
              return obj.currentStyle[name];
             }else{
              return '';
            }
          }
        }
    }
);
