﻿
var d = new DateFunctions();

function Calendar(h, g) {
    if (h != null) {
        g = h.id.split("_")[0]
    }

    this.Base = g;
    this.MonthYearDropDown = document.getElementById(g + "_MonthYear");
    this.DayDropDown = document.getElementById(g + "_Day");
    this.Mask = document.getElementById(g + "_Mask");
    this.Calendar = document.getElementById(g + "_Calendar");
    this.Year = this.MonthYearDropDown.options[this.MonthYearDropDown.selectedIndex].value.split("_")[1];
    this.Month = this.MonthYearDropDown.options[this.MonthYearDropDown.selectedIndex].value.split("_")[0];
    //In chrome on back button click it gives this.DayDropDown.selectedIndex value -1 it breaks the normal execution of search box 	
    this.Day = this.DayDropDown.options[this.DayDropDown.selectedIndex < 0 ? 0 : this.DayDropDown.selectedIndex].value;
    this.CurrentDate = d.New(this.Day, this.Month, this.Year);
    //alert(this.CurrentDate);
    this.Visible = iif(this.Calendar.style.display == "none", false, true);
    this.SetDate = function (j, k, m) {
        for (var l = 0; l <= this.MonthYearDropDown.options.length - 1; l++) {
            if (this.MonthYearDropDown.options[l].value == k + "_" + j) {
                this.MonthYearDropDown.selectedIndex = l;
                this.Year = j;
                this.Month = k;
                this.Day = m;
                CalendarPopulateDays(this);
                break
            }
        }
    };
    this.SetPosition = function () {
        var i = GetPosition(this.MonthYearDropDown);
        document.body.appendChild(this.Calendar);
        document.body.appendChild(this.Mask);
        SetTopLeft(this.Calendar, i.Top + 20, i.Left);
        SetTopLeft(this.Mask, i.Top + 20, i.Left)
    }
}
function SetCalendarDate(h, g) {
    var i = g - 1;
    oDropdown = document.getElementById(h + "_Day");
    oDropdown.selectedIndex = i;
    oDropdown.onchange();
    HideCalendar(h)
}

