﻿var currentYear = 1384;
var currentMonth = 10;
var currentDay = 4;

var selectedYear = currentYear;
var selectedMonth = currentMonth;
var selectedDay = currentDay;

var thisYear = currentYear;
var thisMonth = currentMonth;
var thisDay = currentDay;

var monthName = ['فروردين','ارديبهشت','خرداد','تير','مرداد','شهريور','مهر','آبان','آذر','دي','بهمن','اسفند'];
var weekDayName = ['ش','ي','د','س','چ','پ','ج'];

var dayWidth = 25;
var dayHeight = 18;

var pickerCSS = "PickerCSS";
var headerCSS = "PickerHeaderCSS";
var footerCSS = "PickerFooterCSS";
var calendarCSS = "PickerCalendarCSS";
var weekDayCSS = "PickerWeekDayCSS";
var workDayCSS = "PickerWorkDayCSS";
var selectedCSS = "PickerSelectedCSS";

var isPickerVisible = false;
var dateBox;
var datePickerFrame;

function ShowDatePicker(dateBoxID, datePickerFrameID) 
{
    if (isPickerVisible) 
    {
        HideDatePicker();
        return;
    }
    
    dateBox = document.getElementById(dateBoxID);    
    datePickerFrame = document.getElementById(datePickerFrameID);
    
    if (IsDateValid(dateBox.value)) 
    {
        var dateParts = new Array( SplitString(dateBox.value, '/'));     
        
        year = parseInt( dateParts[0][0] );
        month = parseInt( dateParts[0][1] );
        day = parseInt( dateParts[0][2] );    
    
        ChangeDate( year, month, day);
    } 
    else 
    {
        ChangeDate(thisYear, thisMonth, thisDay);
    }
    isPickerVisible = true;
    datePickerFrame.style.width = dayWidth * 7 + "px";
    datePickerFrame.style.visibility = "visible";
    RenderDatePicker();
}

function SplitString( st, delim )
{
    var parts = new Array();
    var text = new String(st);
    
    var currentPart = "";
    
    for( var i = 0; i < text.length; i++)
    {
        if( text.charAt(i) == delim )
        {
            parts.push( currentPart );                     
            currentPart = "";        
        }
        else
        {
            currentPart += text.charAt(i);
        }
    } 
    
    parts.push( currentPart );
    
    return parts;   
}

function IsLeap(year)
{
    if( year % 33 == 1 || year % 33 == 5 || year % 33 == 9 ||
        year % 33 == 13 || year % 33 == 17 || year % 33 == 22 ||
        year % 33 == 26 || year % 33 == 30 )
    {
        return true;    
    }
}

function IsDateValid(currentDate) 
{      
    var dateParts = SplitString(currentDate, '/');

    if( dateParts.length != 3 )
        return false;
        
    var year = parseInt( dateParts[0] );
    var month = parseInt( dateParts[1] );
    var day = parseInt( dateParts[2] );            
    
    if( isNaN(year) || isNaN(month) || isNaN(day))
        return false;    

    if (year < 1300 || (year > 1400)) {
        return false;
    }
    if (month < 1 || (month > 12)) {
        return false;
    }
    if (day < 1 || (day > 31)) {
        return false;
    }
    if (month > 6 && (day > 30)) {
        return false;
    }
    if (  !IsLeap(year) && month == 12 && (day == 30)) {
        return false;
    }
    
    return true;
}

function RenderDatePicker() 
{
    var footerHTML;
    var headerHTML;
    var calendarHTML;
    headerHTML = "<table style='width:100%;' class='" + headerCSS + "'><tr>";
    headerHTML += "<td style='width:10px;'><span title='\u0633\u0627\u0644 \u0628\u0639\u062F' style='cursor:hand;' onclick='ChangeYear(+1);'>\xAB</span></td>";
    headerHTML += "<td style='width:10px;'><span title='\u0645\u0627\u0647 \u0628\u0639\u062F' style='cursor:hand;' onclick='ChangeMonth(+1);'>\u2039</span></td>";
    headerHTML += "<td><span title='\u0645\u0627\u0647 \u062C\u0627\u0631\u06CC'>" + monthName[currentMonth - 1] + " - " + ChangeStringToHindi(currentYear) + "</span></td>";
    headerHTML += "<td style='width:10px;'><span title='\u0645\u0627\u0647 \u0642\u0628\u0644' style='cursor:hand;' onclick='ChangeMonth(-1);'>\u203A</span></td>";
    headerHTML += "<td style='width:10px;'><span title='\u0633\u0627\u0644 \u0642\u0628\u0644' style='cursor:hand;' onclick='ChangeYear(-1);'>\xBB</span></td>";
    headerHTML += "</tr></table>";
    footerHTML = "<table style='width:100%;' class='" + footerCSS + "'><tr>";
    footerHTML += "<td><span title='\u0627\u0646\u062A\u062E\u0627\u0628 \u0631\u0648\u0632 \u062C\u0627\u0631\u06CC' style='cursor:hand;' onclick='ChangeSlectedDate(" + thisYear + ", " + thisMonth + ", " + thisDay + ");'>\u0627\u0645\u0631\u0648\u0632 " + ChangeStringToHindi(thisDay) + " " + monthName[thisMonth - 1] + " " + ChangeStringToHindi(thisYear) + "</span></td>";
    footerHTML += "</tr></table>";
    calendarHTML = "<table cellpadding='0' cellspacing='0'>" + RenderCalendar() + "</table>";
    datePickerFrame.innerHTML = "<div style='position: absolute; z-index: 1;' ><table style='direction:ltr; text-align: center;' class='" + pickerCSS + "'><tr><td>" + headerHTML + "</td></tr><tr><td>" + calendarHTML + "</td></tr><tr><td>" + footerHTML + "</td></tr></table></div>";
}


