Calendar=function(firstDayOfWeek,dateStr,onSelected,onClose){
    this.activeDiv=null;
    this.currentDateEl=null;
    this.getDateStatus=null;
    this.timeout=null;
    this.onSelected=onSelected||null;
    this.onClose=onClose||null;
    this.dragging=false;
    this.hidden=false;
    this.minYear=1970;
    this.maxYear=2050;
    this.dateFormat=Calendar._TT["DEF_DATE_FORMAT"];
    this.ttDateFormat=Calendar._TT["TT_DATE_FORMAT"];
    this.isPopup=true;
    this.weekNumbers=true;
    this.firstDayOfWeek=firstDayOfWeek;
    this.showsOtherMonths=false;
    this.dateStr=dateStr;
    this.ar_days=null;
    this.showsTime=false;
    this.time24=true;
    this.yearStep=2;
    this.table=null;
    this.element=null;
    this.tbody=null;
    this.firstdayname=null;
    this.monthsCombo=null;
    this.yearsCombo=null;
    this.hilitedMonth=null;
    this.activeMonth=null;
    this.hilitedYear=null;
    this.activeYear=null;
    this.dateClicked=false;
    if (typeof Calendar._SDN=="undefined") {
        if (typeof Calendar._SDN_len == "undefined")Calendar._SDN_len=3;
        var ar=new Array();
        for (var i=8;i>0;){
            ar[--i]=Calendar._DN[i].substr(0,Calendar._SDN_len);
        }
        Calendar._SDN=ar;
        if (typeof Calendar._SMN_len=="undefined")Calendar._SMN_len=3;
        ar=new Array();
        for (var i=12;i>0;){
            ar[--i]=Calendar._MN[i].substr(0,Calendar._SMN_len);
        }
        Calendar._SMN=ar;
    }
};
Calendar._C=null;
Calendar.is_ie=( /msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent));
Calendar.is_ie5=( Calendar.is_ie && /msie 5\.0/i.test(navigator.userAgent) );
Calendar.is_opera=/opera/i.test(navigator.userAgent);
Calendar.is_khtml=/Konqueror|Safari|KHTML/i.test(navigator.userAgent);
Calendar.getAbsolutePos=function(el) {
    var SL=0, ST=0;
    var is_div=/^div$/i.test(el.tagName);
    if (is_div && el.scrollLeft)SL=el.scrollLeft;
    if (is_div && el.scrollTop)ST=el.scrollTop;
    var r={
        x: el.offsetLeft - SL,
        y: el.offsetTop - ST
    };

    if (el.offsetParent) {
        var tmp=this.getAbsolutePos(el.offsetParent);
        r.x+=tmp.x;
        r.y+=tmp.y;
    }
    return r;
};

Calendar.isRelated=function (el, evt) {
    var related=evt.relatedTarget;
    if (!related) {
        var type=evt.type;
        if (type == "mouseover") {
            related=evt.fromElement;
        } else if (type == "mouseout") {
            related=evt.toElement;
        }
    }while (related) {
    if (related == el) {
        return true;
    }
    related=related.parentNode;
}
return false;
};

Calendar.removeClass=function(el, className) {
    if (!(el && el.className)) {
        return;
    }
    var cls=el.className.split(" ");
    var ar=new Array();
    for (var i=cls.length; i>0;) {
        if (cls[--i] != className) {
            ar[ar.length]=cls[i];
        }
    }
    el.className=ar.join(" ");
};
Calendar.addClass=function(el, className) {
    Calendar.removeClass(el, className);
    el.className +=" " + className;
};

Calendar.getElement=function(ev) {
    if (Calendar.is_ie) {
        return window.event.srcElement;
    } else {
        return ev.currentTarget;
    }
};

Calendar.getTargetElement=function(ev) {
    if (Calendar.is_ie) {
        return window.event.srcElement;
    } else {
        return ev.target;
    }
};

Calendar.stopEvent=function(ev) {
    ev||(ev=window.event);
    if (Calendar.is_ie) {
        ev.cancelBubble=true;
        ev.returnValue=false;
    } else {
        ev.preventDefault();
        ev.stopPropagation();
    }
    return false;
};

Calendar.addEvent=function(el, evname, func) {
    if (el.attachEvent) {
        el.attachEvent("on" + evname, func);
    } else if (el.addEventListener) {
        el.addEventListener(evname, func, true);
    } else {
        el["on" + evname]=func;
    }
};

Calendar.removeEvent=function(el, evname, func) {
    if (el.detachEvent) {
        el.detachEvent("on" + evname, func);
    } else if (el.removeEventListener) {
        el.removeEventListener(evname, func, true);
    } else {
        el["on" + evname]=null;
    }
};

Calendar.createElement=function(type, parent) {
    var el=null;
    if (document.createElementNS) {
        el=document.createElementNS("http://www.w3.org/1999/xhtml", type);
    } else {
        el=document.createElement(type);
    }
    if (typeof parent != "undefined") {
        parent.appendChild(el);
    }
    return el;
};
Calendar._add_evs=function(el) {
    with (Calendar) {
        addEvent(el, "mouseover", dayMouseOver);
        addEvent(el, "mousedown", dayMouseDown);
        addEvent(el, "mouseout", dayMouseOut);
        if (is_ie) {
            addEvent(el, "dblclick", dayMouseDblClick);
            el.setAttribute("unselectable", true);
        }
    }
};

Calendar.findMonth=function(el) {
    if (typeof el.month != "undefined") {
        return el;
    } else if (typeof el.parentNode.month != "undefined") {
        return el.parentNode;
    }
    return null;
};

Calendar.findYear=function(el) {
    if (typeof el.year != "undefined") {
        return el;
    } else if (typeof el.parentNode.year != "undefined") {
        return el.parentNode;
    }
    return null;
};

