﻿var G_currentYear = 2008;
var G_currentMonth = 3;
var G_currentDay = 14;

var G_selectedYear = G_currentYear;
var G_selectedMonth = G_currentMonth;
var G_selectedDay = G_currentDay;

var G_thisYear = G_currentYear;
var G_thisMonth = G_currentMonth;
var G_thisDay = G_currentDay;

var G_monthName = [
                'January', 'Ferruary','March',
                'April', 'May','June',
                'July','Auguest','September',
                'October','November','December'];
                
var G_weekDayName = ['Su','Mo','Tu','We','Th','Fr','Sa'];

var G_dayWidth = 25;
var G_dayHeight = 18;

var G_pickerCSS = "G_PickerCSS";
var G_headerCSS = "G_PickerHeaderCSS";
var G_footerCSS = "G_PickerFooterCSS";
var G_calendarCSS = "G_PickerCalendarCSS";
var G_weekDayCSS = "G_PickerWeekDayCSS";
var G_workDayCSS = "G_PickerWorkDayCSS";
var G_forbidenCSS = "G_PickerForbidenCSS";
var G_selectedCSS = "G_PickerSelectedCSS";


var G_isPickerVisible = false;
var G_dateBox;

var G_datePickerFrame;

function G_ShowDatePicker(G_dateBoxID, G_datePickerFrameID) 
{
    if (G_isPickerVisible) 
    {
        G_HideDatePicker();
        return;
    }
    G_dateBox = document.getElementById(G_dateBoxID);    
    G_datePickerFrame = document.getElementById(G_datePickerFrameID);
    
    if (G_dateBox.usedatepicker == "false") 
    {
        return;
    }
    
    if (G_IsDateValid(G_dateBox.value)) 
    {
        var dateParts = new Array( G_SplitString(G_dateBox.value, '/'));     
        
        year = parseInt( dateParts[0][2] );
        month = parseInt( dateParts[0][0] );
        day = parseInt( dateParts[0][1] );    
    
        G_ChangeDate( year, month, day);
    } 
    else 
    {
        G_ChangeDate(G_thisYear, G_thisMonth, G_thisDay);
    }
    G_isPickerVisible = true;
    G_datePickerFrame.style.width = G_dayWidth * 7 + "px";
    G_datePickerFrame.style.visibility = "visible";
    G_RenderDatePicker();
}

function G_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 G_IsLeap(year)
{
    if( year % 400 == 0 )
        return true;
    
    if( year % 100 == 0)
        return false;
        
    if( year % 4 == 0)
        return true;
    
    return false;
}

function G_IsDateValid(currentDate) 
{      
    var dateParts = new Array( G_SplitString(currentDate, '/'));

    if( dateParts[0].length != 3 )
        return false;
        
    var year = parseInt( dateParts[0][2] );
    var month = parseInt( dateParts[0][0] );
    var day = parseInt( dateParts[0][1] );            
    
    if( isNaN(year) || isNaN(month) || isNaN(day))
        return false;    

    if (year > 2100 || (year < 1900)) {
        return false;
    }
    if (month < 1 || (month > 12)) {
        return false;
    }
    if (day < 1 || (day > 31)) {
        return false;
    }
    
    var monthLen = G_GetMonthDays(year, month);
    if( day > monthLen)
        return false;
    
    return true;
}

function G_RenderDatePicker() 
{
    var footerHTML;
    var headerHTML;
    var calendarHTML;
    headerHTML = "<table style='width:100%;' class='" + G_headerCSS + "' ><tr>";
    headerHTML += "<td style='width:10px;'><span title='Next Year' style='cursor:hand;' onclick='G_ChangeYear(+1);'>\xAB</span></td>";
    headerHTML += "<td style='width:10px;'><span title='Next Month' style='cursor:hand;' onclick='G_ChangeMonth(+1);'>\u2039</span></td>";
    headerHTML += "<td><span title='Current Month'>" + G_monthName[G_currentMonth - 1] + " - " + G_currentYear + "</span></td>";
    headerHTML += "<td style='width:10px;'><span title='Prev Month' style='cursor:hand;' onclick='G_ChangeMonth(-1);'>\u203A</span></td>";
    headerHTML += "<td style='width:10px;'><span title='Prev Year' style='cursor:hand;' onclick='G_ChangeYear(-1);'>\xBB</span></td>";
    headerHTML += "</tr></table>";
    
    calendarHTML = "<table cellpadding='0' cellspacing='0'>" + G_RenderCalendar() + "</table>";
    
    
    footerHTML = "<table style='width:100%;' class='" + G_footerCSS + "'><tr>";
    footerHTML += "<td><span title='ُSelect Current Date' style='cursor:hand;' onclick='G_ChangeSlectedDate(" + G_thisYear + ", " + G_thisMonth + ", " + G_thisDay + ");'>Todey: " + G_thisDay + " " + G_monthName[G_thisMonth - 1] + " " + G_thisYear + "</span></td>";
    footerHTML += "</tr></table>";
    
    
    G_datePickerFrame.innerHTML = "<iframe src='' scrolling='no' frameborder='0' style='position: absolute; width: 100%; height: " + (G_dateBox.alwaysOnTop == "true" ? G_dayHeight * 10 : 0) + "px; border: none; display: block; z-index: 0;'></iframe><div style='position: absolute; z-index: 0'><table style='direction:ltr; text-align: center;' class='" + G_pickerCSS + "'><tr><td>" + headerHTML + "</td></tr><tr><td>" + calendarHTML + "</td></tr><tr><td>" + footerHTML + "</td></tr></table></div>";

}


