﻿jsl.dsw = function(instanceName, divId, todayLabel, weekLabel) {
    this._container = $jslGet(divId);
    this._tb = null;
    this._headerRow = null;
    this._monthRow = null;
    this._dayTb = null;
    this._weekLabel = weekLabel;
    this._todayLabel = todayLabel;
    this._instanceName = instanceName;
    this._curtDayCell = null;
    this._dateNow = null;
    this._focusCell = null;
    this._inputObj = null;
    this._selDay = null;
    this._preDay = null;
    this._inputDay = null;
    this._startDayIdx = null;
    this._isShow = false;
    this._triggerObj = null;
    this._mouseOnWnd = false;
    this._pageBodyWidth = 0;
    this._pageBodyHeight = 0;
    
    this._initialize();
}

jsl.dsw.prototype.Show = function(obj, inBottom, getPosFuncObj, getPosFuncName) {
    var pos;
    
    if (getPosFuncName == null) {
        getPosFuncObj = jsl.bl;
        getPosFuncName = "getPanelPos";
    }
    else {
        if (getPosFuncObj == null) {
            getPosFuncObj = window;
        }
    }
    
    this._triggerObj = null;
    this._inputObj = obj;
    this._selDay = Date.jslIsValid(this._inputObj.value);
    if (this._selDay == null) {
        this._selDay = this._dateNow;
    }
    else {
        this._inputDay = this._selDay.jslClone();
    }
    
    this._NavigateToSelDay();
    
    pos = getPosFuncObj[getPosFuncName](this._inputObj, this._container, inBottom);
    this._container.style.left = pos.x + "px";
    this._container.style.top = pos.y + "px";
    jsl.rt.AddPageClicker(this, "_OnPageClick");
    this._isShow = true;
    this._pageBodyWidth = document.body.offsetWidth;
    this._pageBodyHeight = document.body.offsetHeight;
}

jsl.dsw.prototype.ShowForInput = function(obj, inBottom, getPosFuncObj, getPosFuncName) {
    this.Show(jsl.bl.getPreInput(obj), inBottom, getPosFuncObj, getPosFuncName);
    this._triggerObj = obj;
}

jsl.dsw.prototype.OnWndResizer = function() {
    if (this._pageBodyWidth != document.body.offsetWidth || this._pageBodyHeight != document.body.offsetHeight) {
        if (this._inputObj != null) {
            this._inputObj.blur();
        }
        this.Close();
    }
}

jsl.dsw.prototype.Close = function() {    
    this._container.style.left = "-2000px";
    this._container.style.top = "-2000px";
    jsl.rt.RemovePageClicker(this, "_OnPageClick");
    this._isShow = false;
    this._triggerObj = null;
    this._inputObj = null;
}