Calendar.showMonthsCombo=function () {
    var cal=Calendar._C;
    if (!cal) {
        return false;
    }
    var cal=cal;
    var cd=cal.activeDiv;
    var mc=cal.monthsCombo;
    if (cal.hilitedMonth) {
        Calendar.removeClass(cal.hilitedMonth, "hilite");
    }
    if (cal.activeMonth) {
        Calendar.removeClass(cal.activeMonth, "active");
    }
    var mon=cal.monthsCombo.getElementsByTagName("div")[cal.date.getMonth()];
    Calendar.addClass(mon, "active");
    cal.activeMonth=mon;
    var s=mc.style;
    s.display="block";
    if (cd.navtype < 0)s.left=cd.offsetLeft + "px";
    else {
        var mcw=mc.offsetWidth;
        if (typeof mcw == "undefined")	mcw=50;
        s.left=(cd.offsetLeft + cd.offsetWidth - mcw) + "px";
    }
    s.top=(cd.offsetTop + cd.offsetHeight) + "px";
};
Calendar.showYearsCombo=function (fwd) {
    var cal=Calendar._C;
    if (!cal) {
        return false;
    }
    var cal=cal;
    var cd=cal.activeDiv;
    var yc=cal.yearsCombo;
    if (cal.hilitedYear) {
        Calendar.removeClass(cal.hilitedYear, "hilite");
    }
    if (cal.activeYear) {
        Calendar.removeClass(cal.activeYear, "active");
    }
    cal.activeYear=null;
    var Y=cal.date.getFullYear() + (fwd ? 1 : -1);
    var yr=yc.firstChild;
    var show=false;
    for (var i=12; i > 0; --i) {
        if (Y >= cal.minYear && Y <= cal.maxYear) {
            yr.firstChild.data=Y;
            yr.year=Y;
            yr.style.display="block";
            show=true;
        } else {
            yr.style.display="none";
        }
        yr=yr.nextSibling;
        Y+=fwd ? cal.yearStep : -cal.yearStep;
    }
    if (show) {
        var s=yc.style;
        s.display="block";
        if (cd.navtype < 0)s.left=cd.offsetLeft + "px";
        else {
            var ycw=yc.offsetWidth;
            if (typeof ycw == "undefined")ycw=50;
            s.left=(cd.offsetLeft+cd.offsetWidth - ycw) + "px";
        }
        s.top=(cd.offsetTop + cd.offsetHeight) + "px";
    }
};

Calendar.tableMouseUp=function(ev) {
    var cal=Calendar._C;
    if (!cal) {
        return false;
    }
    if (cal.timeout) {
        clearTimeout(cal.timeout);
    }
    var el=cal.activeDiv;
    if (!el) {
        return false;
    }
    var target=Calendar.getTargetElement(ev);
    ev||(ev=window.event);
    Calendar.removeClass(el, "active");
    if (target == el||target.parentNode==el) {
        Calendar.cellClick(el, ev);
    }
    var mon=Calendar.findMonth(target);
    var date=null;
    if (mon) {
        date=new Date(cal.date);
        if (mon.month != date.getMonth()) {
            date.setMonth(mon.month);
            cal.setDate(date);
            cal.dateClicked=false;
            cal.callHandler();
        }
    } else {
    var year=Calendar.findYear(target);
    if (year) {
        date=new Date(cal.date);
        if (year.year != date.getFullYear()) {
            date.setFullYear(year.year);
            cal.setDate(date);
            cal.dateClicked=false;
            cal.callHandler();
        }
    }
}
with (Calendar) {
    removeEvent(document, "mouseup", tableMouseUp);
    removeEvent(document, "mouseover", tableMouseOver);
    removeEvent(document, "mousemove", tableMouseOver);
    cal._hideCombos();
    _C=null;
    return stopEvent(ev);
    }
};

Calendar.tableMouseOver=function (ev) {
    var cal=Calendar._C;
    if (!cal) {
        return;
    }
    var el=cal.activeDiv;
    var target=Calendar.getTargetElement(ev);
    if (target == el||target.parentNode == el) {
        Calendar.addClass(el, "hilite active");
        Calendar.addClass(el.parentNode, "rowhilite");
    } else {
        if (typeof el.navtype == "undefined"||(el.navtype != 50 && (el.navtype == 0||Math.abs(el.navtype) > 2)))Calendar.removeClass(el, "active");
        Calendar.removeClass(el, "hilite");
        Calendar.removeClass(el.parentNode, "rowhilite");
    }
    ev||(ev=window.event);
    if (el.navtype == 50 && target != el) {
        var pos=Calendar.getAbsolutePos(el);
        var w=el.offsetWidth;
        var x=ev.clientX;
        var dx;
        var decrease=true;
        if (x > pos.x + w) {
            dx=x - pos.x - w;
            decrease=false;
        } else	dx=pos.x - x;
        if (dx < 0) dx=0;
        var range=el._range;
        var current=el._current;
        var count=Math.floor(dx / 10) % range.length;
        for (var i=range.length; --i >= 0;) if (range[i] == current)	break;while (count-- > 0)if (decrease) {
            if (--i < 0) i=range.length - 1;
        } else if ( ++i >= range.length )	i=0;
        var newval=range[i];
        el.firstChild.data=newval;
        cal.onUpdateTime();
    }
    var mon=Calendar.findMonth(target);
    if (mon) {
        if (mon.month != cal.date.getMonth()) {
            if (cal.hilitedMonth) {
                Calendar.removeClass(cal.hilitedMonth, "hilite");
            }
            Calendar.addClass(mon, "hilite");
            cal.hilitedMonth=mon;
        } else if (cal.hilitedMonth) {
            Calendar.removeClass(cal.hilitedMonth, "hilite");
        }
    } else {
    if (cal.hilitedMonth) {
        Calendar.removeClass(cal.hilitedMonth, "hilite");
    }
    var year=Calendar.findYear(target);
    if (year) {
        if (year.year != cal.date.getFullYear()) {
            if (cal.hilitedYear) {
                Calendar.removeClass(cal.hilitedYear, "hilite");
            }
            Calendar.addClass(year, "hilite");
            cal.hilitedYear=year;
        } else if (cal.hilitedYear) {
            Calendar.removeClass(cal.hilitedYear, "hilite");
        }
    } else if (cal.hilitedYear) {
    Calendar.removeClass(cal.hilitedYear, "hilite");
}
}
return Calendar.stopEvent(ev);
};
Calendar.tableMouseDown=function (ev) {
    if (Calendar.getTargetElement(ev)==Calendar.getElement(ev)) {
        return Calendar.stopEvent(ev);
    }
};