function RenderCalendar() 
{
    var result = "<tr>";
    var weekResult = "";
    var monthDayIndex = 0;
    var monthStartDay = GetMonthStartDay(currentYear, currentMonth);
    var monthDays = GetMonthDays(currentYear, currentMonth);
    for (dayIndex = 0; dayIndex < 7; dayIndex++) {
        weekResult = "<td class='" + weekDayCSS + 
        "'><span>" + weekDayName[dayIndex] + "</span></td>" + weekResult;
    }
    result += weekResult + "</tr>";
    for (weekIndex = 0; weekIndex < 6; weekIndex++) {
        result += "<tr>";
        weekResult = "";
        for (dayIndex = 0; dayIndex < 7; dayIndex++) {
            if (monthDayIndex == 0) {
                if (monthStartDay == dayIndex) {
                    monthDayIndex++;
                }
            } else {
                monthDayIndex++;
            }
            
            if (monthDayIndex == 0 || monthDayIndex > monthDays) {
                weekResult = "<td class='" + calendarCSS + 
                "' style='width:" + dayWidth + "px;height:" + 
                dayHeight + "px;' >&nbsp;</td>" + weekResult;
            } else {
                weekResult = "<td class='" + ( currentYear == selectedYear &&
                    currentMonth == selectedMonth &&
                    monthDayIndex == selectedDay ? selectedCSS : workDayCSS) + "' style='width:" + 
                    dayWidth + "px;height:" + dayHeight + "px;'>" + 
                    
                    (monthDayIndex <= monthDays && monthDayIndex != 0 ? "<a href='#' title='" + 
                    GetStringDate(currentYear, currentMonth, monthDayIndex) + "' " + 
                    ("style='text-decoration:none;color:black' onclick='ChangeSlectedDate(" + 
                    currentYear + ", " + currentMonth + ", " + monthDayIndex + "); return false;'") + ">" + 
                    ChangeStringToHindi( monthDayIndex) + "</a>" : "") + "</td>" + weekResult;
            }
        }
        result += weekResult + "</tr>";
        if (monthDayIndex >= monthDays) {
            weekIndex++;
        }
    }
    return result;
}

function ChangeStringToHindi(s)
{    
    var text = new String(s);
    var result = "";
    
    for( var i = 0; i < text.length; i++)
    {       
       result += ChangeToHindi( text.charAt(i));
    }    
    return result;
}

function ChangeToHindi(d)
{
    switch(d)
    {
        case '0':
            return '\u0660';
        case '1':
            return '\u0661';
        case '2':
            return '\u0662';
        case '3':
            return '\u0663';            
        case '4':
            return '\u0664';
        case '5':
            return '\u0665';        
        case '6':
            return '\u0666';
        case '7':
            return '\u0667';            
        case '8':
            return '\u0668';
        case '9':
            return '\u0669';        
        default:
            return d;
    }
}

function GetMonthStartDay(year, month) 
{
    var yearStartDay = 1;
    var yearIndex = year % 28;
    for (index = 1; index <= yearIndex; index++) {
        yearStartDay += ((index % 4) == 0 ? 2 : 1);
    }
    for (index = 1; index < month; index++) {
        yearStartDay += GetMonthDays(year, index);
    }
    return yearStartDay % 7;
}


function HideDatePicker() 
{
    isPickerVisible = false;
    datePickerFrame.innerHTML = "";
    datePickerFrame.style.visibility = "hidden";
}


function GetMonthDays(year, month) {
    if (month >= 1 && month <= 6) {
        return 31;
    }
    if (month >= 7 && month <= 11) {
        return 30;
    }
    if ( !IsLeap(year) ) {
        return 29;
    }
    return 30;
}


function ChangeSlectedDate(year, month, day) 
{
    ChangeDate(year, month, day);
    dateBox.value = GetStringDate(year, month, day);
    HideDatePicker();
}


function ChangeDate(year, month, day) 
{
    currentYear = selectedYear = year;
    currentMonth = selectedMonth = month;
    currentDay = selectedDay = day;
}


function GetStringDate(year, month, day) 
{
    var result = "";
    result += year + "/";
    result += month + "/";
    result += day;
    return result;
}


function ChangeYear(count) 
{
    currentYear += count;
    if (currentYear == 999) 
    {
        currentYear = 9999;
    }
    if (currentYear == 10000) 
    {
        currentYear = 1000;
    }
    RenderDatePicker();
}


function ChangeMonth(count) 
{
    currentMonth += count;
    if (currentMonth == 13) 
    {
        ChangeYear(1);
        currentMonth = 1;
    }
    if (currentMonth == 0) 
    {
        ChangeYear(-1);
        currentMonth = 12;
    }
    RenderDatePicker();
}

if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();