jsl.dsw.prototype._NavigateToSelDay = function() {
    var i;
    var dv = 1;
    var lnkObj;
    var rowIdx = 1;
    var cellObj;
    var monthDay = new Date(this._selDay.getFullYear(), this._selDay.getMonth(), 1);
    var maxDay = monthDay.jslClone();
    var ymMatch = false;
    
    maxDay.setMonth(monthDay.getMonth() + 1);
    maxDay.setDate(0);
    maxDay = maxDay.getDate();
    
    if (this._preDay != null) {
        this._monthRow.cells[0].getElementsByTagName("a")[this._preDay.getMonth()].style.color = "";
    }
    this._monthRow.cells[0].getElementsByTagName("a")[this._selDay.getMonth()].style.color = "red";
    
    if (this._focusCell != null) {
        this._focusCell.style.backgroundColor = "";
        this._focusCell.getElementsByTagName("a")[0].style.color = "";
        this._focusCell = null;
    }
    
    if (this._inputDay != null && this._inputDay.getFullYear() == this._selDay.getFullYear()
        && this._inputDay.getMonth() == this._selDay.getMonth()) {
        ymMatch = true;
    }
    
    if (this._preDay == null || this._preDay.getFullYear() != this._selDay.getFullYear()
        || this._preDay.getMonth() != this._selDay.getMonth()) {
        jsl.bl.setText(this._headerRow.cells[1], this._selDay.jslToString("yyyy-MM"));
        
        this._startDayIdx = monthDay.getDay();
        for (i = 0; i < this._startDayIdx; i++) {
            this._dayTb.rows[rowIdx].cells[i].getElementsByTagName("a")[0].style.display = "none";
            this._dayTb.rows[rowIdx].cells[i].getElementsByTagName("span")[0].style.display = "";
        }
        for ( ; i < 42; i++) {
            if (i % 7 == 0 && i > 0) {
                rowIdx++;
            }
            if (rowIdx >= this._dayTb.rows.length) {
                break;
            }
            cellObj = this._dayTb.rows[rowIdx].cells[i % 7];
            lnkObj = cellObj.getElementsByTagName("a")[0];
            if (dv > maxDay) {
                lnkObj.style.display = "none";
                cellObj.getElementsByTagName("span")[0].style.display = "";
            }
            else {
                jsl.bl.setText(lnkObj, dv);
                lnkObj.style.display = "";
                cellObj.getElementsByTagName("span")[0].style.display = "none";
                if (ymMatch && this._inputDay.getDate() == dv) {
                    this._focusCell = cellObj;
                    this._focusCell.getElementsByTagName("a")[0].style.color = "red";
                    this._focusCell.style.backgroundColor = "#7FFFD4";
                }
            }
            dv++;
        }
    }
    else {
        if (ymMatch) {
            dv = this._startDayIdx + this._selDay.getDate() - 1;
            this._focusCell = this._dayTb.rows[Math.floor(dv / 7) + 1].cells[dv % 7];
            this._focusCell.getElementsByTagName("a")[0].style.color = "red";
            this._focusCell.style.backgroundColor = "#7FFFD4";
        }
    }
    
    this._preDay = this._selDay.jslClone();
}

jsl.dsw.prototype.AddYear = function(d) {
    this._selDay.setYear(this._selDay.getFullYear() + d);
    this._NavigateToSelDay();
}

jsl.dsw.prototype.AddMonth = function(d) {
    this._selDay.setMonth(this._selDay.getMonth() + d);
    this._NavigateToSelDay();
}

jsl.dsw.prototype.SetMonth = function(d) {
    this._selDay.setMonth(d);
    this._NavigateToSelDay();
}

jsl.dsw.prototype._OnDayClk = function(lnkObj) {
    var dayValue = new Date(this._selDay.getFullYear(), this._selDay.getMonth(), eval(jsl.bl.getText(lnkObj)));
    
    this._inputObj.value = dayValue.jslToString("yyyy-MM-dd");
    if (this._inputObj.onchange != null) {
        this._inputObj.onchange();
    }
    this.Close();
}

jsl.dsw.prototype._OnMouseOver = function() {
    this._mouseOnWnd = true;
}

jsl.dsw.prototype._OnMouseOut = function() {
    this._mouseOnWnd = false;
}

jsl.dsw.prototype._MouseOverItem = function(lnkObj) {
    if (lnkObj.parentNode == this._focusCell) {
        return;
    }
    
    lnkObj.parentNode.style.backgroundColor = "#F5F5DC";
}

jsl.dsw.prototype._MouseOutItem = function(lnkObj) {
    if (lnkObj.parentNode == this._focusCell) {
        return;
    }
    
    lnkObj.parentNode.style.backgroundColor = "";
}