Calendar.calDragIt=function (ev) {
    var cal=Calendar._C;
    if (!(cal && cal.dragging)) {
        return false;
    }
    var posX;
    var posY;
    if (Calendar.is_ie) {
        posY=window.event.clientY + document.body.scrollTop;
        posX=window.event.clientX + document.body.scrollLeft;
    } else {
        posX=ev.pageX;
        posY=ev.pageY;
    }
    cal.hideShowCovered();
    var st=cal.element.style;
    st.left=(posX - cal.xOffs) + "px";
    st.top=(posY - cal.yOffs) + "px";
    return Calendar.stopEvent(ev);
};

Calendar.calDragEnd=function (ev) {
    var cal=Calendar._C;
    if (!cal) {
        return false;
    }
    cal.dragging=false;
    with (Calendar) {
        removeEvent(document, "mousemove", calDragIt);
        removeEvent(document, "mouseup", calDragEnd);
        tableMouseUp(ev);
        }
        cal.hideShowCovered();
};

Calendar.dayMouseDown=function(ev) {
    var el=Calendar.getElement(ev);
    if (el.disabled) {
        return false;
    }
    var cal=el.calendar;
    cal.activeDiv=el;
    Calendar._C=cal;
    if (el.navtype != 300) with (Calendar) {
        if (el.navtype==50) {
            el._current=el.firstChild.data;
            addEvent(document, "mousemove", tableMouseOver);
        } else	addEvent(document, Calendar.is_ie5 ? "mousemove" : "mouseover", tableMouseOver);
        addClass(el, "hilite active");
        addEvent(document, "mouseup", tableMouseUp);
        } else if (cal.isPopup) {
        cal._dragStart(ev);
    }
    if (el.navtype==-1||el.navtype==1) {
        if (cal.timeout) clearTimeout(cal.timeout);
        cal.timeout=setTimeout("Calendar.showMonthsCombo()", 250);
    } else if (el.navtype == -2||el.navtype == 2) {
        if (cal.timeout) clearTimeout(cal.timeout);
        cal.timeout=setTimeout((el.navtype > 0) ? "Calendar.showYearsCombo(true)" : "Calendar.showYearsCombo(false)", 250);
    } else {
        cal.timeout=null;
    }
    return Calendar.stopEvent(ev);
};

Calendar.dayMouseDblClick=function(ev) {
    Calendar.cellClick(Calendar.getElement(ev), ev||window.event);
    if (Calendar.is_ie) {
        document.selection.empty();
    }
};

Calendar.dayMouseOver=function(ev) {
    var el=Calendar.getElement(ev);
    if (Calendar.isRelated(el, ev)||Calendar._C||el.disabled) {
        return false;
    }
    if (el.ttip) {
        if (el.ttip.substr(0, 1) == "_") {
            el.ttip=el.caldate.print(el.calendar.ttDateFormat) + el.ttip.substr(1);
        }
        el.calendar.tooltips.firstChild.data=el.ttip;
    }
    if (el.navtype != 300) {
        Calendar.addClass(el, "hilite");
        if (el.caldate) {
            Calendar.addClass(el.parentNode, "rowhilite");
        }
    }
    return Calendar.stopEvent(ev);
};

Calendar.dayMouseOut=function(ev) {
    with (Calendar)

    {
        var el=getElement(ev);
        if (isRelated(el, ev)||_C||el.disabled) {
            return false;
        }
        removeClass(el, "hilite");
        if (el.caldate) {
            removeClass(el.parentNode, "rowhilite");
        }
        el.calendar.tooltips.firstChild.data=_TT["SEL_DATE"];
        return stopEvent(ev);
        }
    };

Calendar.cellClick=function(el, ev) {
    var cal=el.calendar;
    var closing=false;
    var newdate=false;
    var date=null;
    if (typeof el.navtype == "undefined") {
        Calendar.removeClass(cal.currentDateEl, "selected");
        Calendar.addClass(el, "selected");
        closing=(cal.currentDateEl == el);
        if (!closing) {
            cal.currentDateEl=el;
        }
        cal.date=new Date(el.caldate);
        date=cal.date;
        newdate=true;
        if (!(cal.dateClicked=!el.otherMonth))cal._init(cal.firstDayOfWeek, date);
    } else {
        if (el.navtype == 200) {
            Calendar.removeClass(el, "hilite");
            cal.callCloseHandler();
            return;
        }
        date=(el.navtype==0) ? new Date() : new Date(cal.date);
        cal.dateClicked=false;
        var year=date.getFullYear();
        var mon=date.getMonth();
        function setMonth(m) {
            var day=date.getDate();
            var max=date.getMonthDays(m);
            if (day > max) {
                date.setDate(max);
            }
            date.setMonth(m);
        };
        switch (el.navtype) {
            case 400:
                Calendar.removeClass(el, "hilite");
                var text=Calendar._TT["ABOUT"];
                if (typeof text!="undefined") {
                text+=cal.showsTime ? Calendar._TT["ABOUT_TIME"] : "";
            }
            else {
                text="Help and about box text is not translated into this language.\n" + "If you know this language and you feel generous please update\n" + "the corresponding file in \"lang\" subdir to match calendar-en.js\n" + "and send it back to <mishoo@infoiasi.ro> to get it into the distribution  ;-)\n\n" +	"Thank you!\n" + "http://dynarch.com/mishoo/calendar.epl\n";
            }
            alert(text);
                return;
            case -2:
                if (year > cal.minYear) {
                date.setFullYear(year - 1);
            }
            break;
            case -1:
                if (mon > 0) {
                setMonth(mon - 1);
            } else if (year-- > cal.minYear) {
                date.setFullYear(year);
                setMonth(11);
            }
            break;
            case 1:
                if (mon < 11) {
                setMonth(mon + 1);
            } else if (year < cal.maxYear) {
                date.setFullYear(year + 1);
                setMonth(0);
            }
            break;
            case 2:
                if (year < cal.maxYear) {
                date.setFullYear(year + 1);
            }
            break;
            case 100:
                cal.setFirstDayOfWeek(el.fdow);
                return;
            case 50:
                var range=el._range;
                var current=el.firstChild.data;
                for (var i=range.length; --i >= 0;)if (range[i] == current) break;	if (ev && ev.shiftKey) {
                if (--i < 0) i=range.length - 1;
            } else if ( ++i >= range.length )i=0;
                var newval=range[i];
                el.firstChild.data=newval;
                cal.onUpdateTime();
                return;
            case 0:
                if ((typeof cal.getDateStatus == "function") && cal.getDateStatus(date, date.getFullYear(), date.getMonth(), date.getDate())) {
                return false;
            }
            break;
        }
        if (!date.equalsTo(cal.date)) {
            cal.setDate(date);
            newdate=true;
        }
    }
    if (newdate) {
    cal.callHandler();
}
if (closing) {
    Calendar.removeClass(el, "hilite");
    cal.callCloseHandler();
}
};

