/*
 * Calendar Emoxion
 * with Mootools
 * Manuel Garcia (thekeeper)
 * http://www.mgarcia.info
 * Version 0.21
 *
 * Copyright (c) 2007 Manuel Garcia
 * http://www.opensource.org/licenses/mit-license.php
 */

var calendar_tbody='';
var search_type='';

var Calendar = new Class({
        initialize: function(el,open,Config) {
        this.input = $(el);
        var lng = new Object();

        lng['en']=cal_lng;   // get language the from FE.inc refer catchup.inc    
        nav='en';
	lng = (!lng[nav])? lng['en'] : lng =  lng[nav] ;
        /* configuration */
        if (!Config)
                this.config = {
                        Lng: lng,
                        imgNext: '/static/'+app_lang+'/microsites/catchup/img/calendar/next.gif',
                        imgPrev: '/static/'+app_lang+'/microsites/catchup/img/calendar/prev.gif',
                        //imgCancel: '/static/slo/microsites/catchup/img/calendar/close.gif',
                        maxDate: new Date('01/01/2020'),
                        minDate: new Date('01/01/2000'),
                        format: 'd.m.y'
                };        
                this.month_name = this.config.Lng.month;
                this.day_name =  this.config.Lng.day;
                this.create_calendar();
    },
        create_calendar: function() {
                var position = this.input.getCoordinates();
                // Condition Check's for Click By Navigation or Input Box
                        if(search_type=='A'){
                		calendar_type='ncalendar';
                                calendar_tbody='nncalendar';
                        } else {
                		calendar_type='scalendar';
                                calendar_tbody='sscalendar';
                        }
                if ($(calendar_type)) $(calendar_type).remove();        
                // content div  //
                if(search_type=='I'){
                       // this.div = new Element('div').setStyles({'top': (position.top + position.height) + 'px',
                       // 'left': (position.left) + 'px'}).setProperty('id', calendar_type).injectInside(document.body);
                        this.div = new Element('div').setProperty('id', calendar_type).injectInside($("sub_scalendar"));
                }else{               
                        this.div = new Element('div').setProperty('id', calendar_type).injectInside($("sub_calendar"));         
                }
     
                /*.setStyles({'top':(position.top+position.height)+'px', 'left':(position.left)+'px'}).*/
                /*this.div.makeDraggable();*/
                this.nav();
                this.setdate(this.input.getProperty('value'));
                this.effect(this.div,'show');
        } ,
        nav: function (today) {
                // nav
                this.calendardiv = new Element('div').injectInside(this.div).addClass('header')
                this.title = new Element('span').injectInside(this.calendardiv).addClass('month');
                // next month
                this.next = new Element('img').setProperty('src', this.config.imgNext).injectAfter(this.title);
                // before month
                this.before = new Element('img').setProperty('src', this.config.imgPrev).injectBefore(this.title);
                // close
                //this.close = new Element('img').setProperty('src', this.config.imgCancel).injectAfter(this.next);
                // table
                this.table = new Element('table').injectInside(this.div);
                var thead = new Element('thead').injectInside(this.table);
                var tr = new Element('tr').injectInside(thead);
                
                this.day_name.each(function (day) {
                        var td = new Element('th').appendText(day).injectInside(tr);
                });
                var localThis = this;
                //Close
                /*this.close.addEvent('click', function(e) {
                localThis.div.remove();
                }); */
        },
        setdate : function(date) {
                // reset event nav
                this.next.removeEvents('click');
                this.before.removeEvents('click');        
                if (!this.validate_date(date)) {
                        this.today = new Date();
                        this.today.setDate(1);
                } else {
                        var dateinp = date.split('/');
                        this.today = new Date(dateinp[2],dateinp[1]-1,dateinp[0],0,0,0);
                }
                this.next_m = this.today.getMonth();
                this.next_m++;
                this.title.innerHTML = this.month_name[this.today.getMonth()]+' ' + this.today.getFullYear();
                
                this.title.addEvent('click', function (e) {
                        if ($('listYear')) $('listYear').remove();
                                var div = new Element('div').injectAfter(localThis.title).setProperty('id','listYear');
                                var date = localThis.today;
                                var ul = new Element('ul').injectInside(div);
                                for (var a=(date.getFullYear()-2); a<= (date.getFullYear()+2);a++) {
                                        var li = new Element('li').setHTML(a).injectInside(ul).setProperty('id',a)
                                        .addEvent('click', function (e) {
                                                localThis.tbody.remove();
                                                localThis.setdate(date.getDate()+'/'+date.getMonth()+'/'+this.getProperty('id'));
                                                div.remove();
                                        });
                                }
                                localThis.effect(div,'show');
                });
                var localThis = this;
                // event next
                if (this.today < this.config.maxDate ) {
                        this.next.addEvent('click', function(e) {
                                var date = localThis.today;
                                date.setMonth(localThis.next_m+1,1);
                                localThis.tbody.remove();
                                localThis.setdate(date.getDate()+'/'+date.getMonth()+'/'+date.getFullYear());
                        });
                }
                // event before
                if (this.today > this.config.minDate ) {
                        this.before.addEvent('click', function(e) {
                                var date = localThis.today;
                                date.setMonth(localThis.next_m-1,1);
                                localThis.tbody.remove();
                                localThis.setdate(date.getDate()+'/'+date.getMonth()+'/'+date.getFullYear());
                        });
                }
                var LastMonth = new Date(this.today.getFullYear(),this.next_m-2,1,0,0,0);
                var last = LastMonth.getMonth();
                // total days the last month
                var counter = 0;
                for (var b = 1; b <= (30 +  this.config.Lng.first); b++) 
                {
                        LastMonth.setDate(b);			  	
                        if ( LastMonth.getMonth() == last) 
                        {
                        counter++;                
                        }               
                }      
                this.tbody = new Element('tbody').injectInside(this.table).setProperty('id',calendar_tbody);
                var first_day = this.today;
                var last_day = this.today;
                this.month = this.today.getMonth();
                var tr = new Element('tr').injectInside(this.tbody);
                var day=0;
        
                /* first day week */
                first_day.setDate(1);
                var rest = (!first_day.getDay())? 6: first_day.getDay()-1;
                
                counter = counter - rest;
                for (var i= this.config.Lng.first; i <= 6; i++) {
                        if (first_day.getDay() == i) {
                                break;
                        }else{
                                counter++;
                                LastMonth.setDate(counter);
                                //if (LastMonth.getMonth() == this.today.getMonth()) LastMonth.setMonth(this.today.getMonth()-1);
                                if (LastMonth.getMonth() == this.today.getMonth()) LastMonth.setMonth(this.today.getMonth()-1);
                                this.create_td(tr,'',LastMonth,'noday',1);    //Remove  the Past Month         
                        }
                }
                (this.config.Lng.first)? brea_k = 1:brea_k = 0;
                /* everydays */
                var date_s = this.today;
                var class_Css;
                var brea_k; // breaking week
                var daycounter = 0;
                var today_disable = new Date();
                var c_month  =today_disable.getMonth()+1; // Current Date
                var cc_month =date_s.getMonth()+1;  // Current Calendar Month
        
                for (var i = 1; i <= (31); i++) {
                        date_s.setDate(i);
                        if (date_s.getMonth() == this.month) {
                                daycounter++;
                                if (date_s.getDay() == brea_k) {
                                        var tr = new Element('tr').injectInside(this.tbody);
                                }
                                class_Css = (!date_s.getDay())? 'sunday' : '';       
                                // Disable the future date's
                                if(date_s.getFullYear()>today_disable.getFullYear()) {
                                        this.create_td(tr,i,date_s,'noday',1);
                                }else if(today_disable.getFullYear()==date_s.getFullYear()) {
                                        if(cc_month>c_month){
                                                this.create_td(tr,i,date_s,'noday',1);
                                        }else if(cc_month==c_month){
                                                if(date_s.getDate()>today_disable.getDate()){
                                                        this.create_td(tr,i,date_s,'noday',1);
                                                }else{
                                                        this.create_td(tr,i,date_s,'class_Css',0);
                                                }
                                        }else if(cc_month<c_month){
                                                this.create_td(tr,i,date_s,class_Css,0);
                                        }
                                }else{
                                        this.create_td(tr,i,date_s,class_Css,0);
                                }
                        }
                }
        this.today.setMonth(this.month);
        this.today.setDate(daycounter);
        
        //	The following lines are commented because in the calender it shows the next month days also which is not needed
        /*
        var NextMonth = new Date(this.today.getFullYear(),this.today.getMonth()+1,1,0,0,0);
        // finish month
        var num = date_s.getDay();
        num = (brea_k)? 7 - num: 6 - num;
        var b;
        b = (brea_k)? 0 : 6 ;
        if (this.today.getDay() != b) {
        for (var i= 1; i <= (num); i++) {
        NextMonth.setDate(i);
        this.create_td(tr,i,NextMonth,'noday',1);
        }
        }
        */
        this.effect(this.tbody,'show');
        },
        create_td: function(tr,i,date,class_Css,disable) {
                var localThis = this;
        	var td = new Element('td');
        	if (date) {
                        var day = date.getDate();
                        var month = (date.getMonth()+1);
                        //  9 to 09 or another number <= 9
                        if (day <= 9) day = "0"+ day;
                        if (month <= 9) month = "0"+ month;
                        var ft = localThis.config.format;
                        var tddate = ft.replace('d',day);
        		tddate = tddate.replace('m',month);
        		tddate = tddate.replace('y',date.getFullYear());
                        td.setProperty('id', tddate);
                }

                if (this.config.minDate < date) {
                        if (this.config.maxDate > date) {
                                td.addEvent('click', function(e) {
                                        // Allow Only Current And Previous Date               
                                        if (disable==0) { 
                                                if (localThis.input == "[object HTMLInputElement]") {
                                                        localThis.input.value = this.id;
                                                        localThis.effect(localThis.div, 'fade');
                                                        localThis.div.remove();
                                                }else {
                                                        localThis.effect(localThis.div, 'fade');
                                                        localThis.div.remove();
                                                        window.location = "/search?group=false&date=" + this.id + "&order=date";
                                                }
                                          }
                                });
                        } else {
                            td.addEvent('click', function(e) {
                 			alert('Max. Date ' + localThis.config.maxDate);
            			});
                        }
                } else {
                        td.addEvent('click', function(e) {
                 	        alert('Min. Date ' + localThis.config.minDate);
                        });
                }
          	td.addEvent('mouseover', function(e) {
                        this.addClass('dayselected');
                });
  		td.addEvent('mouseout', function(e) {
                        this.removeClass('dayselected');
                });

                if (class_Css) td.addClass(class_Css);
            	// Today ??
            	var today = new Date();
                today = today.getDate() + "/" + (today.getMonth()+1) + "/" + today.getFullYear();
                if (date) var date_td = date.getDate() + "/" + (date.getMonth()+1) + "/" + date.getFullYear();
                if (today == date_td) td.addClass('isToday');
                td.appendText(i);
        	td.injectInside(tr);
	},
		effect: function(div,op) {
		  var ef = new Fx.Style(div, 'opacity', {
				duration: 0, // To Reduce the Fade Effect , because click fast two menu will dispalyed
				transition: Fx.Transitions.quartInOut
			});
			(op == 'fade')? ef.start(1,0): ef.start(0,1);
		},
		validate_date: function (date) {
            if ( date )
            {
		  		var regex = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/;
		  		return date.test(regex);
            }
            else
            {
                return false;
            }
		}
});