function CalendarDateChange(h) {
    var g = new Calendar(h);
    if (g.Visible == true) {
        if (h.id.indexOf("Day") > 0) {
            Cal_ShowCalendar(h, 1)
        } else {
            Cal_ShowCalendar(h)
        }
    } else {
        if (h.id.indexOf("_Month") > -1) {
            CalendarPopulateDays(g)
        }
    }
}
function CalendarPopulateDays(l) {
    var h = Constants.DaysArray;
    var i = parseInt(l.Year) + 1;
    var j = new Date(l.Year, l.Month - 1, 1);
    var g = new Date(iif(l.Month == 12, i, l.Year), iif(l.Month == 12, 0, l.Month), 1);
    g.setDate(g.getDate() - 1);
    l.DayDropDown.options.length = 0;
    while (j <= g) {
        var k = document.createElement("option");
        k.innerHTML = j.getDate() + " (" + h[j.getDay()] + ")";
        k.value = j.getDate();
        if (j.getDate() == l.Day) {
            k.selected = true
        }
        l.DayDropDown.appendChild(k);
        j.setDate(j.getDate() + 1)
    }
}
function DrawCalendar(v, o) {
    var r = Constants.ShortDaysArray;
    var h = document.createElement("table");
    var q = document.createElement("tbody");
    h.appendChild(q);
    var A = document.createElement("tr");
    q.appendChild(A);
    A.className = "calendarcontrol";
    var y = document.createElement("td");
    y.colSpan = 7;
    A.appendChild(y);
    var m = document.createElement("a");
    m.href = "javascript:CalendarPreviousMonth('" + v.Base + "')";
    m.className = "calendarpreviousmonth";
    y.appendChild(m);
    m = document.createElement("a");
    m.href = "javascript:CalendarNextMonth('" + v.Base + "')";
    m.className = "calendarnextmonth";
    y.appendChild(m);
    var t = document.createElement("label");
    t.className = "calendarmonthyear";
    t.innerHTML = v.MonthYearDropDown.options[v.MonthYearDropDown.selectedIndex].text;
    y.appendChild(t);
    m = document.createElement("a");
    m.href = "javascript:HideCalendar('" + v.Base + "')";
    m.className = "calendarhide";
    y.appendChild(m);
    A = document.createElement("tr");
    var g;
    for (var B = 0; B < r.length; B++) {
        g = document.createElement("th");
        g.innerHTML = r[B];
        A.appendChild(g)
    }
    q.appendChild(A);
    var D = parseInt(v.Year) + 1;
    var C = new Date(v.Year, v.Month - 1, 1);
    var z = new Date(iif(v.Month == 12, D, v.Year), iif(v.Month == 12, 0, v.Month), 1);
    z.setDate(z.getDate() - 1);
    var l = new Date(v.Year, v.Month - 1, 1);
    if (l.getDay() == 0) {
        l.setDate(l.getDate() - 6)
    } else {
        l.setDate(l.getDate() - l.getDay() + 1)
    }
    var p = new Date();
    p = new Date(p.getFullYear(), p.getMonth(), p.getDate());
    var w = iif(v.Day < z.getDate(), v.Day, z.getDate());
    if (new Date(v.Year, v.Month - 1, w) <= p) {
        w = p.getDate();
        v.Day = w
    }
    var u = 40;
    for (var B = 0; B < 6; B++) {
        A = document.createElement("tr");
        q.appendChild(A);
        u += 20;
        for (var k = 0; k < 7; k++) {
            var y = document.createElement("td");
            if (l >= C && l <= z) {
                if (l >= p) {
                    var m = document.createElement("a");

                    m.href = "javascript:SetCalendarDate('" + v.Base + "'," + l.getDate() + ")";
                    m.innerHTML = l.getDate();
                    m.id = v.Base + "_" + l.getDate();
                    if (l.getDate() == w) {
                        m.className = "selected"
                    }
                    y.appendChild(m)
                } else {
                    y.innerHTML = l.getDate();
                    y.className = "old"
                }
            } else {
                y.className = "dead"
            }
            l.setDate(l.getDate() + 1);
            A.appendChild(y)
        }
        if (l > z) {
            break
        }
    }
    if (o == undefined) {
        CalendarPopulateDays(v)
    }
    v.Calendar.style.height = u + 2 + "px";
    v.Mask.style.height = u + 4 + "px";
    v.Calendar.innerHTML = "";
    v.Calendar.appendChild(h)
}
function CalendarPreviousMonth(g) {
    var i = document.getElementById(g + "_MonthYear");
    if (i.selectedIndex > 0) {
        i.selectedIndex--;
        var h = new Calendar(null, g);
        DrawCalendar(h)
    }
}
function CalendarNextMonth(g) {
    var i = document.getElementById(g + "_MonthYear");
    if (i.selectedIndex < i.length - 1) {
        i.selectedIndex++;
        var h = new Calendar(null, g);
        DrawCalendar(h)
    }
}
function Cal_ShowCalendar(h, g) {
    
    var i = new Calendar(h);
    i.SetPosition();
    DrawCalendar(i, g);
    i.Mask.style.display = "block";
    i.Calendar.style.display = "block"
}
function HideCalendar(h) {
    document.getElementById(h + "_Mask").style.display = "none";
    document.getElementById(h + "_Calendar").style.display = "none";
    var g = document.getElementById(h + "_MonthYear");
    g.onchange()
}