Calendar.prototype.create=function (_par) {
    var parent=null;
    if (! _par) {
        parent=document.getElementsByTagName("body")[0];
        this.isPopup=true;
    } else {
        parent=_par;
        this.isPopup=false;
    }
    this.date=this.dateStr ? new Date(this.dateStr) : new Date();
    var table=Calendar.createElement("table");
    this.table=table;
    table.cellSpacing=0;
    table.cellPadding=0;
    table.calendar=this;
    Calendar.addEvent(table, "mousedown", Calendar.tableMouseDown);
    var div=Calendar.createElement("div");
    this.element=div;
    div.className="calendar";
    if (this.isPopup) {
        div.style.position="absolute";
        div.style.display="none";
    }
    div.appendChild(table);
    var thead=Calendar.createElement("thead", table);
    var cell=null;
    var row=null;
    var cal=this;
    var hh=function (text, cs, navtype) {
        cell=Calendar.createElement("td", row);
        cell.colSpan=cs;
        cell.className="button";
        if (navtype != 0 && Math.abs(navtype) <= 2)cell.className+=" nav";
        Calendar._add_evs(cell);
        cell.calendar=cal;
        cell.navtype=navtype;
        if (text.substr(0, 1) != "&") {
            cell.appendChild(document.createTextNode(text));
        }
        else {
            cell.innerHTML=text;
        }
        return cell;
    };
    row=Calendar.createElement("tr", thead);
    var title_length=6;
    (this.isPopup) && --title_length;
    (this.weekNumbers) && ++title_length;
    hh("?", 1, 400).ttip=Calendar._TT["INFO"];
    this.title=hh("", title_length, 300);
    this.title.className="title";
    if (this.isPopup) {
        this.title.ttip=Calendar._TT["DRAG_TO_MOVE"];
        this.title.style.cursor="move";
        hh("&#x00d7;", 1, 200).ttip=Calendar._TT["CLOSE"];
    }
    row=Calendar.createElement("tr", thead);
    row.className="headrow";
    this._nav_py=hh("&#x00ab;", 1, -2);
    this._nav_py.ttip=Calendar._TT["PREV_YEAR"];
    this._nav_pm=hh("&#x2039;", 1, -1);
    this._nav_pm.ttip=Calendar._TT["PREV_MONTH"];
    this._nav_now=hh(Calendar._TT["TODAY"], this.weekNumbers ? 4 : 3, 0);
    this._nav_now.ttip=Calendar._TT["GO_TODAY"];
    this._nav_nm=hh("&#x203a;", 1, 1);
    this._nav_nm.ttip=Calendar._TT["NEXT_MONTH"];
    this._nav_ny=hh("&#x00bb;", 1, 2);
    this._nav_ny.ttip=Calendar._TT["NEXT_YEAR"];
    row=Calendar.createElement("tr", thead);
    row.className="daynames";
    if (this.weekNumbers) {
        cell=Calendar.createElement("td", row);
        cell.className="name wn";
        cell.appendChild(document.createTextNode(Calendar._TT["WK"]));
    }
    for (var i=7; i > 0; --i) {
        cell=Calendar.createElement("td", row);
        cell.appendChild(document.createTextNode(""));
        if (!i) {
            cell.navtype=100;
            cell.calendar=this;
            Calendar._add_evs(cell);
        }
    }
    this.firstdayname=(this.weekNumbers) ? row.firstChild.nextSibling : row.firstChild;
    this._displayWeekdays();
    var tbody=Calendar.createElement("tbody", table);
    this.tbody=tbody;
    for (i=6; i > 0; --i) {
    row=Calendar.createElement("tr", tbody);
    if (this.weekNumbers) {
        cell=Calendar.createElement("td", row);
        cell.appendChild(document.createTextNode(""));
    }
    for (var j=7; j > 0; --j) {
        cell=Calendar.createElement("td", row);
        cell.appendChild(document.createTextNode(""));
        cell.calendar=this;
        Calendar._add_evs(cell);
    }
    }
    if (this.showsTime) {
    row=Calendar.createElement("tr", tbody);
    row.className="time";
    cell=Calendar.createElement("td", row);
    cell.className="time";
    cell.colSpan=2;
    cell.innerHTML=Calendar._TT["TIME"]||"&nbsp;";
    cell=Calendar.createElement("td", row);
    cell.className="time";
    cell.colSpan=this.weekNumbers ? 4 : 3;
    (function(){
        function makeTimePart(className, init, range_start, range_end) {
            var part=Calendar.createElement("span", cell);
            part.className=className;
            part.appendChild(document.createTextNode(init));
            part.calendar=cal;
            part.ttip=Calendar._TT["TIME_PART"];
            part.navtype=50;
            part._range=[];
            if (typeof range_start != "number")	part._range=range_start;
            else {
                for (var i=range_start; i<=range_end; ++i) {
                    var txt;
                    if (i<10 && range_end>=10) txt='0' + i;else txt='' + i;
                    part._range[part._range.length]=txt;
                }
                }
                Calendar._add_evs(part);
        return part;
    };

    var hrs=cal.date.getHours();
        var mins=cal.date.getMinutes();
        var t12=!cal.time24;
        var pm=(hrs > 12);
        if (t12 && pm) hrs-=12;
        var H=makeTimePart("hour", hrs, t12 ? 1 : 0, t12 ? 12 : 23);
        var span=Calendar.createElement("span", cell);
        span.appendChild(document.createTextNode(":"));
        span.className="colon";
        var M=makeTimePart("minute", mins, 0, 59);
        var AP=null;
        cell=Calendar.createElement("td", row);
        cell.className="time";
        cell.colSpan=2;
        if (t12) AP=makeTimePart("ampm", pm ? "pm" : "am", ["am", "pm"]);else cell.innerHTML="&nbsp;";
        cal.onSetTime=function() {
        var hrs=this.date.getHours();
        var mins=this.date.getMinutes();
        var pm=(hrs > 12);
        if (pm && t12) hrs-=12;
        H.firstChild.data=(hrs < 10) ? ("0" + hrs) : hrs;
        M.firstChild.data=(mins < 10) ? ("0" + mins) : mins;
        if (t12)	AP.firstChild.data=pm ? "pm" : "am";
    };

    cal.onUpdateTime=function() {
        var date=this.date;
        var h=parseInt(H.firstChild.data, 10);
        if (t12) {
            if (/pm/i.test(AP.firstChild.data) && h < 12)h+=12;
            else if (/am/i.test(AP.firstChild.data) && h==12) h=0;
        }
        var d=date.getDate();
        var m=date.getMonth();
        var y=date.getFullYear();
        date.setHours(h);
        date.setMinutes(parseInt(M.firstChild.data, 10));
        date.setFullYear(y);
        date.setMonth(m);
        date.setDate(d);
        this.dateClicked=false;
        this.callHandler();
    };

})();
} else {
    this.onSetTime=this.onUpdateTime=function() {};

}
var tfoot=Calendar.createElement("tfoot", table);
row=Calendar.createElement("tr", tfoot);
row.className="footrow";
cell=hh(Calendar._TT["SEL_DATE"], this.weekNumbers ? 8 : 7, 300);
cell.className="ttip";
if (this.isPopup) {
    cell.ttip=Calendar._TT["DRAG_TO_MOVE"];
    cell.style.cursor="move";
}
this.tooltips=cell;
div=Calendar.createElement("div", this.element);
this.monthsCombo=div;
div.className="combo";
for (i=0; i<Calendar._MN.length; ++i) {
    var mn=Calendar.createElement("div");
    mn.className=Calendar.is_ie ? "label-IEfix" : "label";
    mn.month=i;
    mn.appendChild(document.createTextNode(Calendar._SMN[i]));
    div.appendChild(mn);
}
div=Calendar.createElement("div", this.element);
this.yearsCombo=div;
div.className="combo";
for (i=12; i > 0; --i) {
    var yr=Calendar.createElement("div");
    yr.className=Calendar.is_ie ? "label-IEfix" : "label";
    yr.appendChild(document.createTextNode(""));
    div.appendChild(yr);
}
this._init(this.firstDayOfWeek, this.date);
parent.appendChild(this.element);
};

