var dp_TextBox;
var dp_Callback;
var dp_PostBack;

var dp_aMonths=new Array("ßíâàðü","Ôåâðàëü","Ìàðò","Àïðåëü","Ìàé","Èþíü","Èþëü","Àâãóñò","Ñåíòÿáðü","Îêòÿáðü","Íîÿáðü","Äåêàáðü","");
var dp_aDays=new Array("Âñ","Ïí","Âò","Ñð","×ò","Ïò","Ñá");
var dp_aArgs=new Array("dd.MM.yyyy",1);

function dp_AddEventListener(e,eT,eL,cap)
{
    eT=eT.toLowerCase();
    var eh='e.on'+eT+'=eL';
    if(e.addEventListener) e.addEventListener(eT,eL,cap);
    else if(e.attachEvent) e.attachEvent('on'+eT,eL);
    else eval(eh);
}

function dp_RemoveEventListener(e,eT,eL,cap)
{
    eT=eT.toLowerCase();
    var eh='e.on'+eT+'=null';
    if(e.removeEventListener) e.removeEventListener(eT,eL,cap);
    else if(e.detachEvent) e.detachEvent('on'+eT,eL);
    else eval(eh);
}

function dp_GetEventSrc(e)
{
    if (e.target) return e.target;
    else if (e.srcElement) return e.srcElement;
    else return null;
}

function dp_OnTextBoxFocus(textbox)
{
    var oTextBox = document.getElementById(textbox);
    if (oTextBox.value == oTextBox.getAttribute("NullText"))
    {
        oTextBox.value = '';
        dp_PostBack = false;
    }
    else
        dp_PostBack = true;
}

function dp_OnTextBoxBlur(textbox)
{
        var oTextBox = document.getElementById(textbox);
    if (oTextBox.value == '')
    {
        oTextBox.value = oTextBox.getAttribute("NullText");

        if (dp_PostBack)
        {
            var postback = oTextBox.getAttribute("AutoPostBack");
            if (postback && postback.length > 0)
                eval(postback);
        }
    }
}

function dp_ImgClick(e, textbox, callback_func)
{
    if (!e) var e = window.event;
    var oImage = dp_GetEventSrc(e);

    // init textbox
    dp_TextBox = document.getElementById(textbox);

    // if textbox disabled then click also disabled
    if (dp_TextBox == null || dp_TextBox.disabled)
        return false;

    // init callback function
    dp_Callback = callback_func;

    // get position
    var pos = dp_GetElementPosition(oImage);

    // get date entered in textbox
    var dt = dp_StringToDate(dp_TextBox.value);
    if (dt == null)
        dt = new Date();

    // get div
    var win = document.getElementById('dp_calendar');

    win.style.left = pos.x + document.body.scrollLeft;

    win.style.top = pos.y + document.body.scrollTop + (oImage.offsetTop + oImage.offsetHeight);
    win.style.width = '150px';
    win.style.zIndex = 1000;

    dp_ShowCalendar(dt.getTime());

        // fix position
        if (win.clientWidth + pos.x > document.body.clientWidth)
                win.style.left = pos.x - win.clientWidth + document.body.scrollLeft;
        if (win.clientHeight + pos.y > document.body.clientHeight - (oImage.offsetTop + oImage.offsetHeight))
                win.style.top = pos.y - win.clientHeight + document.body.scrollTop;

    win.style.visibility = "inherit";

    // show iframe for ie
    var ifrm = document.getElementById('dp_calendar_iframe');
    if(ifrm)
    {
                ifrm.style.width = win.style.pixelWidth || win.offsetWidth;
                ifrm.style.height = win.style.pixelHeight || win.offsetHeight;
                ifrm.style.zIndex = 999;
                ifrm.style.display = "block";
                ifrm.style.left = win.style.left;
                ifrm.style.top = win.style.top;
        }

    e.cancelBubble = true;
    if (e.stopPropagation) e.stopPropagation();

    dp_AddEventListener(document, "click", dp_OnClick, false);
}

function dp_OnClick(e)
{
    if (!e) var e = window.event;
    var src = dp_GetEventSrc(e);

    while (!(src == null || (src.tagName == "DIV" && src.id == "dp_calendar")))
        src = src.parentNode;

    // clicked on element but not calendar
    if (src == null)
    {
        dp_RemoveEventListener(document, "click", dp_OnClick);
        dp_HideCalendar();
    }
}

function dp_HideCalendar()
{
    document.getElementById('dp_calendar').style.visibility='hidden';
    var ifrm = document.getElementById('dp_calendar_iframe');
    if(ifrm)
        ifrm.style.display = "none";
}

function dp_GetElementPosition(src)
{
    var x = 0;
    var y = 0;

    while (src)
    {
        x += src.offsetLeft - src.scrollLeft;;
        y += src.offsetTop - src.scrollTop;;
        src = src.offsetParent;
    }

    return {x:x, y:y};
}

