var calendarCollection = [];
var articleCollection = [];
var stringData = "";

var isIE = (navigator.userAgent.indexOf("MSIE")!=-1 && navigator.userAgent.indexOf("Opera")==-1);

function createComponentCalendar(containerId)
{
    return (calendarCollection[containerId] = new classCalendar(containerId));
}

function classCalendar(containerId)
{
    /* SERVICE PROPERTIES */
    this.containerId = containerId;
    this.containerObj = null;
    this.state = 0;
    
    /* FORM FILED PROPERTIES */
    this.name = '';
    this.id = '';
    

    /* DATE PROPERTIES */
    this.monthArrayPath = new Array ('January','February','March','April','May','June','July','August','September','October','November','December','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
    this.datesArray = new Array (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

    /* PARAMETERS OF DISPLAYING CALENDAR */
   this.startDate = ''; 
   this.archive = '';
   this.monthArray = '';

    /* METHODS */
    this.init = __calendar_init;
    this.render = __calendar_render;
    this.show = __calendar_show;
    this.setMonth = __calendar_setMonth;
    this.setYear = __calendar_setYear;
    this.setChoosenDate = __calendar_setChoosenDate;
    this.setStartDate = __setStartDate;

    /* EVENTS */
    this.onclick = null;
}

function __calendar_init(params)
{
    this.containerObj = document.getElementById(this.containerId);
    this.name = params.name;
    this.id = (params.id) ? params.id : params.name;
    this.startDate = (params.startDate) ? params.startDate : ""; 
    this.archive = (params.archive) ? params.archive : "archive"; 
    this.monthArray = (params.months) ? params.months : new Array ('January','February','March','April','May','June','July','August','September','October','November','December'); 
    this.paramDate = new Date();
    this.choosenDate = new Date();
}

function __calendar_render()
{
    if (this.name == '')
    {
        alert('ERROR: NAME property is not defined!');
        this.containerObj.style.display = 'none';
        return false;
    }

    var html = '';
    html += '<div style="display:Block;" class="calendarLayout"></div>';

    this.containerObj.className = "calendar";
    this.containerObj.innerHTML = html;
    this.divObj = this.containerObj.getElementsByTagName("DIV")[0];
    this.setStartDate(this.startDate);
    this.show(calendarCollection["'+this.containerId+'"]);
    
}


function __calendar_show()
{
    if (typeof(pageWithDisabledElements) != "undefined" && pageWithDisabledElements) return false;
 
    var paramYear = this.paramDate.getFullYear();

    if ( ((paramYear%4==0)&&(paramYear%100 != 0)) || paramYear%400==0) {
        this.datesArray[1] = 29; // Leap Year
    } else {
        this.datesArray[1] = 28;
    }
    
    var paramMonth   = this.paramDate.getMonth();
    
    if ((paramMonth==0) || (paramMonth==2)){
    paramMonth = 1;
    }
    if ((paramMonth==3) || (paramMonth==5)){
    paramMonth = 4;
    }
     if ((paramMonth==6) || (paramMonth==8)){
    paramMonth = 7;
    }
     if ((paramMonth==9) || (paramMonth==11)){
    paramMonth = 10;
    } 
    
    var paramMonthTop   = paramMonth-1;
    var paramMonthUnder = paramMonth +1;

    var choosenYear  = this.choosenDate.getFullYear();
    var choosenMonth = this.choosenDate.getMonth();
    var choosenDay   = this.choosenDate.getDate();

    //Building html of Calendar

    var html = '<table cellpadding="0" cellspacing="0" class="mainTable" width="100%"><tr><td>';
    html += '<table width="100%" class="navigationLayoutYear" cellspacing="0"><tr>' +
                '<td nowrap>&nbsp;&nbsp;&nbsp;<a href="#" class="navigationArrowLeft" onclick=\''+(isIE? top.frames.length == 0 || top.frames[0].name == "calendarFrame" ? 'top.' : 'top.frames[1].' :'')+'__calendar_setYear.call('+(isIE? top.frames.length == 0 || top.frames[0].name == "calendarFrame" ? 'top.' : 'top.frames[1].' :'')+'calendarCollection["'+this.containerId+'"],"-1");return false;\'>&nbsp</a>&nbsp;&nbsp;</td>' +
                '<td width="100%">' +
                '<a>' + paramYear + "&nbsp;" + this.archive + '</a>' +
                '</td><td nowrap>' +
                '<a href="#" class="navigationArrowRight" onclick=\''+(isIE? top.frames.length == 0 || top.frames[0].name == "calendarFrame" ? 'top.' : 'top.frames[1].' :'')+'__calendar_setYear.call('+(isIE? top.frames.length == 0 || top.frames[0].name == "calendarFrame" ? 'top.' : 'top.frames[1].' :'')+'calendarCollection["'+this.containerId+'"],"+1");return false;\'>&nbsp;&nbsp;</a>&nbsp;&nbsp;&nbsp;</td>' +
                '</tr></table>';
    html += '</td></tr><tr><td>';

    html += '<table width="100%" class="navigationLayout" cellspacing="0" ><tr>' +
                 '<td nowrap>&nbsp;&nbsp;&nbsp;<a href="#" class="navigationArrowLeft" onclick=\''+(isIE? top.frames.length == 0 || top.frames[0].name == "calendarFrame" ? 'top.' : 'top.frames[1].' :'')+'__calendar_setMonth.call('+(isIE? top.frames.length == 0 || top.frames[0].name == "calendarFrame" ? 'top.' : 'top.frames[1].' :'')+'calendarCollection["'+this.containerId+'"],"-1");return false;\'>&nbsp;</a></td>' +
                 '<td width="100%" >';
    stringData = paramYear + this.monthArrayPath[paramMonthTop];
    stringData = stringData.toLowerCase();
    if (articleCollection[stringData] != null) 
    {
    html += '<a'+(' href=\"' + articleCollection[stringData] + '\" onclick=\''+(isIE? top.frames.length == 0 || top.frames[0].name == "calendarFrame" ? 'top.' : 'top.frames[1].' :'')+'__calendar_setChoosenDate.call('+(isIE? top.frames.length == 0 || top.frames[0].name == "calendarFrame" ? 'top.' : 'top.frames[1].' :'')+'calendarCollection["'+this.containerId+'"],'+paramYear+','+paramMonthTop+' ,'+0+');return true\'')+ '>'+
                '' + this.monthArray[paramMonthTop] + '&nbsp;' + paramYear + '</a>';
    }
    else
    {
    html += '<a>' + this.monthArray[paramMonthTop] + '&nbsp;' + paramYear + '</a>';
     }
    html += '</td><td nowrap>&nbsp;&nbsp;&nbsp;&nbsp;</td></tr></table>';
    html += '</td></tr><tr><td>';
    html += '<table width="100%" class="daysLayout"><tr>';
 
  //Displaying days.
        var numberOfRows = (this.datesArray[paramMonthTop])/7;
        for (var i=0;i<numberOfRows;i++) {
            for (var j=0;j<7;j++) {
                var day = i*7+j+1;
                    stringData = paramYear + this.monthArrayPath[paramMonthTop] +  day ;
	        stringData = stringData.toLowerCase();
                var isChoosenDay = (day==choosenDay && paramMonthTop == choosenMonth && paramYear == choosenYear && articleCollection[stringData] != null &&  this.state == 1);
                if (day<1 || day>this.datesArray[paramMonthTop]) {
                    html += '<td>&nbsp;</td>';
                } 
	    else {
                    html += '<td class="';
                    if (isChoosenDay) {
                            html += 'selectedDay';
                    }
                    html += '">';
                    if (articleCollection[stringData] != null) {
         	                        html += '<a'+(' href=\"' + articleCollection[stringData] + '\" onclick=\''+(isIE? top.frames.length == 0 || top.frames[0].name == "calendarFrame" ? 'top.' : 'top.frames[1].' :'')+'__calendar_setChoosenDate.call('+(isIE? top.frames.length == 0 || top.frames[0].name == "calendarFrame" ? 'top.' : 'top.frames[1].' :'')+'calendarCollection["'+this.containerId+'"],'+paramYear+','+paramMonthTop+' ,'+day+');return true\'')+ '>';
        	        		html += day;
                    	            html += '</a>';
        	        }
	        else{
                   	            html += day;
	        } 
                    html += '</td>';
           	    }
            }
            html += '</tr>';
            if (i!=numberOfRows-1) html += '<tr>';
        }
    html += '</table>';

// Second Calendar
    html += '</td></tr><tr><td>';
    html += '<table width="100%" class="navigationLayout" cellspacing="0"><tr>' +
                '<td width="100%">';
    stringData = paramYear + this.monthArrayPath[paramMonth];
    stringData = stringData.toLowerCase();
    if (articleCollection[stringData] != null) 
    {
    html += '<a'+(' href=\"' + articleCollection[stringData] + '\" onclick=\''+(isIE? top.frames.length == 0 || top.frames[0].name == "calendarFrame" ? 'top.' : 'top.frames[1].' :'')+'__calendar_setChoosenDate.call('+(isIE? top.frames.length == 0 || top.frames[0].name == "calendarFrame" ? 'top.' : 'top.frames[1].' :'')+'calendarCollection["'+this.containerId+'"],'+paramYear+','+paramMonth+' ,'+0+');return true\'')+ '>'+
                '' + this.monthArray[paramMonth] + '&nbsp;' + paramYear + '</a>';
    }
    else
    {
    html += '<a>' + this.monthArray[paramMonth] + '&nbsp;' + paramYear + '</a>';
     }
    html +='</td></tr></table>';
    html += '</td></tr><tr><td>';
    html += '<table width="100%" class="daysLayout"><tr>';

    //Displaying days.
        var numberOfRows = (this.datesArray[paramMonth])/7;
        for (var i=0;i<numberOfRows;i++) {
            for (var j=0;j<7;j++) {
                var day = i*7+j+1;
	        stringData = paramYear + this.monthArrayPath[paramMonth] + day ;
	        stringData = stringData.toLowerCase();
                var isChoosenDay = (day==choosenDay && paramMonth == choosenMonth && paramYear == choosenYear && articleCollection[stringData] != null &&  this.state == 1);
                if (day<1 || day>this.datesArray[paramMonth]) {
                    html += '<td>&nbsp;</td>';
                }
	    else {
	        html += '<td class="';
                    if (isChoosenDay) {
                            html += 'selectedDay';
                    }
                    html += '">';
	        if (articleCollection[stringData] != null) {
           		  html += '<a'+(' href=\"' + articleCollection[stringData] + '\" onclick=\''+(isIE? top.frames.length == 0 || top.frames[0].name == "calendarFrame" ? 'top.' : 'top.frames[1].' :'')+'__calendar_setChoosenDate.call('+(isIE? top.frames.length == 0 || top.frames[0].name == "calendarFrame" ? 'top.' : 'top.frames[1].' :'')+'calendarCollection["'+this.containerId+'"],'+paramYear+','+paramMonth+' ,'+day+');return true\'')+'>';
		  html += day;
           		  html += '</a>';
	        }
	        else{
		  html += day;
	        } 
                    html += '</td>';
                }
            }
            html += '</tr>';
            if (i!=numberOfRows-1) html += '<tr>';
        }
    html += '</table>';
 
 // Third Calendar
       html += '</td></tr><tr><td>';
       html += '<table width="100%" class="navigationLayout" cellspacing="0"><tr>' +
                '<td width="100%">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';

    stringData = paramYear + this.monthArrayPath[paramMonthUnder];
    stringData = stringData.toLowerCase();
    if (articleCollection[stringData] != null) 
    {
    html += '<a'+(' href=\"' + articleCollection[stringData] + '\" onclick=\''+(isIE? top.frames.length == 0 || top.frames[0].name == "calendarFrame" ? 'top.' : 'top.frames[1].' :'')+'__calendar_setChoosenDate.call('+(isIE? top.frames.length == 0 || top.frames[0].name == "calendarFrame" ? 'top.' : 'top.frames[1].' :'')+'calendarCollection["'+this.containerId+'"],'+paramYear+','+paramMonthUnder+' ,'+0+');return true\'')+ '>'+
                '' + this.monthArray[paramMonthUnder] + '&nbsp;' + paramYear + '</a>';
    }
    else
    {
    html += '<a>' + this.monthArray[paramMonthUnder] + '&nbsp;' + paramYear + '</a>';
     }
 
    html += '</td><td nowrap>' +
                '<a href="#" class="navigationArrowRight" onclick=\''+(isIE? top.frames.length == 0 || top.frames[0].name == "calendarFrame" ? 'top.' : 'top.frames[1].' :'')+'__calendar_setMonth.call('+(isIE? top.frames.length == 0 || top.frames[0].name == "calendarFrame" ? 'top.' : 'top.frames[1].' :'')+'calendarCollection["'+this.containerId+'"],"+1");return false;\'>&nbsp;&nbsp;</a>&nbsp;&nbsp;&nbsp;</td>' +
                '</tr></table>';
    html += '</td></tr><tr><td>';
    html += '<table width="100%" class="daysLayout"><tr>';

        //Displaying days.
        var numberOfRows = (this.datesArray[paramMonthUnder])/7;
        for (var i=0;i<numberOfRows;i++) {
            for (var j=0;j<7;j++) {
                var day = i*7+j+1;
	        stringData = paramYear + this.monthArrayPath[paramMonthUnder] + day ;
	        stringData = stringData.toLowerCase();
                var isChoosenDay = (day==choosenDay && paramMonthUnder == choosenMonth && paramYear == choosenYear && articleCollection[stringData] != null &&  this.state == 1);
                if (day<1 || day>this.datesArray[paramMonthUnder]) {
                    html += '<td>&nbsp;</td>';
                } 
	    else {
                    html += '<td class="';
                    if (isChoosenDay) {
                            html += 'selectedDay';
                    }
                    html += '">';
	        if (articleCollection[stringData] != null) {
                    	  html += '<a'+(' href=\"' + articleCollection[stringData] + '\" onclick=\''+(isIE? top.frames.length == 0 || top.frames[0].name == "calendarFrame" ? 'top.' : 'top.frames[1].' :'')+'__calendar_setChoosenDate.call('+(isIE? top.frames.length == 0 || top.frames[0].name == "calendarFrame" ? 'top.' : 'top.frames[1].' :'')+'calendarCollection["'+this.containerId+'"],'+paramYear+','+paramMonthUnder+' ,'+day+');return true\'')+'>';
                    	  html += day;
                    	  html += '</a>';
	        }
	        else{
		  html += day;
	        } 
                    html += '</td>';
                }
            }
            html += '</tr>';
            if (i!=numberOfRows-1) html += '<tr>';
        }
    html += '</table>';
    html += '</td></tr><tr><td>';
    html += '<table width="100%" class="navigationLayoutYear" cellspacing="0"><tr>' +
                '<td nowrap>&nbsp;&nbsp;&nbsp;<a href="#" class="navigationArrowLeft" onclick=\''+(isIE? top.frames.length == 0 || top.frames[0].name == "calendarFrame" ? 'top.' : 'top.frames[1].' :'')+'__calendar_setYear.call('+(isIE? top.frames.length == 0 || top.frames[0].name == "calendarFrame" ? 'top.' : 'top.frames[1].' :'')+'calendarCollection["'+this.containerId+'"],"-1");return false;\'>&nbsp;</a>&nbsp;&nbsp;</td>' +
                '<td width="100%">' +
                '<a>' + paramYear + "&nbsp;" + this.archive + '</a>' +
                '</td><td nowrap>' +
                '<a href="#" class="navigationArrowRight" onclick=\''+(isIE? top.frames.length == 0 || top.frames[0].name == "calendarFrame" ? 'top.' : 'top.frames[1].' :'')+'__calendar_setYear.call('+(isIE? top.frames.length == 0 || top.frames[0].name == "calendarFrame" ? 'top.' : 'top.frames[1].' :'')+'calendarCollection["'+this.containerId+'"],"+1");return false;\'>&nbsp;&nbsp;</a>&nbsp;&nbsp;&nbsp;</td>' +
                '</tr></table>';
    html += '</td></tr>';
    html += '</table>';
    this.divObj.innerHTML = html;
}


function __calendar_setChoosenDate(_yearNum ,_monthNum,_dayNum)
{
        this.choosenDate.setFullYear(_yearNum, _monthNum, _dayNum);
        this.show();
}

function __calendar_setMonth(_toSet)
{
    switch (_toSet)
    {
        case "-1":
            if ((this.paramDate.getMonth()==0) || (this.paramDate.getMonth()==1) || (this.paramDate.getMonth()==2))
            {
                this.setYear("-1");
                this.setMonth("11");
                return true;
            }
            else
            {
                this.paramDate.setMonth(this.paramDate.getMonth()-3,1);
            }
            break;
        case "+1":
            if ((this.paramDate.getMonth()==9) || (this.paramDate.getMonth()==10) || (this.paramDate.getMonth()==11))
            {
                this.setYear("+1");
                this.setMonth("0");
                return true;

            }
            else
            {
                this.paramDate.setMonth(this.paramDate.getMonth()+3,1);
            }
            break;
        default:
            var toSet = parseInt(_toSet);
            if (isNaN(toSet) || toSet<0 || toSet>11) return false;
            this.paramDate.setMonth(toSet,1);
    }
    this.show();
    return true;
}

function __calendar_setYear(_toSet)
{
    switch (_toSet)
    {
        case "-1":
            this.paramDate.setFullYear(this.paramDate.getFullYear()-1);
            break;
        case "+1":
            this.paramDate.setFullYear(this.paramDate.getFullYear()+1);
            break;
        default:
            var toSet = parseInt(_toSet);
            if (isNaN(toSet)) return false;
            this.paramDate.setFullYear(toSet);
    }
    this.show();
    return true;
}

function __setStartDate(_toSet)
{
  if (_toSet.indexOf("/") != -1)
  {
     var str  = _toSet.indexOf("/");
     var _yearNum = _toSet.substring(0,str);
     _toSet = _toSet.substring(str+1);
     str  = _toSet.indexOf("/");
     var _monthStr = _toSet.substring(0,str);

for (var i=0; i<12; i++){
if (_monthStr == this.monthArrayPath[i].toLowerCase())
{
 var _monthNum = i;
}

}   
     _toSet = _toSet.substring(str+1);
     str  = _toSet.indexOf("/");
     if (str!=-1){
         var _dayNum = _toSet.substring(0,str);
     }
     else
    {
        var _dayNum = 1;
    }
    this.paramDate.setFullYear(_yearNum, _monthNum, _dayNum);
    this.choosenDate.setFullYear(_yearNum, _monthNum, _dayNum);
    this.state = 1;
 }
}