Calendar._keyEvent=function(ev) {
    if (!window.calendar) {
        return false;
    }(Calendar.is_ie) && (ev=window.event);
    var cal=window.calendar;
    var act=(Calendar.is_ie||ev.type == "keypress");
    if (ev.ctrlKey) {
        switch (ev.keyCode) {
            case 37:
                act && Calendar.cellClick(cal._nav_pm);
                break;
            case 38:
                act && Calendar.cellClick(cal._nav_py);
                break;
            case 39:
                act && Calendar.cellClick(cal._nav_nm);
                break;
            case 40:
                act && Calendar.cellClick(cal._nav_ny);
                break;
            default:
                return false;
        }
    } else switch (ev.keyCode) {
    case 32:
        Calendar.cellClick(cal._nav_now);
        break;
    case 27:
        act && cal.callCloseHandler();
        break;
    case 37: case 38:case 39:case 40:
        if (act) {
        var date=cal.date.getDate() - 1;
        var el=cal.currentDateEl;
        var ne=null;
        var prev=(ev.keyCode==37)||(ev.keyCode==38);
        switch (ev.keyCode) {
            case 37:
                (--date >= 0) && (ne=cal.ar_days[date]);
                break;
            case 38:
                date-=7;
                (date >= 0) && (ne=cal.ar_days[date]);
                break;
            case 39:
                (++date < cal.ar_days.length) && (ne=cal.ar_days[date]);
                break;
            case 40:
                date+=7;
                (date < cal.ar_days.length) && (ne=cal.ar_days[date]);
                break;
        }
        if (!ne) {
            if (prev) {
                Calendar.cellClick(cal._nav_pm);
            } else {
                Calendar.cellClick(cal._nav_nm);
            }
            date=(prev) ? cal.date.getMonthDays() : 1;
            el=cal.currentDateEl;
            ne=cal.ar_days[date - 1];
        }
        Calendar.removeClass(el, "selected");
        Calendar.addClass(ne, "selected");
        cal.date=new Date(ne.caldate);
        cal.callHandler();
        cal.currentDateEl=ne;
    }
    break;
    case 13:
        if (act) {
        cal.callHandler();
        cal.hide();
    }
    break;
    default:
        return false;
}
return Calendar.stopEvent(ev);
};