function dp_ShowCalendar(ms)
{
    var pattern = dp_aArgs[0];

    var dt_datetime = (ms == null) ? new Date() : new Date(ms);

    var dt_prev_month = new Date(dt_datetime);
    dt_prev_month.setMonth(dt_datetime.getMonth()-1);

    if(dt_datetime.getMonth()%12 != (dt_prev_month.getMonth()+1)%12)
    {
        dt_prev_month.setMonth(dt_datetime.getMonth());
        dt_prev_month.setDate(0);
    }

    var dt_next_month = new Date(dt_datetime);
    dt_next_month.setMonth(dt_datetime.getMonth()+1);
    if ((dt_datetime.getMonth() + 1)%12 != dt_next_month.getMonth()%12)
        dt_next_month.setDate(0);

    var dt_firstday = new Date(dt_datetime);
    dt_firstday.setDate(1);
    dt_firstday.setDate(1-(7+dt_firstday.getDay()-dp_aArgs[1])%7);
    var dt_lastday = new Date(dt_next_month);
    dt_lastday.setDate(0);

    // print calendar header
    var str_buffer = new String (
        "<table cellspacing=\"0\" border=\"0\" width=\"100%\" height=\"100%\">"+
        "<tr><td bgcolor=\"#797571\" valign=top>"+
        "<table cellspacing=\"1\" cellpadding=\"0\" border=\"0\" width=\"100%\">"+
        "<tr><td bgcolor=\"#797571\">" +
        "<img src='/libs/calendar/img/prev.gif' style='width:16px;height:16px;border-style:none;cursor:pointer'"+
        " onclick=\"dp_ShowCalendar("+dt_prev_month.getTime()+"); event.cancelBubble=true;\"></td>"+
        "<td bgcolor=\"#797571\" colspan=\"5\" align=\"center\">"+
        "<SPAN style=\"color: white; font: bold 11px Tahoma;\">"
        +dp_aMonths[dt_datetime.getMonth()]+" "+dt_datetime.getFullYear()+"</SPAN></td>"+
        "<td bgcolor=\"#797571\" align=\"right\">"+
        "<img src='/libs/calendar/img/next.gif' style='width:16px;height:16px;border-style:none;cursor:pointer'"+
        " onclick=\"dp_ShowCalendar("+dt_next_month.getTime()+"); event.cancelBubble=true;\"></td></tr>"
    );

    var dt_current_day = new Date(dt_firstday);

    // print weekdays titles
    str_buffer += "<tr>";
    for (var n=0; n<7; n++)
        str_buffer += "<td bgcolor=\"#C1BDB9\" style=\"border: 1px solid #C1BDB9;\" width='14%' align=\"center\">"+
            "<SPAN style=\"color: white; font: 10px Tahoma;\">"+
                dp_aDays[(dp_aArgs[1]+n)%7]+"</font></td>\n";

    // print calendar table
    str_buffer += "</tr>";
    while (dt_current_day.getMonth() == dt_datetime.getMonth() ||
        dt_current_day.getMonth() == dt_firstday.getMonth()) {
        // print row header
        str_buffer += "<tr>";

    for (var n_current_wday=0; n_current_wday<7; n_current_wday++) {
          if (dt_current_day.getDate() == dt_datetime.getDate() &&
                  dt_current_day.getMonth() == dt_datetime.getMonth())
                  // print current date
                  str_buffer += "<td bgcolor=\"#B1BBD9\" style=\"cursor:pointer; border: 1px solid #4F5F90;\"";
              else if (dt_current_day.getDay() == 0 || dt_current_day.getDay() == 6)
                  // weekend days
                  str_buffer += "<td bgcolor=\"#EAE6E2\" style=\"cursor:pointer; border: 1px solid #EAE6E2;\"";
              else
                  // print working days of current month
                  str_buffer += "<td bgcolor=\"white\" style=\"cursor:pointer; border: 1px solid white;\"";

              if (dt_current_day.getMonth() == dt_datetime.getMonth())
                  // print days of current month
                  str_buffer += " align=\"right\" onClick=\"dp_SubmitValue("+dt_current_day.getTime()+");\">"+
                  "<SPAN style=\"color:black; font: 10px Tahoma;\">";
              else
                  // print days of other months
                  str_buffer += " align=\"right\" onClick=\"dp_SubmitValue("+dt_current_day.getTime()+");\">"+
                  "<SPAN style=\"color: gray; font: 10px Tahoma;\">";
              str_buffer += dt_current_day.getDate()+"</SPAN></td>\n";
              dt_current_day.setDate(dt_current_day.getDate()+1);
        }
        // print row footer
        str_buffer += "</tr>";
    }
    // print calendar footer
    str_buffer += "</table></tr></td></table>" ;

    document.getElementById('dp_calendar').innerHTML = str_buffer;
}

