﻿var calendarParametres = {
    month: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
    wk: ["wk", "Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"],
    dateFormat: 'mm/dd/yy'
};

var CalendarObj = new Calendar(
                               calendarParametres.month,
                               calendarParametres.wk,
                               calendarParametres.dateFormat
                               );
function Calendar(month, wk, df) {
    var instance = this;
    this.t_month = month;
    this.t_wk = wk;
    this.date = new Date();
    this.input_month = instance.date.getMonth();
    this.input_year = instance.date.getFullYear();
    this.raz = df.charAt(2);
    this.input_id = null;
    this.cday = null;
    this.cmonth = null;
    this.cyear = null;

    this.minDate = null;
    this.maxDate = null;

    this.tempIndex = ['0', '1', '2'];
    this.tempDate = ['0', '1', '2'];
    //-----------------------------
    this.parentCalendarInputBox = true;
    //-----------------------------
    this.operaB = typeof (opera);
    this.createHTMLCalendar = function() {
        instance.raz = calendarParametres.dateFormat.charAt(2);
        var mainCalendarDiv = document.createElement("DIV");
        //----------------------
        mainCalendarDiv.onmousemove = function() { instance.CalendarOnMouseMove(); };
        mainCalendarDiv.onmousedown = function() { instance.CalendarOnMouseUp(); };
        //----------------------
        mainCalendarDiv.setAttribute("id", "cj-block");
        mainCalendarDiv.className = "cj-block";
        document.body.insertBefore(mainCalendarDiv, document.body.firstChild);
        var divTitle = document.createElement("DIV");
        divTitle.className = "cj-title";
        mainCalendarDiv.appendChild(divTitle);
        var tableTitle = document.createElement("table");
        tableTitle.cellSpacing = "0";
        tableTitle.cellPadding = "0";
        tableTitle.border = "0";
        tableTitle.width = "100%";
        divTitle.appendChild(tableTitle);
        var trTableTitle = tableTitle.insertRow(0);
        var tdTableTitle1 = tableTitle.rows[0].insertCell(tableTitle.rows[0].cells.length);
        var tImg1 = document.createElement("DIV");
        tImg1.border = "0";
        tImg1.alt = "";
        tImg1.className = "cj-hdr-left";
        tdTableTitle1.appendChild(tImg1);
        var tdTableTitle2 = tableTitle.rows[0].insertCell(tableTitle.rows[0].cells.length);
        tdTableTitle2.className = "text";
        var ta1 = document.createElement("a");
        ta1.href = "#";
        ta1.onclick = function() { return instance.cjHideCalendar(); };
        var tImgA1 = document.createElement("DIV");
        tImgA1.border = "0";
        tImgA1.alt = "Close";
        tImgA1.className = "cj-btn-c";
        tImgA1.title = "Close";
        ta1.appendChild(tImgA1);
        tdTableTitle2.appendChild(ta1);
        var tdTableTitle3 = tableTitle.rows[0].insertCell(tableTitle.rows[0].cells.length);
        tdTableTitle3.setAttribute("id", "cj-title");
        tdTableTitle3.width = "100%";
        tdTableTitle3.className = "text";
        tdTableTitle3.innerHTML = "Mar, 2017";
        var tdTableTitle4 = tableTitle.rows[0].insertCell(tableTitle.rows[0].cells.length);
        tdTableTitle4.className = "text";
        var ta4 = document.createElement("a");
        ta4.href = "#";
        ta4.onclick = function() { };
//        var tImgA4 = document.createElement("DIV");
//        tImgA4.border = "0";
//        tImgA4.alt = "";
//        tImgA4.className = "cj-btn-h";
//        ta4.appendChild(tImgA4);
        tdTableTitle4.appendChild(ta4);
        var tdTableTitle5 = tableTitle.rows[0].insertCell(tableTitle.rows[0].cells.length);
        var tImg5 = document.createElement("DIV");
        tImg5.border = "0";
        tImg5.alt = "";
        tImg5.className = "cj-hdr-right";
        tdTableTitle5.appendChild(tImg5);
        var divNav = document.createElement("DIV");
        divNav.className = "cj-nav";
        instance.createHTMLCalendarNavImg(divNav, function() { instance.cjPrevYear(); }, "Prev Year", "cj-btn-sl2", "Prev Year");
        instance.createHTMLCalendarNavImg(divNav, function() { instance.cjPrevMonth(); }, "Prev Month", "cj-btn-sl", "Prev Month");
        var navDivToday = document.createElement("DIV");
        navDivToday.className = "btn floatLeft";
        navDivToday.onclick = function() { instance.cjToday(); };
        navDivToday.innerHTML = "Today";
        divNav.appendChild(navDivToday);
        instance.createHTMLCalendarNavImg(divNav, function() { instance.cjNextMonth(); }, "Next Month", "cj-btn-sr", "Next Month");
        instance.createHTMLCalendarNavImg(divNav, function() { instance.cjNextYear(); }, "Next Year", "cj-btn-sr2", "Next Year");
        mainCalendarDiv.appendChild(divNav);
        var tableWk = document.createElement("table");
        tableWk.cellSpacing = "0";
        tableWk.cellPadding = "0";
        tableWk.border = "0";
        tableWk.className = "cj-head";
        var trTableWk = tableWk.insertRow(0);
        instance.createHTMLCalendarWktd(tableWk, instance.t_wk[0], "tb");
        for (var i = 1; i < 8; i++) {
            instance.createHTMLCalendarWktd(tableWk, instance.t_wk[i], "");
        }
        mainCalendarDiv.appendChild(tableWk);
        var tableBody = document.createElement("table");
        tableBody.cellSpacing = "0";
        tableBody.cellPadding = "0";
        tableBody.border = "0";
        tableBody.className = "cj-body";
        for (var i = 0; i < 6; i++) {
            var trTableBody = tableBody.insertRow(i);
            var tdTableBody1 = tableBody.rows[i].insertCell(tableBody.rows[i].cells.length);
            var j = i + 1;
            tdTableBody1.setAttribute("id", "t-" + j + "-7");
            tdTableBody1.className = "tb";
            tdTableBody1.innerHTML = "W";
            for (var k = 1; k < 7; k++) {
                var tdTableBody2 = tableBody.rows[i].insertCell(tableBody.rows[i].cells.length);
                tdTableBody2.setAttribute("id", "t-" + j + "-" + k);
                tdTableBody2.className = "";
                tdTableBody2.innerHTML = "d";
                tdTableBody2.onclick = function() { instance.cjSaveDate(this); };
            }
            var tdTableBody3 = tableBody.rows[i].insertCell(tableBody.rows[i].cells.length);
            tdTableBody3.setAttribute("id", "t-" + j + "-0");
            tdTableBody3.className = "hCell";
            tdTableBody3.innerHTML = "N";
            tdTableBody3.onclick = function() { instance.cjSaveDate(this); };
        }
        mainCalendarDiv.appendChild(tableBody);
        var divBtm = document.createElement("DIV");
        divBtm.className = "cj-btm";
        var tableBtm = document.createElement("table");
        tableBtm.cellSpacing = "0";
        tableBtm.cellPadding = "0";
        tableBtm.border = "0";
        tableBtm.width = "100%";
        var trTableBtm = tableBtm.insertRow(0);
        var tdTableBtm1 = tableBtm.rows[0].insertCell(tableBtm.rows[0].cells.length);
        var btmImg1 = document.createElement("DIV");
        btmImg1.border = "0";
        btmImg1.alt = "";
        btmImg1.className = "cj-btm-left";
        tdTableBtm1.appendChild(btmImg1);
        var tdTableBtm2 = tableBtm.rows[0].insertCell(tableBtm.rows[0].cells.length);
        var tdTableBtm3 = tableBtm.rows[0].insertCell(tableBtm.rows[0].cells.length);
        tdTableBtm3.className = "btmText";
        tdTableBtm3.innerHTML = "Select date";
        var tdTableBtm4 = tableBtm.rows[0].insertCell(tableBtm.rows[0].cells.length);
        var btmImg4 = document.createElement("DIV");
        btmImg4.border = "0";
        btmImg4.alt = "";
        btmImg4.className = "cj-btm-right";
        tdTableBtm4.appendChild(btmImg4);
        divBtm.appendChild(tableBtm);
        mainCalendarDiv.appendChild(divBtm);
    }
    this.createHTMLCalendarNavImg = function(divNav, fn, imgAlt, imgSrc, imgTitle) {
        var ImgNav = document.createElement("DIV");
        ImgNav.border = "0";
        ImgNav.onclick = fn;
        ImgNav.className = "floatLeft " + imgSrc;
        ImgNav.alt = imgAlt;
        ImgNav.title = imgTitle
        divNav.appendChild(ImgNav);
    }
    this.createHTMLCalendarWktd = function(tableWk, text, classTd) {
        var tdTableWk = tableWk.rows[0].insertCell(tableWk.rows[0].cells.length);
        tdTableWk.innerHTML = text;
        tdTableWk.className = classTd;
    }
    this.cjShowCalendar = function(id) {
        if (typeof id == "string") {
            instance.input_id = id;
        }
        else {
            instance.input_id = id.id;
        }
        instance.dateFormatCalendar();
        instance.cjBuildCalendar();
        document.getElementById('cj-block').style.display = 'block';
        return false;
    }
    this.showCalendar = function(id) {
        if (document.getElementById("cj-block") == null) {
            CalendarObj.createHTMLCalendar();
        }
        instance.cjShowCalendar(id);
        setPositionCalendar();
    }
    this.cjHideCalendar = function() {
        document.getElementById('cj-block').style.display = 'none';
        instance.parentCalendarInputBox = true;
        return false;
    }
    this.cjSaveDate = function(td) {
        if (td.innerHTML != "") {
            instance.date.setDate(td.innerHTML);
            instance.input_month = instance.date.getMonth();
            instance.input_year = instance.date.getFullYear();
            var tempDate = instance.instanceTempDate()
            instance.cjBuildCalendar();
            //document.getElementById(instance.input_id).value = instance.date.getDate() + instance.raz + (instance.date.getMonth() + 1) + instance.raz + instance.date.getFullYear();
            document.getElementById(instance.input_id).value = tempDate[instance.tempIndex[0]] + instance.raz + (tempDate[instance.tempIndex[1]]) + instance.raz + tempDate[instance.tempIndex[2]];
            instance.cjHideCalendar();
            if (document.getElementById(instance.input_id).getAttribute("AfterChanged")) {
                eval(document.getElementById(instance.input_id).getAttribute("AfterChanged") + "('" + instance.input_id + "');");
            }
        }
    }
    this.cjBuildCalendar = function() {
        cday = instance.date.getDate();
        cmonth = instance.date.getMonth();
        cyear = instance.date.getFullYear();
        document.getElementById('cj-title').innerHTML = instance.t_month[cmonth] + ', ' + cyear;
        var temp = new Date(instance.date.getFullYear(), instance.date.getMonth(), 1, 0, 0, 0);
        time = temp.getTime();
        month = temp.getMonth();
        for (i = 1; i < 7; i++)
            for (j = 0; j < 8; j++) {
            document.getElementById('t-' + i + '-' + j).innerHTML = '';
            if (j < 7) { document.getElementById('t-' + i + '-' + j).className = '' };
            if (instance.operaB != "object") {
                if (j == 0 || j == 6) { document.getElementById('t-' + i + '-' + j).className = 'hCell' };
            }
        }
        line = 1;
        wday = temp.getDay();
        if (wday == 1) document.getElementById('t-' + line + '-7').innerHTML = temp.getWeek() - 1;
        else document.getElementById('t-' + line + '-7').innerHTML = temp.getWeek();
        while (month == cmonth) {
            day = temp.getDate();
            wday = temp.getDay();
            if (wday == 1) {
                line++;
                document.getElementById('t-' + line + '-7').innerHTML = temp.getWeek();
            }
            document.getElementById('t-' + line + '-' + wday).innerHTML = day;
            var currentDate = new Date(cyear, month, day);
            var dCell = document.getElementById('t-' + line + '-' + wday);

            var min = (this.minDate != null && this.minDate > currentDate.setDate(currentDate.getDate() + 1));
            var max = (this.maxDate != null && this.maxDate < currentDate.setDate(currentDate.getDate() - 1));

            if (min || max) {
                dCell.className = 'disabled';
                dCell.onclick = null;
            } else {
                dCell.onclick = function () { instance.cjSaveDate(this); }
            }

            if (day == cday && cmonth == instance.input_month && cyear == instance.input_year) dCell.className = 'sel';
            time = temp.setTime(time + (24 * 3600 * 1000));
            month = temp.getMonth();
        }
        if (wday == 0) {
            line++;
            document.getElementById('t-' + line + '-7').innerHTML = temp.getWeek();
        }
    }
    this.cjToday = function() {
        instance.date = new Date();
        instance.input_month = instance.date.getMonth();
        instance.input_year = instance.date.getFullYear();
        var tempDate = instance.instanceTempDate()
        instance.cjBuildCalendar();
        document.getElementById(instance.input_id).value = tempDate[instance.tempIndex[0]] + instance.raz + (tempDate[instance.tempIndex[1]]) + instance.raz + tempDate[instance.tempIndex[2]];
        if (document.getElementById(instance.input_id).getAttribute("AfterChanged")) {
            eval(document.getElementById(instance.input_id).getAttribute("AfterChanged") + "('" + instance.input_id + "');");
        }

    }
    this.cjPrevMonth = function() {
        month = instance.date.getMonth();
        year = instance.date.getFullYear();
        if (month == 0) {
            instance.date.setMonth(11);
            instance.date.setYear(year - 1);
        } else {
            instance.date.setMonth(month - 1);
        }
        instance.cjBuildCalendar();
    }
    this.cjNextMonth = function() {
        month = instance.date.getMonth();
        year = instance.date.getFullYear();
        if (month == 11) {
            instance.date.setMonth(0);
            instance.date.setYear(year + 1);
        } else {
            instance.date.setMonth(month + 1);
        }
        instance.cjBuildCalendar();
    }
    this.cjPrevYear = function() {
        year = instance.date.getFullYear();
        instance.date.setYear(year - 1);
        instance.cjBuildCalendar();
    }
    this.cjNextYear = function() {
        year = instance.date.getFullYear();
        instance.date.setYear(year + 1);
        instance.cjBuildCalendar();
    }
    //-----------------------------
    this.CalendarOnMouseMove = function() {
        instance.parentCalendarInputBox = true;
    }
    this.CalendarOnMouseUp = function() {
        instance.parentCalendarInputBox = null;
    }
    //-----------------------------
    this.dateFormatCalendar = function() {
        var temp = new Array();
        temp = document.getElementById(instance.input_id).value.split(instance.raz);
        var DayTem = temp[0]; //Day
        var MonthTem = temp[1]; //month
        var year = temp[2]; //year
        var tempActivDateFormat = calendarParametres.dateFormat.split(instance.raz);
        var tempActiv = [0, 1, 2];
        tempActiv[0] = temp[0];
        tempActiv[1] = temp[1];
        tempActiv[2] = temp[2];
        for (var i = 0; i < tempActivDateFormat.length; i++) {
            if (tempActivDateFormat[i] == 'dd' || tempActivDateFormat[i] == 'DD') {
                instance.tempIndex[0] = i;
            }
            if (tempActivDateFormat[i] == 'MM' || tempActivDateFormat[i] == 'mm') {

                instance.tempIndex[1] = i;
            }
            if (tempActivDateFormat[i] == 'yyyy' || tempActivDateFormat[i] == 'YYYY') {
                instance.tempIndex[2] = i;
            }
        }
        temp[0] = tempActiv[instance.tempIndex[0]];
        temp[1] = tempActiv[instance.tempIndex[1]];
        temp[2] = tempActiv[instance.tempIndex[2]];

        if (temp.length == 3) instance.date = new Date(temp[2], temp[1] - 1, temp[0], 0, 0, 0);
        else instance.date = new Date();
        instance.input_month = instance.date.getMonth();
        instance.input_year = instance.date.getFullYear();

        var settings = eval('calendarParametres_' + instance.input_id);

        instance.minDate = settings.minDate;
        instance.maxDate = settings.maxDate;
    }
    this.instanceTempDate = function() {
        var tempDate = ['0', '1', '2'];
        if (instance.date.getDate() < 10)
            tempDate[0] = "0" + instance.date.getDate();
        else
            tempDate[0] = instance.date.getDate();

        if ((instance.date.getMonth() + 1) < 10)
            tempDate[1] = "0" + (instance.date.getMonth() + 1);
        else
            tempDate[1] = (instance.date.getMonth() + 1);

        tempDate[2] = instance.date.getFullYear();
        return tempDate;
    }
}

Date.prototype.getWeek = function() {
    var onejan = new Date(this.getFullYear(), 0, 1, 0, 0, 0);
    return Math.ceil((((this - onejan) / 86400000) + onejan.getDay()) / 7);
};


function setPositionCalendar() {
    if (document.getElementById("cj-block")) {
        if (document.getElementById('cj-block').style.display == 'block') {
            var IdQj = "#" + CalendarObj.input_id;
            var pos = $(IdQj).offset().left;
            var rightDiv = ($(IdQj).offset().left);
            var bottomDiv = ($(IdQj).offset().top + $(IdQj).height()) + 4;
            var divFull = document.getElementById("cj-block");
            divFull.style.left = rightDiv + "px";
            divFull.style.top = bottomDiv + "px";
        }
    }
}

$(function() {
    $(document).mousedown(function(event) {
        if (document.getElementById("cj-block")) {
            if (document.getElementById('cj-block').style.display == 'block') {
                if (CalendarObj.parentCalendarInputBox) {
                    CalendarObj.cjHideCalendar();
                }
            }
        }
    });
});