Calendar.prototype._init=function (firstDayOfWeek, date) {
    var today=new Date();
    this.table.style.visibility="hidden";
    var year=date.getFullYear();
    if (year < this.minYear) {
        year=this.minYear;
        date.setFullYear(year);
    } else if (year > this.maxYear) {
        year=this.maxYear;
        date.setFullYear(year);
    }
    this.firstDayOfWeek=firstDayOfWeek;
    this.date=new Date(date);
    var month=date.getMonth();
    var mday=date.getDate();
    var no_days=date.getMonthDays();
    date.setDate(1);
    var day1=(date.getDay() - this.firstDayOfWeek) % 7;
    if (day1 < 0)day1+=7;
    date.setDate(-day1);
    date.setDate(date.getDate() + 1);
    var row=this.tbody.firstChild;
    var MN=Calendar._SMN[month];
    var ar_days=new Array();
    var weekend=Calendar._TT["WEEKEND"];
    for (var i=0; i < 6; ++i, row=row.nextSibling) {
        var cell=row.firstChild;
        if (this.weekNumbers) {
            cell.className="day wn";
            cell.firstChild.data=date.getWeekNumber();
            cell=cell.nextSibling;
        }
        row.className="daysrow";
        var hasdays=false;
        for (var j=0; j < 7; ++j, cell=cell.nextSibling, date.setDate(date.getDate()+1)) {
            var iday=date.getDate();
            var wday=date.getDay();
            cell.className="day";
            var current_month=(date.getMonth() == month);
            if (!current_month) {
                if (this.showsOtherMonths) {
                    cell.className+=" othermonth";
                    cell.otherMonth=true;
                } else {
                    cell.className="emptycell";
                    cell.innerHTML="&nbsp;";
                    cell.disabled=true;
                    continue;
                }
            } else {
            cell.otherMonth=false;
            hasdays=true;
        }
        cell.disabled=false;
        cell.firstChild.data=iday;
        if (typeof this.getDateStatus == "function") {
            var status=this.getDateStatus(date, year, month, iday);
            if (status == true) {
                cell.className +=" disabled";
                cell.disabled=true;
            } else {
                if (/disabled/i.test(status))	cell.disabled=true;
                cell.className+=" " + status;
            }
        }
        if (!cell.disabled) {
            ar_days[ar_days.length]=cell;
            cell.caldate=new Date(date);
            cell.ttip="_";
            if (current_month && iday == mday) {
                cell.className+=" selected";
                this.currentDateEl=cell;
            }
            if (date.getFullYear() == today.getFullYear() && date.getMonth() == today.getMonth() && iday==today.getDate()) {
                cell.className+=" today";
                cell.ttip+=Calendar._TT["PART_TODAY"];
            }
            if (weekend.indexOf(wday.toString()) != -1) {
                cell.className+=cell.otherMonth ? " oweekend" : " weekend";
            }
        }
    }
if (!(hasdays||this.showsOtherMonths))row.className="emptyrow";
}
this.ar_days=ar_days;
this.title.firstChild.data=Calendar._MN[month] + ", " + year;
this.onSetTime();
this.table.style.visibility="visible";
};

Calendar.prototype.setDate=function (date) {
    if (!date.equalsTo(this.date)) {
        this._init(this.firstDayOfWeek, date);
    }
};

Calendar.prototype.refresh=function () {
    this._init(this.firstDayOfWeek, this.date);
};

Calendar.prototype.setFirstDayOfWeek=function (firstDayOfWeek) {
    this._init(firstDayOfWeek, this.date);
    this._displayWeekdays();
};

Calendar.prototype.setDateStatusHandler=Calendar.prototype.setDisabledHandler=function (unaryFunction) {
    this.getDateStatus=unaryFunction;
};

Calendar.prototype.setRange=function (a, z) {
    this.minYear=a;
    this.maxYear=z;
};

Calendar.prototype.callHandler=function () {
    if (this.onSelected) {
        if(dateControl(this.date)){
            this.onSelected(this, this.date.print(this.dateFormat));
        }
    }

};

Calendar.prototype.callCloseHandler=function () {
    if (this.onClose) {
        this.onClose(this);
    }
    this.hideShowCovered();
};

Calendar.prototype.destroy=function () {
    var el=this.element.parentNode;
    el.removeChild(this.element);
    Calendar._C=null;
    window.calendar=null;
};

Calendar.prototype.reparent=function (new_parent) {
    var el=this.element;
    el.parentNode.removeChild(el);
    new_parent.appendChild(el);
};
Calendar._checkCalendar=function(ev) {
    if (!window.calendar) {
        return false;
    }
    var el=Calendar.is_ie ? Calendar.getElement(ev) : Calendar.getTargetElement(ev);
    for (; el != null && el!=calendar.element;el=el.parentNode);
    if (el == null) {
        window.calendar.callCloseHandler();
        return Calendar.stopEvent(ev);
    }
};

Calendar.prototype.show=function () {
    var rows=this.table.getElementsByTagName("tr");
    for (var i=rows.length; i > 0;) {
        var row=rows[--i];
        Calendar.removeClass(row, "rowhilite");
        var cells=row.getElementsByTagName("td");
        for (var j=cells.length; j > 0;) {
            var cell=cells[--j];
            Calendar.removeClass(cell, "hilite");
            Calendar.removeClass(cell, "active");
        }
        }
        this.element.style.display="block";
this.hidden=false;
if (this.isPopup) {
    window.calendar=this;
    Calendar.addEvent(document, "keydown", Calendar._keyEvent);
    Calendar.addEvent(document, "keypress", Calendar._keyEvent);
    Calendar.addEvent(document, "mousedown", Calendar._checkCalendar);
}
this.hideShowCovered();
};

Calendar.prototype.hide=function () {
    if (this.isPopup) {
        Calendar.removeEvent(document, "keydown", Calendar._keyEvent);
        Calendar.removeEvent(document, "keypress", Calendar._keyEvent);
        Calendar.removeEvent(document, "mousedown", Calendar._checkCalendar);
    }
    this.element.style.display="none";
    this.hidden=true;
    this.hideShowCovered();
};

Calendar.prototype.showAt=function (x, y) {
    var s=this.element.style;
    s.left=x + "px";
    s.top=y + "px";
    this.show();
};