function dp_DateToString(dt_datetime, special)
{
    var pattern = (!special) ? dp_aArgs[0] : "yyyyMMdd";

    for(var i = pattern.length; i >= 0; i--)
    {
        var testDayString =  GetString("d", i);
        var dayIndex = pattern.indexOf(testDayString);

        if(dayIndex != -1)
        {
            var re = new RegExp(testDayString, "ig");
            var replaceString = (dt_datetime.getDate() < 10) ? "0" + dt_datetime.getDate() :  dt_datetime.getDate();
            pattern = pattern.replace(re, replaceString);
            break;
        }
    }

    for(var i = pattern.length; i >= 0; i--)
    {
        var testMonthString =  GetString("M", i);
        var monthIndex = pattern.indexOf(testMonthString);

        if(monthIndex != -1)
        {
            var re = new RegExp(testMonthString, "ig");
            var replaceString = (dt_datetime.getMonth() + 1 < 10) ? "0" + (dt_datetime.getMonth() + 1) :  dt_datetime.getMonth() + 1;
            pattern = pattern.replace(re, replaceString);
            break;
        }
    }

    for(var i = pattern.length; i >= 0; i--)
    {
        var testYearString =  GetString("y", i);
        var yearIndex = pattern.indexOf(testYearString);

        if(yearIndex != -1)
        {
            var re = new RegExp(testYearString, "ig");
            pattern = pattern.replace(re, dt_datetime.getFullYear());
            break;
        }
    }

    return pattern;
}

function dp_StringToDate(str, isSpecial)
{
        var m, re, len, sDate, sMonth, sYear;
        var dateformat = dp_aArgs[0];

        if (str.length == 0)
                return null;

    // capture numbers
        if (isSpecial)
        {
            re = /^(\d{4})(\d{2})(\d{2})$/;
            dateformat = "yyyyMMdd";
    }
        else
            re = /^(\d+)[-\/\.]\s?(\d+)[-\/\.]\s?(\d+)$/;

    m = str.match(re);
        // invalid date
        if (m == null)
                return null;

        var iD = dateformat.indexOf("d");
        var iM = dateformat.indexOf("M");
        var iY = dateformat.indexOf("y");
        var inds = new Array(iD, iM, iY);

        for (i=0; i<=2; i++)
        {
                if (inds[i] == Math.max(iD, iM, iY))
                        inds[i] = 3;
                else
                if (inds[i] == Math.min(iD, iM, iY))
                        inds[i] = 1;
                else
                        inds[i] = 2;
        }

        var day = m[inds[0]];
        var month = m[inds[1]]-1;
        var year = m[inds[2]];

    if (day < 1 || day > 31)
        return null;
    if (month < 0 || month > 11)
        return null;
    if (year < 1753 || year > 9999)
        return null;

        return new Date(year, month, day);
}

function dp_GetDateInInvariantFormat(str)
{
    var date = dp_StringToDate(str);

    if (date)
    {
        return String((date.getMonth() < 9) ? "0" + (date.getMonth() + 1) : date.getMonth() + 1) +
            "/" + String((date.getDate() < 10) ? "0" + date.getDate() : date.getDate()) + "/" + String(date.getFullYear());
    }
    else
        return "";
}

// returns string where pattern repeated number times
function GetString(pattern, number)
{
    var s = "";
    for(var i = 0; i < number; i++)
        s += pattern;

    return s;
}

function dp_SubmitValue(dt)
{
    dp_HideCalendar();

    if (dp_TextBox != null)
    {
        // to get date from given string
        dt = new Date(dt);

        var old = dp_StringToDate(dp_TextBox.value);

        // store date parameters to ease parsing
        dp_TextBox.value = dp_DateToString(dt);

        var postback = dp_TextBox.getAttribute("AutoPostBack");
        if (postback && postback.length > 0)
        {
            dt = new Date(dt);
            if (old == null || dt.getTime() != old.getTime())
                eval(postback);
        }
    }

    if (dp_Callback != null)
      dp_Callback(dp_TextBox);
}

function dp_Validate(e)
{
    if (!e) var e = window.event;
    var tb = dp_GetEventSrc(e);

    if (tb.value.length == 0)
        return;

    var value = dp_StringToDate(tb.value);
}

function dp_AddDays(date, days)
{
        return new Date(date.valueOf() + days * 86400000);        //24 * 60 * 60 * 1000
}

/// DateRange related functions
function dr_IncrementDates(id, days)
{
    var dates = dr_GetDateValues(id);
    var boxes = dr_GetDateTextboxes(id);

    if (dates.start && dates.end)
    {
        dates = {start:dp_AddDays(dates.start, days), end:dp_AddDays(dates.end, days)};
        boxes.start.value = dp_DateToString(dates.start);
        boxes.end.value = dp_DateToString(dates.end);
    }

    return dates;
}

function dr_SetDates(id, date, difference)
{
    var boxes = dr_GetDateTextboxes(id);

    var date = new Date(date);

    boxes.start = dp_DateToString(date);
    boxes.end = dp_DateToString(dp_AddDays(aDate, difference));
}

function dr_GetDateValues(id)
{
    var start = document.getElementById(id + "_BD_TB");
    var end = document.getElementById(id + "_ED_TB");

    return {start:dp_StringToDate(start.value), end:dp_StringToDate(end.value)};
}

function dr_GetDateTextboxes(id)
{
    return {start:document.getElementById(id + "_BD_TB"), end:document.getElementById(id + "_ED_TB")};
}