jsl.dsw.prototype._initialize = function() {
    var cellObj;
    var i;
    var s;
    
    this._dateNow = new Date();    
    
    this._tb = jsl.bl.addChild(this._container, "table");
    this._tb.cellSpacing = "0";
    this._tb.cellPadding = "1";
    this._headerRow = this._tb.insertRow(0);
    
    cellObj = this._headerRow.insertCell(0);
    cellObj.innerHTML = "&nbsp;<a href=\"\" onclick=\"" + this._instanceName + ".AddYear(-1); return false;\">&lt;&lt;</a>&nbsp;&nbsp;<a href=\"\" onclick=\"" + this._instanceName + ".AddMonth(-1); return false;\">&lt;</a>";
    cellObj.width = "20px";
    cellObj.noWrap = true;
    
    cellObj = this._headerRow.insertCell(1);
    jsl.bl.setText(cellObj, "yyyy-MM");
    cellObj.noWrap = true;
    cellObj.align = "center";
    
    cellObj = this._headerRow.insertCell(2);
    cellObj.innerHTML = "<a href=\"\" onclick=\"" + this._instanceName + ".AddMonth(1); return false;\">&gt;</a>&nbsp;&nbsp;<a href=\"\" onclick=\"" + this._instanceName + ".AddYear(1); return false;\">&gt;&gt;</a>&nbsp;";
    cellObj.align = "right";
    cellObj.width = "20px";
    cellObj.noWrap = true;
    
    this._monthRow = this._tb.insertRow(1);
    cellObj = this._monthRow.insertCell(0);
    s = "<a href=\"\" onclick=\"" + this._instanceName + ".SetMonth(0); return false;\">1</a>";
    for (i = 2; i <= 12; i++) {
        s += "&nbsp;<a href=\"\" onclick=\"" + this._instanceName + ".SetMonth(" + (i - 1) + "); return false;\">" + i + "</a>";
    }
    cellObj.innerHTML = s;
    cellObj.noWrap = true;
    cellObj.align = "center";
    cellObj.colSpan = 3;
    
    s = this._tb.insertRow(2);
    cellObj = s.insertCell(0);
    cellObj.noWrap = true;
    cellObj.align = "center";
    cellObj.colSpan = 3;
    this._createDayTb(cellObj);
    
    s = this._tb.insertRow(3);    
    this._curtDayCell = s.insertCell(0);
    this._curtDayCell.noWrap = true;
    this._curtDayCell.align = "center";
    this._curtDayCell.colSpan = 3;
    jsl.bl.setText(this._curtDayCell, this._todayLabel + " " + this._dateNow.jslToString("yyyy-MM-dd"));
    
    
    jsl.registerEventHandler(this._container, "mouseover", this, "_OnMouseOver");
    jsl.registerEventHandler(this._container, "mouseout", this, "_OnMouseOut");
        
    jsl.rt.AddWndResizer(this, "OnWndResizer");
}

jsl.dsw.prototype._OnPageClick = function(evt) {
    var src;
    var i;
    
    if (evt == null) {
        evt = window.event;
    }
    src = evt.target ? evt.target : evt.srcElement;
    
    if (src == this._container || src == this._inputObj || src == this._triggerObj || this._mouseOnWnd) {
        return;
    }
    src = src.parentNode;
    for (i = 0; i < 6; i++) {
        if (src == null) {
            break;
        }
        if (src == this._container) {
            return;
        }
        src = src.parentNode;
    }
    
    this.Close();
}

jsl.dsw.prototype.IBL = function(evt, obj) {
    if (!this._isShow) {
        return true;
    }
    
    if (obj == this._inputObj && !this._mouseOnWnd) {
        this.Close();
    }
}

jsl.dsw.prototype._createDayTb = function(parentCell) {
    var rowObj;
    var cellObj;
    var i;
    var j;
    var s = "";
    
    this._dayTb = jsl.bl.addChild(parentCell, "table");
    
    rowObj = this._dayTb.insertRow(0);
    for (i = 0; i < 7; i++) {
        cellObj = rowObj.insertCell(i);
        cellObj.align = "center";
        cellObj.noWrap = true;
        s = "" + this._weekLabel[i];
        if (s.length < 3) {
            cellObj.innerHTML = "&nbsp;" + s + "&nbsp;";
        }
        else {
            jsl.bl.setText(cellObj, s);
        }
    }
    
    for (j = 1; j <= 6; j++) {
        rowObj = this._dayTb.insertRow(j);
        for (i = 0; i < 7; i++) {
            cellObj = rowObj.insertCell(i);
            cellObj.align = "center";
            cellObj.noWrap = true;
            cellObj.innerHTML = "<a href=\"\" onmouseover=\"" + this._instanceName + "._MouseOverItem(this);\" onmouseout=\"" + this._instanceName + "._MouseOutItem(this);\" onclick=\"" + this._instanceName + "._OnDayClk(this); return false;\">" + j + "</a><span>&nbsp;</span>";
        }
    }
}