Calendar.prototype.showAtElement=function (el, opts) {
    var self=this;
    var p=Calendar.getAbsolutePos(el);
    if (!opts||typeof opts != "string") {
        this.showAt(p.x, p.y + el.offsetHeight);
        return true;
    }
    function fixPosition(box) {
        if (box.x < 0)	box.x=0;
        if (box.y < 0)box.y=0;
        var cp=document.createElement("div");
        var s=cp.style;
        s.position="absolute";
        s.right=s.bottom=s.width=s.height="0px";
        document.body.appendChild(cp);
        var br=Calendar.getAbsolutePos(cp);
        document.body.removeChild(cp);
        if (Calendar.is_ie) {
            br.y+=document.body.scrollTop;
            br.x+=document.body.scrollLeft;
        } else {
            br.y+=window.scrollY;
            br.x+=window.scrollX;
        }
        var tmp=box.x + box.width - br.x;
        if (tmp > 0) box.x -=tmp;
        tmp=box.y + box.height - br.y;
        if (tmp>0) box.y-=tmp;
    };

    this.element.style.display="block";
    Calendar.continuation_for_the_fucking_khtml_browser=function() {
        var w=self.element.offsetWidth;
        var h=self.element.offsetHeight;
        self.element.style.display="none";
        var valign=opts.substr(0, 1);
        var halign="l";
        if (opts.length > 1) {
            halign=opts.substr(1, 1);
        }
        switch (valign) {
            case "T":
                p.y -=h;
                break;
            case "B":
                p.y+=el.offsetHeight;
                break;
            case "C":
                p.y+=(el.offsetHeight - h) / 2;
                break
            ;
            case "t":
                p.y+=el.offsetHeight - h;
                break;
            case "b":
                break;
        }
        switch (halign) {
            case "L":
                p.x-=w;
                break;
            case "R":
                p.x+=el.offsetWidth;
                break;
            case "C":
                p.x+=(el.offsetWidth - w) / 2;
                break;
            case "r":
                p.x+=el.offsetWidth - w;
                break;
            case "l":
                break;
        }
        p.width=w;
        p.height=h+40;
        self.monthsCombo.style.display="none";
        fixPosition(p);
        self.showAt(p.x, p.y);
    };

    if (Calendar.is_khtml)setTimeout("Calendar.continuation_for_the_fucking_khtml_browser()", 10);else Calendar.continuation_for_the_fucking_khtml_browser();
};

Calendar.prototype.setDateFormat=function (str) {
    this.dateFormat=str;
};

Calendar.prototype.setTtDateFormat=function (str) {
    this.ttDateFormat=str;
};

Calendar.prototype.parseDate=function (str, fmt) {
    var y=0;
    var m=-1;
    var d=0;
    var a=str.split(/\W+/);
    if (!fmt) {
        fmt=this.dateFormat;
    }
    var b=fmt.match(/%./g);
    var i=0, j=0;
    var hr=0;
    var min=0;
    for (i=0; i<a.length; ++i) {
        if (!a[i]) continue;
        switch (b[i]) {
            case "%d":case "%e":
                d=parseInt(a[i], 10);
                break;
            case "%m":
                m=parseInt(a[i], 10) - 1;
                break;
            case "%Y":case "%y":
                y=parseInt(a[i], 10);
                (y<100) && (y +=(y > 29) ? 1900 : 2000);
                break;
            case "%b":case "%B":
                for (j=0; j<12; ++j) {
                if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) {
                    m=j;
                    break;
                }
            }
            break;
        case "%H":case "%I":case "%k":
        case "%l":
            hr=parseInt(a[i], 10);
            break;
        case "%P": case "%p":
            if (/pm/i.test(a[i]) && hr < 12)hr+=12;
            break;
        case "%M":
            min=parseInt(a[i], 10);
            break;
    }
    }
    if (y!=0 && m!=-1 && d!=0) {
    this.setDate(new Date(y, m, d, hr, min, 0));
    return;
}
y=0;
m=-1;
d=0;
for (i=0; i < a.length; ++i) {
    if (a[i].search(/[a-zA-Z]+/)!=-1) {
        var t=-1;
        for (j=0; j<12; ++j) {
            if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) {
                t=j;
                break;
            }
        }
        if (t != -1) {
        if (m != -1) {
            d=m+1;
        }
        m=t;
    }
} else if (parseInt(a[i], 10) <= 12 && m == -1) {
    m=a[i]-1;
} else if (parseInt(a[i], 10) > 31 && y==0) {
    y=parseInt(a[i], 10);
    (y<100) && (y+=(y > 29) ? 1900 : 2000);
} else if (d==0) {
    d=a[i];
}
}
if (y == 0) {
    var today=new Date();
    y=today.getFullYear();
}
if (m != -1 && d != 0) {
    this.setDate(new Date(y, m, d, hr, min, 0));
}
};

Calendar.prototype.hideShowCovered=function () {
    var self=this;
    Calendar.continuation_for_the_fucking_khtml_browser=function() {
        function getVisib(obj){
            var value=obj.style.visibility;
            if (!value) {
                if (document.defaultView && typeof (document.defaultView.getComputedStyle)=="function") {
                    if (!Calendar.is_khtml)	value=document.defaultView.	getComputedStyle(obj, ""). getPropertyValue("visibility");else	value='';
                } else if (obj.currentStyle) {
                    value=obj.currentStyle.visibility;
                } else	value='';
            }
            return value;
        };

        var tags=new Array("applet", "iframe", "select");
        var el=self.element;
        var p=Calendar.getAbsolutePos(el);
        var EX1=p.x;
        var EX2=el.offsetWidth+EX1;
        var EY1=p.y;
        var EY2=el.offsetHeight+EY1;
        for (var k=tags.length; k>0; ) {
            var ar=document.getElementsByTagName(tags[--k]);
            var cc=null;
            for (var i=ar.length; i > 0;) {
                cc=ar[--i];
                p=Calendar.getAbsolutePos(cc);
                var CX1=p.x;
                var CX2=cc.offsetWidth + CX1;
                var CY1=p.y;
                var CY2=cc.offsetHeight+CY1;
                if (self.hidden||(CX1 > EX2)||(CX2 < EX1)||(CY1 > EY2)||(CY2 < EY1)) {
                    if (!cc.__msh_save_visibility) {
                        cc.__msh_save_visibility=getVisib(cc);
                    }
                    cc.style.visibility=cc.__msh_save_visibility;
                } else {
                    if (!cc.__msh_save_visibility) {
                        cc.__msh_save_visibility=getVisib(cc);
                    }
                    cc.style.visibility="hidden";
                }
            }
            }
        };

if (Calendar.is_khtml)setTimeout("Calendar.continuation_for_the_fucking_khtml_browser()", 10);else Calendar.continuation_for_the_fucking_khtml_browser();
};

