    function registerEvent(element,evnt,handler) {
        if(document.attachEvent!=null)
            element.attachEvent(evnt,handler);
        else if(document.addEventListener!=null) 
            element.addEventListener(evnt.replace(/^on/i,""),handler,true);
        else
            alert("element."+evnt+"="+handler)
    }
    
    function WRkWeekday(element,weekelement,clickhandler) {
        this.element=element;
        this.weekelement=weekelement;
        var date=new Date();
        var isCurrentMonth=false;
        this.isCurrentMonth=isCurrentMonth;
        
        function setDate(_date,_isCurrentMonth) {
            isCurrentMonth=_isCurrentMonth;
            
            element.style.backgroundColor=isCurrentMonth?"#eeeeee":"#aaaaaa";
            weekelement.innerHTML=SEWeek(_date);
            date=_date;
            element.innerHTML=date.getDate();
        }
        this.setDate=setDate;
        
        function setBlank() {
            this.element.innerHTML="";
        }
        this.setBlank=setBlank;
        function focus() {
            element.style.backgroundColor="#dddddd";
            weekelement.style.backgroundColor="#C98A42";
        }
        this.focus=focus;
        function blur() {
            element.style.backgroundColor=isCurrentMonth?"#eeeeee":"#aaaaaa";
            weekelement.style.backgroundColor="#C90A42";
        }
        this.blur=blur;
        function click() {
            clickhandler.call(null,date);
        }
        this.click=click;
        
        
        registerEvent(element,"onclick",this.click);
        registerEvent(element,"onmouseover",this.focus);
        registerEvent(element,"onmouseout",this.blur);
    }
    
    var WRkCalendars=new Array();
    function WRkCalendar(button,FullDate,Year,Month,Day,Week) {
    /*
        if(weekdays==undefined) window.weekdays=["","m","t","w","t","f","s","s"];
        if(months==null) months=["january","february","mars","april","may","june","july","august","september","october","november","december"];
      */                   
        var referenceDate=new Date();
        this.referenceDate=referenceDate;
        
        var backDiv=document.createElement("div");
        backDiv.style.cssText="border:1px solid;width:138px;height:170px;display:none;position:absolute;background-color:window;color:windowtext;background-image:url(img/bg_menu2.gif);";
        this.backDiv=backDiv;

        var topDiv=document.createElement("div");
        topDiv.style.cssText="margin-bottom:1px;width:138px;height:20px;background-color:transparent;color:black;cursor:default;";

        var margDiv=document.createElement("div");
        margDiv.style.cssText="cursor:default;float:left;margin:0px;width:16px;height:16px;color:black;background-color:transparent;";
        topDiv.appendChild(margDiv);

        var closeButton=document.createElement("div");
        closeButton.style.cssText="overflow:hidden;cursor:hand;float:left;margin:0px;width:15px;height:16px;color:black;background-color:transparent;background-image:url(img/close.gif);background-repeat:no-repeat";
        this.closeButton=closeButton;

        var yearLabel=document.createElement("div");
        yearLabel.style.cssText="float:left;margin-bottom:1px;width:107px;height:19px;background-color:transparent;color:black;cursor:default;";
        yearLabel.innerHTML="test";
        topDiv.appendChild(yearLabel);
        this.yearLabel=yearLabel;
        topDiv.appendChild(closeButton);
        
        backDiv.appendChild(topDiv);

        var browserDiv=document.createElement("div");
        browserDiv.style.cssText="margin-bottom:1px;width:100%;height:15px;background-color:transparent;color:white;cursor:default;";

        var prevDiv=document.createElement("div");
        prevDiv.style.cssText="float:left;margin-bottom:1px;width:15px;height:15px;background-color:transparent;color:white;cursor:hand;background-image:url(img/arrowLeft.gif);";
        this.prevButton=prevDiv;
        
        var monthLabel=document.createElement("div");
        monthLabel.style.cssText="float:left;margin-bottom:1px;width:108px;height:15px;background-color:transparent;color:black;cursor:default;";
        monthLabel.innerText="nisse";
        this.monthLabel=monthLabel;
        
        var nextDiv=document.createElement("div");
        nextDiv.style.cssText="float:left;margin-bottom:1px;width:15px;height:15px;background-color:transparent;color:white;cursor:hand;background-image:url(img/arrowRight.gif);";
        this.nextButton=nextDiv;
        
        browserDiv.appendChild(prevDiv);
        browserDiv.appendChild(monthLabel);
        browserDiv.appendChild(nextDiv);        
        
        backDiv.appendChild(browserDiv);

        var daysDiv=document.createElement("div");
        daysDiv.style.cssText="width:100%;height:15px;background-color:#C90A42;color:white;cursor:default;";

        for(var i=0;i<weekdays.length;i++) {
            var day=document.createElement("div");
            day.style.cssText="float:left;margin:1px;width:15px;height:15px;background-color:#C90A42;color:white;cursor:default;";
            day.innerHTML=weekdays[i];
            backDiv.appendChild(day);
        }

        function setDate(date) {
            if(FullDate!=null) FullDate.value=date.getFullYear()+"-"+(date.getMonth()+1)+"-"+date.getDate();
            if(Year!=null) Year.value=date.getFullYear();
            if(Month!=null) Month.value=date.getMonth()+1;
            if(Day!=null) Day.value=date.getDate();
            if(Week!=null) Week.value=SEWeek(date);
            backDiv.style.display="none";
        }
        this.setDate=setDate;
        
        var weeks=new Array(6);
        var days=new Array();
        this.days=days;

        try {
            for(var w=0;w<weeks.length;w++) {
                var week=document.createElement("div");
                week.style.cssText="padding:0px;float:left;margin:1px;width:15px;height:15px;background-color:#C90A42;color:white;cursor:default;";
                week.innerHTML="w";
                backDiv.appendChild(week);
                
                for(var d=0;d<7;d++) {
                    var day=document.createElement("div");
                    day.style.cssText="font-size:8px;cursor:hand;padding:0px;border:1px solid;float:left;margin:1px;width:13px;height:15px;background-color:white;color:black;";
                    day.innerHTML="d";
                    backDiv.appendChild(day);
                    days[days.length]=new WRkWeekday(day,week,setDate);
                }
            }
        } catch(e) {/*alert("setup"+e)*/}

        function initialize(date) {
            //if(this.days==null) this.days=days;
            var datefirst=new Date(date.getFullYear(),date.getMonth(),1);
            var offset=datefirst.getDay()-1;
            var lastday=(new Date((new Date(date.getFullYear(),date.getMonth()+1,1)).getTime()-1)).getDate()+1;
            for(var i=0,d=1;i<days.length;i++) {
                days[i].setBlank();
                days[i].setDate(new Date(date.getFullYear(),date.getMonth(),d++-offset),i>=offset&&i-offset+1<lastday);
            }
            monthLabel.innerHTML=months[date.getMonth()];
            yearLabel.innerHTML=date.getFullYear();
        }
        this.initialize=initialize;
        
        this.initialize(referenceDate);

        function nextMonth() {
            referenceDate=new Date(referenceDate.getFullYear(),referenceDate.getMonth()+1,1);
            initialize(referenceDate);
        }
        this.nextMonth=nextMonth;
        
        function prevMonth() {
            referenceDate=new Date(referenceDate.getFullYear(),referenceDate.getMonth()-1,1);
            initialize(referenceDate);
        }
        this.prevMonth=prevMonth;
        
        registerEvent(this.prevButton,"onclick",this.prevMonth);
        registerEvent(this.nextButton,"onclick",this.nextMonth);
        
        function display() {
            if(window.event==null||window.event.srcElement==button) {
                for(var i=0;i<WRkCalendars.length;i++)
                    WRkCalendars[i].hide();
                backDiv.style.display="block";
            }
        }
        this.display=display;

        function hide() {
            backDiv.style.display="none";
        }
        this.hide=hide;

        try {
            button.insertBefore(backDiv,null);
        } catch(e) {
        }
        
        registerEvent(closeButton,"onclick",this.hide);
        registerEvent(button,"onclick",this.display);
        
        WRkCalendars[WRkCalendars.length]=this;
    }

    /* FROM SA */
    function SEFirstMonday(year) {
	    var jan1 = new Date(Date.UTC(year,0,1));
	    var jan1wd = (jan1.getUTCDay() + 6) % 7;
	    if (jan1wd < 4)
		    return new Date(jan1.setUTCHours(-24*(jan1wd)));
	    return new Date(jan1.setUTCHours(24*(7-jan1wd)));
    }
    /* FROM SA */
    function SEWeek(date) {
        date = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));
        var mon = SEFirstMonday(date.getUTCFullYear());
        var nextMon = SEFirstMonday(date.getUTCFullYear()+1);
        var prevMon = SEFirstMonday(date.getUTCFullYear()-1);

        if (date >= nextMon)
            return 1;
        if (date < mon)
            return 1 + Math.floor( (date - prevMon ) / 604800000 );

        return 1 + Math.floor( (date - mon) / 604800000 );
    }