var Calendar = {
    
    dateFormat:'dd.mm.yyyy', 
    
    nInputDay:0,
    nInputMonth:0,
    nInputYear:0,
    
    nCurrentDay:0,
    nCurrentMonth:0,
    nCurrentYear:0,    
    
    pDateField:null,
    
    bDecreaseYear:false,
    
    init:function()
    {
        // preload controls
        var controls = new Image(200, 49); 
        controls.src = strRootPath + "javascripts/calendar/calendar.gif";
    },

    display:function(pDateField, language, dateFormat)
    {        
        if($('#Calendar').length)
        {
            return;
        }
        
        Calendar.pDateField = pDateField;
        
        if(!language)
        {
            language = 'en';
        }
                
        if(!dateFormat)
        {
            dateFormat = Calendar.dateFormat;
        }
        else
        {
            Calendar.dateFormat = dateFormat;
        }
        
        Calendar.initLanguage(language);
         
        if(pDateField.value.match(/(\d{1,2})\.(\d{1,2})\.(1|2)(\d{3})/))
        {      
            var dayPos = dateFormat.indexOf('dd'); 
            Calendar.nCurrentDay = pDateField.value.substr(dayPos,2)/1;
            
            var monthPos = dateFormat.indexOf('mm');
            Calendar.nCurrentMonth = pDateField.value.substr(monthPos,2)/1 -1;
                
            var yearPos = dateFormat.indexOf('yyyy');
            Calendar.nCurrentYear = pDateField.value.substr(yearPos, 4)/1;  
            
            // alert(Calendar.nCurrentDay+'.'+Calendar.nCurrentMonth+'.'+Calendar.nCurrentYear);   
        }
        else
        {
            var d = new Date();
            Calendar.nCurrentDay = d.getDate()/1;
            Calendar.nCurrentMonth = d.getMonth()/1;
            Calendar.nCurrentYear = d.getFullYear()/1;
        } 
        
        Calendar.nInputDay = Calendar.nCurrentDay;
        Calendar.nInputMonth = Calendar.nCurrentMonth; 
        Calendar.nInputYear = Calendar.nCurrentYear;
        
        var pCalendar = document.createElement('div');    
        pCalendar.id = 'Calendar';
        
        var pOffset = $(pDateField).offset();
        if($('.popup').length)
        {
            $('.popup').append(pCalendar); 
            var nLeft = pOffset.left - $('.popup').offset().left + $(pDateField).width() + 10;
            var nTop = pOffset.top - $('.popup').offset().top;
        }
        else
        {
            $('body').append(pCalendar);
            var nLeft = pOffset.left + $(pDateField).width() + 10;
            var nTop = pOffset.top;
        }

        $(pCalendar).css({'left':nLeft, 'top':nTop});

        Calendar.writeTopBar(Calendar.monthArray[Calendar.nCurrentMonth], Calendar.nCurrentYear);
        Calendar.writeCalendarContent(Calendar.nCurrentMonth, Calendar.nCurrentYear);
        Calendar.writeBottomBar();

        //returnFormat = strDateFormat;
        //returnDateTo = pDateField;
        //positionCalendar(buttonObj);
        //calendarDiv.style.visibility = 'visible';    
        //calendarDiv.style.display = 'block';    
        
        //updateYearDiv();
        //updateMonthDiv(); 
        
        $('#Calendar').css({opacity:0, display:'block'}).animate({opacity: 1.0}, 100, function(){ $(this).css('opacity', ''); });   
    },
    
    initLanguage:function(strLanguage)
    {
        if(Calendar.monthArray)
        {
            return;
        }
        switch(strLanguage)
        {
            case "en":    /* English */
                Calendar.monthArray = ['January','February','March','April','May','June','July','August','September','October','November','December'];
                Calendar.dayArray = ['Mon','Tue','Wed','Thu','Fri','Sat','Sun'];
                Calendar.weekString = 'Week';
                Calendar.todayString = 'Today is';
            break;
                
            case "bg":    /* Bulgarian */
                Calendar.monthArray = ['Януари','Февруари','Март','Април','Май','Юни','Юли','Август','Септември','Октомври','Ноември','Декември'];
                Calendar.dayArray = ['П','В','С','Ч','П','С','Н'];
                Calendar.weekString = '&nbsp;';
                Calendar.todayString = 'Днес е';
            break;
        }
    },
    
    isLeapYear:function(inputYear)
    {
        if(inputYear%400==0||(inputYear%4==0 && inputYear%100!=0)) return true;
        return false;    
    },
    
    writeTopBar:function(strnCurrentMonth, strCurrentYear)
    {    
        $('#Calendar').append('<div class="TopBar"><div class="PreviousMonth"></div><div class="NextMonth"></div><div class="SelectMonth">' + strnCurrentMonth + '</div><div class="SelectYear">' + strCurrentYear + '</div><div class="CloseCalendar"></div><div class="clear"></div></div>');

        $('#Calendar .TopBar .PreviousMonth').mouseover(function(){ $(this).css({'background-position':'0 -16px'}); }); 
        $('#Calendar .TopBar .PreviousMonth').mouseout(function(){ $(this).css({'background-position':'0 0'}); });
        $('#Calendar .TopBar .PreviousMonth').mousedown(function(){ $(this).css({'background-position':'0 -32px'}); });
        $('#Calendar .TopBar .PreviousMonth').mouseup(function(){ $(this).css({'background-position':'0 -16px'}); Calendar.switchMonth('left'); });
        
        $('#Calendar .TopBar .NextMonth').mouseover(function(){ $(this).css({'background-position':'-16px -16px'}); }); 
        $('#Calendar .TopBar .NextMonth').mouseout(function(){ $(this).css({'background-position':'-16px 0'}); });
        $('#Calendar .TopBar .NextMonth').mousedown(function(){ $(this).css({'background-position':'-16px -32px'}); });
        $('#Calendar .TopBar .NextMonth').mouseup(function(){ $(this).css({'background-position':'-16px -16px'}); Calendar.switchMonth('right'); });
        
        $('#Calendar .TopBar .SelectMonth').mouseover(function(){ $(this).css({'background-position':'-40px -16px'}); }); 
        $('#Calendar .TopBar .SelectMonth').mouseout(function(){ $(this).css({'background-position':'-40px 0'}); });
        $('#Calendar .TopBar .SelectMonth').mousedown(function(){ $(this).css({'background-position':'-40px -32px'}); });
        $('#Calendar .TopBar .SelectMonth').mouseup(function(){ $(this).css({'background-position':'-40px -16px'}); Calendar.showMonthDropDown(); });
        
        $('#Calendar .TopBar .SelectYear').mouseover(function(){ $(this).css({'background-position':'-72px -16px'}); }); 
        $('#Calendar .TopBar .SelectYear').mouseout(function(){ $(this).css({'background-position':'-72px 0'}); });
        $('#Calendar .TopBar .SelectYear').mousedown(function(){ $(this).css({'background-position':'-72px -32px'}); });
        $('#Calendar .TopBar .SelectYear').mouseup(function(){ $(this).css({'background-position':'-72px -16px'}); Calendar.showYearDropDown(); });

        $('#Calendar .TopBar .CloseCalendar').mouseover(function(){ $(this).css({'background-position':'-117px -16px'}); }); 
        $('#Calendar .TopBar .CloseCalendar').mouseout(function(){ $(this).css({'background-position':'-117px 0'}); });
        $('#Calendar .TopBar .CloseCalendar').mousedown(function(){ $(this).css({'background-position':'-117px -32px'}); });
        $('#Calendar .TopBar .CloseCalendar').mouseup(function(){ $(this).css({'background-position':'-117px -16px'}); Calendar.closeCalendar(); });
    },

    writeCalendarContent:function(nCurrentMonth, nCurrentYear)
    {        
        nCurrentMonth = parseInt(nCurrentMonth);
        nCurrentYear = parseInt(nCurrentYear);
        
        var d = new Date();
 
        var nThisDay = parseInt(d.getDate());
        var nThisMonth = parseInt(d.getMonth());
        var nThisYear = parseInt(d.getFullYear());  
        
        d.setFullYear(nCurrentYear);        
        d.setDate(1);        
        d.setMonth(nCurrentMonth);
        
        var dayStartOfMonth = d.getDay();
        if(dayStartOfMonth == 0) dayStartOfMonth = 7;
        dayStartOfMonth--;          
        
        $('#Calendar table').remove();
        
        var calTable = document.createElement('table');
        calTable.cellSpacing = '1';
        //$('#Calendar').append(calTable);
        $('#Calendar .TopBar').after(calTable);
        var calTBody = document.createElement('tbody');
        calTable.appendChild(calTBody);
        var row = calTBody.insertRow(-1);
        var cell = row.insertCell(-1);
        cell.innerHTML = Calendar.weekString;
        cell.className = 'Week'; 
        
        // draw week days
        for(var no=0; no<Calendar.dayArray.length; no++)
        {
            var cell = row.insertCell(-1);
            cell.innerHTML = Calendar.dayArray[no]; 
        }
        
        var row = calTBody.insertRow(-1);
        var cell = row.insertCell(-1);
        var week = Calendar.getWeek(nCurrentYear, nCurrentMonth, 1);
        cell.innerHTML = week;        // Week
        cell.className = 'Week';
        for(var no=0;no<dayStartOfMonth;no++)
        {
            var cell = row.insertCell(-1);
            cell.innerHTML = '&nbsp;';
        }
        
        var daysInMonthArray = new Array(31,28,31,30,31,30,31,31,30,31,30,31)

        var colCounter = dayStartOfMonth;
        var daysInMonth = daysInMonthArray[nCurrentMonth];
        if(daysInMonth==28)
        {
            if(Calendar.isLeapYear(Calendar.nCurrentYear)) daysInMonth=29;
        }
        
        for(var no=1; no<=daysInMonth; no++)
        {
            d.setDate(no-1);
            if(colCounter>0 && colCounter%7==0)
            {
                var row = calTBody.insertRow(-1);
                var cell = row.insertCell(-1); 
                var week = Calendar.getWeek(nCurrentYear, nCurrentMonth, no);
                cell.innerHTML = week;        // Week  
                cell.className = 'Week';                 
            }
            var cell = row.insertCell(-1); 
            cell.innerHTML = no;
            cell.style.cursor = 'pointer';
        
            if(nCurrentYear == nThisYear && nCurrentMonth == nThisMonth && no == nThisDay) 
            {
                $(cell).css({'border':'1px solid #EEE', 'background-color':'#EEE', 'color':'#FF0000'});
                $(cell).mouseover(function() {
                    $(this).css('border', '1px solid #d20008');
                }); 
                $(cell).mouseout(function() {
                    $(this).css('border', '1px solid #EEE');
                });            
            }
            else if(nCurrentYear == Calendar.nInputYear && nCurrentMonth == Calendar.nInputMonth && no == Calendar.nInputDay)
            { 
                $(cell).css('border', '1px solid #CCC');
                $(cell).mouseover(function() {
                    $(this).css('border', '1px solid #d20008');
                }); 
                $(cell).mouseout(function() {
                    $(this).css('border', '1px solid #CCC');
                });
            }
            else
            {
                $(cell).mouseover(function() {
                    $(this).css('border', '1px solid #d20008');
                }); 
                $(cell).mouseout(function() {
                    $(this).css('border', '1px solid #FFF');
                });
            }   
            cell.onclick = Calendar.pickDate; 
            colCounter++;
        }
    },
    
    writeBottomBar:function()
    {
        var d = new Date();
        var pBottomBar = document.createElement('div');
        pBottomBar.onclick = Calendar.pickTodaysDate;
        pBottomBar.className = 'TodayBar';
        
        var day = d.getDay();
        if(day == 0) { day = 7; }
        day--;
        
        pBottomBar.innerHTML = Calendar.todayString + ' ' + d.getDate() + ' ' + Calendar.monthArray[d.getMonth()] + ' ' +  d.getFullYear();
        $('#Calendar').append(pBottomBar);    
    },
    
    // This function is from http://www.codeproject.com/csharp/gregorianwknum.asp
    // Only changed the month add
    getWeek:function(year, month, day)
    {
        day = parseInt(day);
        year = parseInt(year);
        month = parseInt(month) + 1; //use 1-12
        var a = Math.floor((14-(month))/12);
        var y = year+4800-a;
        var m = (month)+(12*a)-3;
        var jd = day + Math.floor(((153*m)+2)/5) + 
                     (365*y) + Math.floor(y/4) - Math.floor(y/100) + 
                     Math.floor(y/400) - 32045;      // (gregorian calendar)
        var d4 = (jd+31741-(jd%7))%146097%36524%1461;
        var L = Math.floor(d4/1460);
        var d1 = ((d4-L)%365)+L;
        NumberOfWeek = Math.floor(d1/7) + 1;
        return NumberOfWeek;        
    },
    
    pickDate:function(e, inputDay)
    {
        var month = Calendar.nCurrentMonth + 1;
        if(month<10)month = '0' + month;
        var day;
        if(!inputDay && this)
        {
            day = this.innerHTML;
        }
        else 
        {
            day = inputDay;
        }
        
        if(parseInt(day)<10)day = '0' + day;
        
        if(Calendar.dateFormat)
        {
            var returnFormat = Calendar.dateFormat;
            returnFormat = returnFormat.replace('dd', day);
            returnFormat = returnFormat.replace('mm', month);
            returnFormat = returnFormat.replace('yyyy', Calendar.nCurrentYear);
            Calendar.pDateField.value = returnFormat;
        }
        Calendar.closeCalendar();
    },

    pickTodaysDate:function()
    {
        var d = new Date();
        Calendar.nCurrentMonth = d.getMonth()/1;
        Calendar.nCurrentYear = d.getFullYear()/1;
        Calendar.pickDate(false, d.getDate()/1);
    },
    
    closeCalendar:function()
    {
        $('#Calendar').animate({opacity:0}, 100, function(){ $('#Calendar').remove(); });
    },
    
    selectMonth:function()
    {
        $('#Calendar .SelectMonth').html($(this).html());
        Calendar.nCurrentMonth = this.id.replace(/[^\d]/g, '')/1;
        Calendar.writeCalendarContent(Calendar.nCurrentMonth, Calendar.nCurrentYear);
        $('#Calendar .TopBar .MonthDropDown').animate({opacity:0}, 100, function(){ $(this).remove(); });
    },

    selectYear:function()
    {
        $('#Calendar .SelectYear').html($(this).html());
        Calendar.nCurrentYear = this.innerHTML.replace(/[^\d]/g, '')/1;
        Calendar.writeCalendarContent(Calendar.nCurrentMonth, Calendar.nCurrentYear);
        $('#Calendar .TopBar .YearDropDown').animate({opacity:0}, 100, function(){ $(this).remove(); });
    },

    switchMonth:function(strDir)
    {
        if($('#Calendar .TopBar .MonthDropDown').length)
        {
            $('#Calendar .TopBar .MonthDropDown').animate({opacity:0}, 100, function(){ $(this).remove(); });
        }
        
        if($('#Calendar .TopBar .YearDropDown').length)
        {
            $('#Calendar .TopBar .YearDropDown').animate({opacity:0}, 100, function(){ $(this).remove(); });
        }
        
        if(strDir == 'left')
        {
            Calendar.nCurrentMonth--;
            if(Calendar.nCurrentMonth < 0)
            {
                Calendar.nCurrentMonth = 11;
                Calendar.nCurrentYear = Calendar.nCurrentYear-1;
            }
        }
        else
        {
            Calendar.nCurrentMonth++;
            if(Calendar.nCurrentMonth > 11)
            {
                Calendar.nCurrentMonth = 0;
                Calendar.nCurrentYear = Calendar.nCurrentYear+1;
            }    
        }
        $('#Calendar .SelectMonth').html(Calendar.monthArray[Calendar.nCurrentMonth]);
        $('#Calendar .SelectYear').html(Calendar.nCurrentYear);        
        Calendar.writeCalendarContent(Calendar.nCurrentMonth, Calendar.nCurrentYear);    
    },

    showMonthDropDown:function()
    {
        if($('#Calendar .TopBar .YearDropDown').length)
        {
            $('#Calendar .TopBar .YearDropDown').animate({opacity:0}, 100, function(){ $(this).remove(); });
        }
        
        if($('#Calendar .TopBar .MonthDropDown').length)
        {
            $('#Calendar .TopBar .MonthDropDown').animate({opacity:0}, 100, function(){ $(this).remove(); });
            return;
        }
        
        var div = document.createElement('div');
        div.className = 'MonthDropDown';
        
        $(div).css({opacity:0});
        
        for(var no=0; no<Calendar.monthArray.length; no++)
        {
            var subDiv = document.createElement('div');
            subDiv.innerHTML = Calendar.monthArray[no];
            subDiv.onmouseover = function () { this.style.backgroundColor = '#EEE'; };
            subDiv.onmouseout = function () { this.style.backgroundColor = '#FFF'; }; 
            subDiv.onclick = Calendar.selectMonth;
            subDiv.id = 'monthDiv_' + no;
            // subDiv.onselectstart = cancelCalendarEvent;        
            div.appendChild(subDiv);

            if(Calendar.nCurrentMonth == no)
            {
                subDiv.style.color = '#FF0000';
                // activeSelectBoxMonth = subDiv;
            }   
        }  
        $('#Calendar .TopBar').append(div);
        
        $(div).animate({opacity: 1.0}, 100, function(){ $(this).css('opacity', ''); });  
    },
    
    showYearDropDown:function()
    {
        if($('#Calendar .TopBar .MonthDropDown').length)
        {
            $('#Calendar .TopBar .MonthDropDown').animate({opacity:0}, 100, function(){ $(this).remove(); });
        }
        
        if($('#Calendar .TopBar .YearDropDown').length)
        {
            $('#Calendar .TopBar .YearDropDown').animate({opacity:0}, 100, function(){ $(this).remove(); });
            return;
        }
        
        var div = document.createElement('div');
        div.className = 'YearDropDown';
        
        $(div).css({opacity:0});   
        
        var d = new Date();
        if(Calendar.nCurrentYear){
            d.setFullYear(Calendar.nCurrentYear);    
        }

        var startYear = parseInt(d.getFullYear()) - 4;
        
        var pDecreaseYear = document.createElement('div');
        pDecreaseYear.className = 'DecreaseYear';
        $(pDecreaseYear).mouseover(function() { $(this).css({'background-position':'-167px -11px'}); Calendar.bDecreaseYear = true; setTimeout(Calendar.startDecreaseYear, 200); });
        $(pDecreaseYear).mouseout(function() { $(this).css({'background-position':'-167px 0'}); Calendar.bDecreaseYear = false; });
        div.appendChild(pDecreaseYear); 
        
        var pYearsDiv = document.createElement('div');
        pYearsDiv.className = 'Years';
        div.appendChild(pYearsDiv);
        
        for(var i = startYear; i<(startYear+9); i++)
        {
            var subDiv = document.createElement('div');  
            subDiv.innerHTML = i;
            $(subDiv).mouseover(function() { this.style.backgroundColor = '#EEE'; });
            $(subDiv).mouseout(function() { this.style.backgroundColor = '#FFF'; }); 
            subDiv.onclick = Calendar.selectYear;      
            pYearsDiv.appendChild(subDiv);
            if(Calendar.nCurrentYear == i){
                subDiv.style.color = '#FF0000';
            }            
        }
        
        var pIncreaseYear = document.createElement('div');
        pIncreaseYear.className = 'IncreaseYear';
        $(pIncreaseYear).mouseover(function() { $(this).css({'background-position':'-134px -11px'}); Calendar.bIncreaseYear = true; setTimeout(Calendar.startIncreaseYear, 200); });
        $(pIncreaseYear).mouseout(function() { $(this).css({'background-position':'-134px 0'}); Calendar.bIncreaseYear = false; });
        div.appendChild(pIncreaseYear);

        $('#Calendar .TopBar').append(div);
        
        $(div).animate({opacity: 1.0}, 100, function(){ $(this).css('opacity', ''); });
    },
    
    startDecreaseYear:function()
    {         
        if(Calendar.bDecreaseYear)
        {
            $('#Calendar .TopBar .DecreaseYear').css({'background-position':'-167px -22px'});
            Calendar.decreaseYear();
        }
    },
    
    decreaseYear:function()
    {
        $('#Calendar .TopBar .Years div:last').remove();
        var nLastYear = parseInt($('#Calendar .TopBar .Years div:first').html()) - 1;
        
        var subDiv = document.createElement('div');  
        subDiv.innerHTML = nLastYear;
        $(subDiv).mouseover(function () { this.style.backgroundColor = '#EEE'; });
        $(subDiv).mouseout(function () { this.style.backgroundColor = '#FFF'; }); 
        subDiv.onclick = Calendar.selectYear;     
        $('#Calendar .TopBar .Years').prepend(subDiv); 
        if(Calendar.nCurrentYear == nLastYear){
            $('#Calendar .TopBar .Years div:first').css('color', '#FF0000');
        }
        
        if(Calendar.bDecreaseYear)
        {
            setTimeout(Calendar.decreaseYear, 50);
        }    
    },
    
    startIncreaseYear:function()
    {         
        if(Calendar.bIncreaseYear)
        {
            $('#Calendar .TopBar .IncreaseYear').css({'background-position':'-134px -22px'});
            Calendar.increaseYear();
        }
    },
    
    increaseYear:function()
    {
        $('#Calendar .TopBar .Years div:first').remove();
        var nLastYear = parseInt($('#Calendar .TopBar .Years div:last').html()) + 1;
        
        var subDiv = document.createElement('div');  
        subDiv.innerHTML = nLastYear;
        subDiv.onmouseover = function () { this.style.backgroundColor = '#EEE'; };
        subDiv.onmouseout = function () { this.style.backgroundColor = '#FFF'; };  
        subDiv.onclick = Calendar.selectYear;    
        $('#Calendar .TopBar .Years').append(subDiv); 
        if(Calendar.nCurrentYear == nLastYear){
            $('#Calendar .TopBar .Years div:last').css('color', '#FF0000');
        }
        
        if(Calendar.bIncreaseYear)
        {
            setTimeout(Calendar.increaseYear, 50);
        }    
    }
};

$(document).ready(function() { 
    Calendar.init(); 
});