function G_RenderCalendar() 
{
    var result = "<tr>";
    var weekResult = "";
    var monthDayIndex = 0;
    
    var monthStartDay = G_GetMonthStartDay(G_currentYear, G_currentMonth);
    
    var monthDays = G_GetMonthDays(G_currentYear, G_currentMonth);
    for (dayIndex = 0; dayIndex < 7; dayIndex++) {
        weekResult = "<td class=\"" + G_weekDayCSS + 
        "\"><span>" + G_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=\"" + G_calendarCSS + 
                "\" style=\"width:" + G_dayWidth + "px;height:" + 
                G_dayHeight + "px;\" >&nbsp;</td>" + weekResult;
            } else {
                weekResult = "<td class=\"" + ( G_currentYear == G_selectedYear &&
                    G_currentMonth == G_selectedMonth &&
                    monthDayIndex == G_selectedDay ? G_selectedCSS : G_workDayCSS) + "\" style=\"width:" + 
                    G_dayWidth + "px;height:" + G_dayHeight + "px;\">" + 
                    
                    (monthDayIndex <= monthDays && monthDayIndex != 0 ? "<span title=\"" + 
                    G_GetStringDate(G_currentYear, G_currentMonth, monthDayIndex) + "\" " + 
                    ("style=\"cursor:hand;\" onclick=\"G_ChangeSlectedDate(" + 
                    G_currentYear + ", " + G_currentMonth + ", " + monthDayIndex + ");\"") + ">" + 
                     monthDayIndex + "</span>" : "") + "</td>" + weekResult;
            }
        }
        result += weekResult + "</tr>";
        if (monthDayIndex >= monthDays) {
            weekIndex++;
        }
    }
    return result;
}


function G_GetMonthStartDay(year, month) 
{
    var d = new Date(year, month-1, 1);  
    return d.getDay();           
}


function G_HideDatePicker() 
{
    G_isPickerVisible = false;
    G_datePickerFrame.innerHTML = "";
    G_datePickerFrame.style.visibility = "hidden";
}


function G_GetMonthDays(year, month) 
{
    if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12 )
        return 31;
    
    if( month == 4 || month == 6 || month == 1 || month == 9 || month == 11 )
        return 30;
        
    if( G_IsLeap(year) && month == 2 )    
        return 29;
    else
        return 28;   
}


function G_ChangeSlectedDate(year, month, day) 
{
    G_ChangeDate(year, month, day);
    G_dateBox.value = G_GetStringDate(year, month, day);
    G_HideDatePicker();
}


function G_ChangeDate(year, month, day) 
{
    G_currentYear = G_selectedYear = year;
    G_currentMonth = G_selectedMonth = month;
    G_currentDay = G_selectedDay = day;
}


function G_GetStringDate(year, month, day) 
{
    var result = "";
    result += month + "/";
    result += day + "/";    
    result += year ;
    
    return result;
}


function G_ChangeYear(count) 
{
    G_currentYear += count;
    if (G_currentYear == 999) 
    {
        G_currentYear = 9999;
    }
    if (G_currentYear == 10000) 
    {
        G_currentYear = 1000;
    }
    G_RenderDatePicker();
}


function G_ChangeMonth(count) 
{
    G_currentMonth += count;
    if (G_currentMonth == 13) 
    {
        G_ChangeYear(1);
        G_currentMonth = 1;
    }
    if (G_currentMonth == 0) 
    {
        G_ChangeYear(-1);
        G_currentMonth = 12;
    }
    G_RenderDatePicker();
}

if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();