function DateFunctions() {
    this.New = function (i, h, g) {
        return new Date(g, h - 1, i)
    };
    this.Today = function () {
        var g = new Date();
        return d.New(d.Day(g), d.Month(g), d.Year(g))
    };
    this.GetDateOnly = function (g) {
        return d.New(d.Day(g), d.Month(g), d.Year(g))
    };
    this.AddDays = function (g, h) {
        g.setDate(g.getDate() + h);
        return g
    };
    this.Year = function (g) {
        return g.getFullYear()
    };
    this.Month = function (g) {
        return g.getMonth() + 1
    };
    this.Day = function (g) {
        return g.getDate()
    };
    this.DayName = function (g) {
        return s.Left(g + "", 3)
    };
    this.MonthName = function (g) {
        var h = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");
        return h[d.Month(g) - 1]
    };
    this.MonthEnd = function (g) {
        return d.AddDays(d.New(1, (d.Month(g) == 12) ? 1 : d.Month(g) + 1, (d.Month(g) == 12) ? d.Year(g) + 1 : d.Year(g)), -1)
    };
    this.Weekend = function (g) {
        return (s.Left(g + "", 1) == "S")
    };
    this.IsDate = function (g) {
        return !isNaN(new Date(g))
    };
    this.SafeDate = function (g) {
        if (this.IsDate(g)) {
            return new Date(g)
        }
    };
    this.FromSQLDate = function (g) {
        return d.New(g.substring(8, 10), g.substring(5, 7), g.substring(0, 4))
    };
    this.ToSQLDate = function (m) {
        var j = m.getFullYear().toString();
        var i = s.PadWithZeros((m.getMonth() + 1).toString(), 2);
        var g = s.PadWithZeros(m.getDate().toString(), 2);
        var k = s.PadWithZeros(m.getHours().toString(), 2);
        var h = s.PadWithZeros(m.getMinutes().toString(), 2);
        var l = s.PadWithZeros(m.getSeconds().toString(), 2);
        return j + "-" + i + "-" + g + "T" + k + ":" + h + ":" + l
    };
    this.DisplayDate = function (g) {
        g = new Date(g);
        var i = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");
        var h = g.getDate().toString();
        if (h.length == 1) {
            h = "0" + h
        }
        return h + " " + i[g.getMonth()] + " " + g.getFullYear()
    };
    this.GetAge = function (h) {
        var g = new Date();
        var i = -1;
        while (g >= h) {
            i++;
            h.setFullYear(h.getFullYear() + 1)
        }
        return i
    };
    this.DateDiff = function (p, i) {
        var h = new Date(p);
        var g = new Date(i);
        var m;
        var j;
        var k;
        var o;
        var l;
        if (h <= g) {
            m = h.getYear();
            j = g.getYear();
            k = this.DayOfYear(h);
            o = this.DayOfYear(g)
        } else {
            m = g.getYear();
            j = h.getYear();
            k = this.DayOfYear(g);
            o = this.DayOfYear(h)
        }
        if (m == j) {
            l = o - k
        } else {
            l = o + (365 - k);
            if (this.CheckLeapYear(m) == 1 && j != m) {
                l += 1
            }
            for (var q = m + 1; q < j; q++) {
                if (this.CheckLeapYear(q) == 1) {
                    l += 366
                } else {
                    l += 365
                }
            }
        }
        if (h > g) {
            l = l * (-1)
        }
        return l
    };
    this.CheckLeapYear = function (g) {
        return (((g % 4 == 0) && (g % 100 != 0)) || (g % 400 == 0)) ? 1 : 0
    };
    this.DayOfYear = function (g) {
        var j = g.getDate();
        var i = g.getMonth();
        var h = g.getYear();
        if ((this.CheckLeapYear(h) == 1) && (i >= 2)) {
            j++
        }
        if (i == 1) {
            j += 31
        } else {
            if (i == 2) {
                j += 59
            } else {
                if (i == 3) {
                    j += 90
                } else {
                    if (i == 4) {
                        j += 120
                    } else {
                        if (i == 5) {
                            j += 151
                        } else {
                            if (i == 6) {
                                j += 181
                            } else {
                                if (i == 7) {
                                    j += 212
                                } else {
                                    if (i == 8) {
                                        j += 243
                                    } else {
                                        if (i == 9) {
                                            j += 273
                                        } else {
                                            if (i == 10) {
                                                j += 304
                                            } else {
                                                if (i == 11) {
                                                    j += 334
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        return j
    }
}

function iif(i, g, h) {
    return i ? g : h
}

function SafeObject(o) {
    if (typeof (o) == "object") {
        return o
    }
    else {
        if (typeof (o) == "string") {
            return this.GetObject(o)
        }
        else {
            return null
        }
    }

}

function GetPosition(q) {
    var m = SafeObject(q);
    //    alert(m);
    var i = m.id;
    var p = 0,
            l = 0,
            r, k, h, j;
    r = m.offsetWidth;
    k = m.offsetHeight;
    if (m.offsetParent) {
        p = m.offsetLeft;
        l = m.offsetTop;
        while (m = m.offsetParent) {
            h = (m.offsetParent && m.scrollLeft > 0 ? m.scrollLeft : 0);
            j = (m.offsetParent && m.scrollTop > 0 ? m.scrollTop : 0);
            p += m.offsetLeft - h;
            l += m.offsetTop - j
        }
    }
    return new this.Position(p, l, r, k)
}

function Position(i, j, h, k) {
    this.Left = i;
    this.Top = j;
    this.Width = h;
    this.Height = k
}

function SetTopLeft(j, i, h) {
    oControl = SafeObject(j);
    oControl.style.top = i + "px";
    oControl.style.left = h + "px"
}