Calendar.prototype._displayWeekdays=function () {
    var fdow=this.firstDayOfWeek;
    var cell=this.firstdayname;
    var weekend=Calendar._TT["WEEKEND"];
    for (var i=0; i<7; ++i) {
        cell.className="day name";
        var realday=(i+fdow) % 7;
        if (i) {
            cell.ttip=Calendar._TT["DAY_FIRST"].replace("%s", Calendar._DN[realday]);
            cell.navtype=100;
            cell.calendar=this;
            cell.fdow=realday;
            Calendar._add_evs(cell);
        }
        if (weekend.indexOf(realday.toString())!=-1) {
            Calendar.addClass(cell, "weekend");
        }
        cell.firstChild.data=Calendar._SDN[(i + fdow) % 7];
        cell=cell.nextSibling;
    }
    };

Calendar.prototype._hideCombos=function () {
    this.monthsCombo.style.display="none";
    this.yearsCombo.style.display="none";
};

Calendar.prototype._dragStart=function (ev) {
    if (this.dragging) {
        return;
    }
    this.dragging=true;
    var posX;
    var posY;
    if (Calendar.is_ie) {
        posY=window.event.clientY + document.body.scrollTop;
        posX=window.event.clientX + document.body.scrollLeft;
    } else {
        posY=ev.clientY + window.scrollY;
        posX=ev.clientX + window.scrollX;
    }
    var st=this.element.style;
    this.xOffs=posX-parseInt(st.left);
    this.yOffs=posY-parseInt(st.top);
    with (Calendar) {
        addEvent(document, "mousemove", calDragIt);
        addEvent(document, "mouseup", calDragEnd);
        }
    };

Date._MD=new Array(31,28,31,30,31,30,31,31,30,31,30,31);
Date.SECOND=1000;
Date.MINUTE=60*Date.SECOND;
Date.HOUR=60*Date.MINUTE;
Date.DAY=24*Date.HOUR;
Date.WEEK=7*Date.DAY;
Date.prototype.getMonthDays=function(month) {
    var year=this.getFullYear();
    if (typeof month=="undefined") {
        month=this.getMonth();
    }
    if (((0==(year%4)) && ( (0!=(year%100))||(0==(year%400)))) && month==1) {
        return 29;
    } else {
        return Date._MD[month];
    }
};

Date.prototype.getDayOfYear=function() {
    var now=new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);
    var then=new Date(this.getFullYear(), 0, 0, 0, 0, 0);
    var time=now - then;
    return Math.floor(time / Date.DAY);
};

Date.prototype.getWeekNumber=function() {
    var d=new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);
    var DoW=d.getDay();
    d.setDate(d.getDate() - (DoW + 6) % 7 + 3);
    var ms=d.valueOf();
    d.setMonth(0);
    d.setDate(4);
    return Math.round((ms - d.valueOf()) / (7 * 864e5)) + 1;
};

Date.prototype.equalsTo=function(date) {
    return ((this.getFullYear() == date.getFullYear()) &&	(this.getMonth() == date.getMonth()) &&	(this.getDate()==date.getDate()) && (this.getHours()==date.getHours()) &&	(this.getMinutes()==date.getMinutes()));
};

Date.prototype.print=function (str) {
    var m=this.getMonth();
    var d=this.getDate();
    var y=this.getFullYear();
    var wn=this.getWeekNumber();
    var w=this.getDay();
    var s={};

    var hr=this.getHours();
    var pm=(hr>=12);
    var ir=(pm) ? (hr-12) : hr;
    var dy=this.getDayOfYear();
    if (ir==0)ir=12;
    var min=this.getMinutes();
    var sec=this.getSeconds();
    s["%a"]=Calendar._SDN[w];
    s["%A"]=Calendar._DN[w];
    s["%b"]=Calendar._SMN[m];
    s["%B"]=Calendar._MN[m];
    s["%C"]=1+Math.floor(y / 100);
    s["%d"]=(d < 10) ? ("0" + d) : d;
    s["%e"]=d;
    s["%H"]=(hr < 10) ? ("0" + hr) : hr;
    s["%I"]=(ir < 10) ? ("0" + ir) : ir;
    s["%j"]=(dy < 100) ? ((dy < 10) ? ("00" + dy) : ("0" + dy)) : dy;
    s["%k"]=hr;
    s["%l"]=ir;
    s["%m"]=(m < 9) ? ("0" + (1+m)) : (1+m);
    s["%M"]=(min<10) ? ("0" + min) : min;
    s["%n"]="\n";
    s["%p"]=pm ? "PM" : "AM";
    s["%P"]=pm ? "pm" : "am";
    s["%s"]=Math.floor(this.getTime() / 1000);
    s["%S"]=(sec<10) ? ("0" + sec) : sec;
    s["%t"]="\t";
    s["%U"]=s["%W"]=s["%V"]=(wn < 10) ? ("0" + wn) : wn;
    s["%u"]=w + 1;
    s["%w"]=w;
    s["%y"]=('' + y).substr(2, 2);
    s["%Y"]=y;
    s["%%"]="%";
    var re=/%./g;
    if (!Calendar.is_ie5)return str.replace(re, function (par) {
        return s[par]||par;
    });
    var a=str.match(re);
    for (var i=0; i < a.length; i++) {
        var tmp=s[a[i]];
        if (tmp) {
            re=new RegExp(a[i], 'g');
            str=str.replace(re, tmp);
        }
    }
    return str;
};

Date.prototype.__msh_oldSetFullYear=Date.prototype.setFullYear;
Date.prototype.setFullYear=function(y) {
    var d=new Date(this);
    d.__msh_oldSetFullYear(y);
    if (d.getMonth() != this.getMonth())this.setDate(28);
    this.__msh_oldSetFullYear(y);
};

window.calendar=null;

function dateControl(selectedDate)
{
    var today = new Date;
    today.setHours(0);
    today.setMinutes(0);
    today.setSeconds(0);
    selectedDate.setSeconds(1);
    //return (selectedDate>=today); burayla oynadık
    return true;
}
