  function ic_mktime() {
    var no, ma = 0, mb = 0, i = 0, d = new Date(), argv = arguments, argc = argv.length;
    if (argc > 0){
      d.setHours(0,0,0); d.setDate(1); d.setMonth(1); d.setYear(1972);
    }
    var dateManip = {
      0: function(tt){ return d.setHours(tt); },
      1: function(tt){ return d.setMinutes(tt); },
      2: function(tt){ var set = d.setSeconds(tt); mb = d.getDate() - 1; return set; },
      3: function(tt){ var set = d.setMonth(parseInt(tt)-1); ma = d.getFullYear() - 1972; return set; },
      4: function(tt){ return d.setDate(tt+mb); },
      5: function(tt){ return d.setYear(tt+ma); }
    };
    for( i = 0; i < argc; i++ ){
      no = parseInt(argv[i]*1);
      if (isNaN(no)) {
        return false;
      } else { // arg is number, let's manipulate date object
        if(!dateManip[i](no)){ // failed
          return false;
        }
      }
    }
    return Math.floor(d.getTime()/1000);
  }

        /*
         * File          : calendar.js
         * Version       : 1.0
         * Created       : 20030520
         * Author        : Christian Hansen <chrsen@fundanemt.com>
         * Description   : Used for calendercalcs. julianday is used
         *                 as internal reference instead of unixtimestamps.
         *                 therefore this supports and infinite range of dates.
         * License       : GPL2
         *
         * CHANGELOG
         * ========================
         *
         *$Log: calendar.js,v $
         *Revision 1.10  2004/02/16 22:24:09  chrsen
         *Added function getNWeekDay as a part of clickonadata event
         *
         *Revision 1.9  2004/02/02 19:17:39  chrsen
         *Corrected spelling error and added today mark
         *
         *Revision 1.8  2004/02/02 13:59:13  chrsen
         *Minor corrections in mkMonthView
         *
         *Revision 1.7  2004/02/02 11:32:40  chrsen
         *Calendar done for now
         *
         *Revision 1.6  2004/02/01 22:53:20  chrsen
         *Minor bugfix
         *
         * ========================
         */


        /*=================================================================
        INITIAL PROCEEDURES
        =================================================================*/

            //object to hold your special days ie. birthdays.
            var mySpecialDays = new Object();

            //get todays date
            var today = mkjd();

        /*=================================================================
        FUNCTIONS CONVERTING BETWEEN JULIAN DAYS AND NORMAL CALENDERDATES
        =================================================================*/

            /*
             * function         : mkjd
             * input            : [integer year,integer month, integer day, integer hour, integer minute, integer second]
             * output           : float mkjd
             * Description      : Calculates julianday based on input
             * Scope            : public
             */
            function mkjd(year,month,day,hour,minute,second) {

                var now = new Date();
                if(arguments.length) {
                    if(arguments.length < 6) var second = 0;
                    if(arguments.length < 5) var minute = 0;
                    if(arguments.length < 4) var hour = 0;
                    if(arguments.length < 3) var day = now.getDate();
                    if(arguments.length < 2) var month = now.getMonth() + 1;
                } else {
                    var year = now.getUTCFullYear();
                    var month = now.getUTCMonth() + 1;
                    var day = now.getUTCDate();
                    var hour = now.getUTCHours();
                    var minute = now.getUTCMinutes();
                    var second = now.getUTCSeconds();
                }//else

                day += floatDay(hour,minute,second);

                if(month <= 2) {
                    year -= 1;
                    month += 12;
                }

                var A = Math.floor( year / 100 );
                var B = 2 - A + Math.floor( A / 4 );
                return Math.floor(365.25 * ( year + 4716)) + Math.floor(30.6001 * ( month + 1)) + day + B - 1524.5;

            }//mkjd


            /*
             * function         : floatDay
             * input            : integer hour, integer minute, integer second
             * output           : float floatday
             * Description      : Returns a given time at day as a decimal point
             * Scope            : private
             */
            function floatDay(hour,minute,second) {
                return ((hour * 3600) + (minute * 60) + second) / (24 * 3600);
            }//floatDay


            /*
             * function         : jdtoday
             * input            : float julianday
             * output           : ARRAY jdtoday
             * Description      : Returns array with    [0]=year,[1]=month,[2]=day
             *                  :                       [3]=hour,[4]=minute,[5]=second
             * Scope            : public
             */
            function jd2date(jd) {
                var data = new Object();
                jd += 0.5;
                var Z = Math.floor(jd);
                var F = jd - Z;
                var A = Z>=2299161?Z+1+Math.floor((Z-1867216.25)/36524.25)-Math.floor(Math.floor((Z-1867216.25)/36524.25)/4):A;
                var B = A + 1524;
                var C = Math.floor((B - 122.1) / 365.25);
                var D = Math.floor(365.25 * C);
                var E = Math.floor((B - D) / 30.6001);
                var day = B - D - Math.floor(30.6001 * E) + F + 1E-9;
                data["month"] = E < 14 ? E - 1 : E - 13;
                data["year"] = data["month"] > 2 ? C - 4716 : C - 4715;
                var G = 86400 * (day - Math.floor(day));
                data["hour"] = Math.floor(G/3600);
                data["minute"] = Math.floor((G - data["hour"] * 3600) / 60);
                data["second"] = Math.floor((G - (data["hour"] * 3600 + data["minute"] * 60)));
                data["day"] = Math.floor(day);
                data["intweekday"] = getWeekDay(jd -0.5);
                return data;
            }//jd2date


            /*
             * function         : getIso8601
             * input            : [float julianday]
             * output           : string time
             * Description      : Returns the date and time in ISO 8601 presentation
             * Scope            : public
             */
            function getIso(jd) {
                if(!arguments.length) var jd = mkjd();
                var data = jd2date(jd);
                var out = data["year"];
                out += (data["month"] < 10?"-0":"-")+data["month"];
                out += (data["day"] < 10?"-0":"-")+data["day"];
                out += (data["hour"] < 10?"T0":"T")+data["hour"];
                out += (data["minute"] < 10?":0":":")+data["minute"];
                out += (data["second"] < 10?":0":":")+data["second"];
                return out;
            }//getIso8601


            /*
             * function         : mktime
             * input            : [float julianday]
             * output           : integer time
             * Description      : Returns the unix timestamp
             * Scope            : public
             */
            function mktime(jd) {
                if(!arguments.length) var jd = mkjd();
                var unixEpoch = mkjd(1970,1,1,0,0,0);
                var diff = jd - unixEpoch;
                var diff_int = Math.floor(diff);
                var diff_float = diff - diff_int;
                return Math.floor((diff_int+diff_float)*86400);
            }//mktime

        /*=================================================================
        FUNCTIONS FOR GETTING VARIOUS INFORMATION ABOUT A SPECIFIC DATE
        =================================================================*/

            /*
             * function         : getWeek
             * input            : [float julianday]
             * output           : integer weeknumber
             * Description      : Returns the weeknumber in ISO 8601 std.
             * Scope            : public
             */
            function getWeek(jd) {
                if(!arguments.length) var jd = mkjd();
                var K = isLeapYear(jd) ? 1 : 2;
                var dateDay = jd2date(jd);
                var daynumber = Math.floor(275 * dateDay["month"] / 9) - K * Math.floor((dateDay["month"] + 9) / 12) + dateDay["day"] - 30;
                var firstdaythisyear = getWeekDay(mkjd(dateDay["year"],1,1,0,0,0));
                var firstdaylastyear = getWeekDay(mkjd((dateDay["year"] - 1),1,1,0,0,0));

                switch (firstdaythisyear) {
                    case 0:
                        var number = Math.floor((daynumber + 5) / 7);
                        return (number == 0) ? 52 : number;
                    case 1:
                        var number = Math.floor((daynumber + 6) / 7);
                        return (number == 53) ? 1 : number;
                    case 2:
                        var number = Math.floor((daynumber + 7) / 7);
                        return (number == 53) ? 1 : number;
                    case 3:
                        var number = Math.floor((daynumber + 8) / 7);
                        if (number == 53)
                            number = (isLeapYear(jd)) ? 53 : 1;
                        return number;
                    case 4:
                        return Math.floor((daynumber + 9) / 7);
                    case 5:
                        var number = Math.floor((daynumber + 3) / 7);
                        if (number == 0) {
                            number = (firstdaylastyear == 3 && isLeapYear(mkjd((dateDay["year"] - 1),dateDay["month"],dateDay["day"],1,1,1))) ? 53 : 52;
                            number = (firstdaylastyear == 4) ? 53 : number;
                        }
                        return number;
                    case 6:
                        var number = Math.floor((daynumber + 4) / 7);
                        if (number == 0) {
                            number = (firstdaylastyear == 3 && isLeapYear(mkjd((dateDay["year"] - 1),dateDay["month"],dateDay["day"],1,1,1))) ? 53 : 52;
                            number = (firstdaylastyear == 4) ? 53 : number;
                        }
                        return number;
                }//switch

            }//getWeek


            /*
             * function         : getWeekDay
             * input            : float julianday
             * output           : integer weekday
             * Description      : returns the weekday as an integer 0 = sunday, 6 = saturday
             * Scope            : public
             */
            function getWeekDay(jd) {
                if(!arguments.length) var jd = mkjd();
                return (Math.floor(jd) + 2) % 7;
            }//getWeek


            /*
             * function         : isLeapYear
             * input            : float julianday
             * output           : boolean
             * Description      : Returns true if leapyear else false
             * Scope            : public
             */
            function isLeapYear(jd) {
                if(!arguments.length) var jd = mkjd();
                var year = jd2date(jd)["year"];
                return (year % 100 == 0 && year % 400 != 0) ? false : (year % 4 == 0) ? true : false;
            }//isLeapYear


            /*
             * function         : validDate
             * input            : integer year, integer month, integer day
             * output           : boolean
             * Description      : returns true if inputdate is valid - else false.
             * Scope            : public
             */
            function validDate(year,month,day) {
                var arr = jd2date(mkjd(year,month,day));
                if( arr[ "year" ] == year && arr[ "day" ] == day && arr[ "month" ] == month ) return true;
                else return false;
            }//validDate


        /*=================================================================
        FUNCTIONS FOR CALCULATING holidayS
        =================================================================*/


            /*
             * function         : getEaster
             * input            : float julianday
             * output           : float julianday
             * Description      : return julianday corresponding to easter for input day
             *                  : this algorith will only yel correct easterdates within
             *                  : the gregorian calender. That is year > 1583
             * Scope            : public
             */
            function getEaster(jd) {
                if(!arguments.length) var jd = mkjd();
                var year = jd2date(jd)["year"];
                var a = year % 19;
                var b = Math.floor(year / 100);
                var c = year % 100;
                var d = Math.floor(b / 4);
                var e = b % 4;
                var f = Math.floor((b + 8) / 25);
                var g = Math.floor((b - f + 1) / 3);
                var h = (19 * a + b - d - g + 15) % 30;
                var i = Math.floor(c / 4);
                var j = c % 4;
                var k = (32 + 2 * e + 2 * i - h - j) % 7;
                var l = Math.floor((a + 11 * h + 22 * k) / 451);
                var m = Math.floor((h + k - 7 * l + 114) / 31);
                var n = (h + k - 7 * l + 114) % 31;
                return mkjd(year,m,(n + 1),0,0,0);
            }//getEaster


            /*
             * function         : isholiday
             * input            : float julianday,string locale
             * output           : string holiday
             * Description      : Returns name of holiday if julianday is one according
             *                  : to the choosen locale. If not a holiday false is returned
             * Scope            : public
             */
            function isHoliDay(locale,jd) {
                try {
                    if(arguments.length == 1) var jd = mkjd();
                    return eval("isHoliDay_"+locale+"("+jd+")");
                } catch(e) {
                    //void
                }
            }//isholiday


        /*=================================================================
        FUNCTIONS FOR PRINTING CALENDARVIEWS
        =================================================================*/


            /*
             * function         : mkMonthView
             * input            : [float jd, string locale, string actionC, string actionDC]
             * output           : string calendar
             * description      : Returns a view over the selected month
             * scope            : public
             */
            function mkMonthView(jd,locale,actionC,actionDC) {
                if(!arguments.length) var jd = mkjd();
                var D = jd2date(jd);
                var todaydate = jd2date(today);
                var jdi = mkjd(D["year"],D["month"],1,0,0,0);
                var out = "<table cellpadding=\"0\" cellspacing=\"0\" class=\"calTable\"><tr>\n";
                out += "<td class=\"calCorner\">&nbsp;</td>\n";
                out += "<td class=\"calHeader\">"+sWeek[1]+"</td>\n";
                out += "<td class=\"calHeader\">"+sWeek[2]+"</td>\n";
                out += "<td class=\"calHeader\">"+sWeek[3]+"</td>\n";
                out += "<td class=\"calHeader\">"+sWeek[4]+"</td>\n";
                out += "<td class=\"calHeader\">"+sWeek[5]+"</td>\n";
                out += "<td class=\"calHeader\">"+sWeek[6]+"</td>\n";
                out += "<td class=\"calHeader\">"+sWeek[0]+"</td>\n";
                out += "</tr>\n";
                var w = 0;
                var cid = 0;
                while(D["month"] == jd2date(jdi)["month"]) {
                    if( todaydate["year"] == jd2date(jdi)["year"] &&
                        todaydate["month"] == jd2date(jdi)["month"] &&
                        todaydate["day"] == jd2date(jdi)["day"]) var tday = "today";
                    else var tday = "";

                    if(w != getWeek(jdi)) {
                        if(w != 0) out += "</tr>";
                        w = getWeek(jdi);
                        out += "<tr><td class=\"calWeek\">"+w+"</td>";
                        var i = (jd2date(jdi)["intweekday"])?jd2date(jdi)["intweekday"] - 1:6;
                        for(var c=0;c<i;c++) out += "<td class=\"calBlank\">&nbsp;</td>";
                    }//if

                    var holiday = isHoliDay(locale,jdi);
                    try {
                        if(mySpecialDays[jdi]) var mySpecialDay = mySpecialDays[jdi];
                        else var mySpecialDay = false;
                    } catch(e) {
                        var mySpecialDay = false;
                    }

                    var onclick = " onclick=\"clickedDate("+cid+");\"";

                    if(mySpecialDay) {
                        var spec = mySpecialDay.split("|");
                        out += "<td id=\"cid"+(cid++)+"\" class=\""+spec[1]+tday+"\" title=\""+spec[0]+"\""+onclick+">";
                    } else if(holiday) {
                        var spec = holiday.split("|");
                        out += "<td id=\"cid"+(cid++)+"\" class=\""+spec[1]+tday+"\" title=\""+spec[0]+"\""+onclick+">";
                    } else out += "<td id=\"cid"+(cid++)+"\" class=\"calN"+tday+"\""+onclick+">";

                    out += jd2date(jdi)["day"]+"</td>";
                    jdi++;
                }//while
                var o = jd2date(--jdi);
                var i = (o["intweekday"])?7 - o["intweekday"]:0;
                for(var c=0;c<i;c++) out += "<td class=\"calBlank\">&nbsp;</td>";
                out += "</tr></table>";
                return out;
            }//pMonthView


                /*
                 * function         : clickedDate
                 * input            : integer N
                 * output           : void
                 * description      : sets correct style on clicked element.
                 * scope            : private
                 */
                function clickedDate(N) {
                    var dato = document.getElementById("dato");
                    var maaned = jd2date(54654.5);
                    var dag = N + 1;
                    dag = dag < 10 ? '0'+dag : dag;
                    var maaned = returDato['Maaned'] == 0 ? 12 : returDato['Maaned']
                    maaned = maaned < 10 ? '0'+maaned : maaned;
                    var Aar = returDato['Aar'];
                    dato.value = dag+'-'+maaned+'-'+Aar;
                    document.getElementById("cid"+N).className = "S_"+document.getElementById("cid"+N).className;
                    for( var c=0; c < 31; c++ ) {
                        try {
                            if(c != N) document.getElementById("cid"+c).className = document.getElementById("cid"+c).className.replace("S_","");
                        } catch (e){
                            //void
                        }
                    }//for
                    document.getElementById('kalender').style.visibility = 'hidden';
                }//clickedDate


        /*=================================================================
        FUNCTIONS FOR CALCULATING SPECIAL DATES LIKE 3rd MONDAY IN MAY
        =================================================================*/
            /*
             * function         : getNWeekDay
             * input            : integer N, integer W[, integer M, integer Y]
             * output           : float jd
             * description      : get the date for the N'th weekday(W) in the month,M, and
                                  the year,Y
             * scope            : public
             */
            function getNWeekDay(N,W,M,Y) {
                if(arguments.lenght < 3) var M = jd2date(mkjd())["month"];
                if(arguments.lenght < 4) var Y = jd2date(mkjd())["year"];
                var initialjd = mkjd(Y,M,1,0,0,0);
                var counter = 0;
                do {
                    if(jd2date(initialjd)["intweekday"] == W) counter++;
                    if(N > counter) initialjd++;
                } while(N > counter && M == jd2date(initialjd)["month"]);

                if(counter == N) return initialjd;
                else return false;
            }//getNWeekDay


            /*
             * function         : prevMonth
             * input            : float jd;
             * output           : float jd;
             * description      : returns the same day in the previous month
             * scope            : public
             */
            function prevMonth(jd) {
                var D = jd2date(jd);
                while(D["month"] == jd2date(jd)["month"] || D["day"] < jd2date(jd)["day"]) jd--;
                return jd;
            }//prevMonth


            /*
             * function         : nextMonth
             * input            : float jd;
             * output           : float jd;
             * description      : returns the same day in the next month
             * scope            : public
             */
            function nextMonth(jd) {
                var D = jd2date(jd);
                D["month"] = ( D["month"] == 12 ) ? 1 : D["month"] + 1;
                if( D["month"] == 1) D["year"]++;
                jd = mkjd( D["year"], D["month"], 1 );
                while( D["month"] == jd2date(jd)["month"] && D["day"] >= jd2date(jd)["day"]) jd++;
                returDato['Maaned'] = D["month"]-1;
                returDato['Aar'] = D["year"];
                return --jd;
            }//prevMonth
