/*
* First plugin 
*
* @author Maarten Hus
*/
(function($)
{
    var eventdates = {};
    
    $.fn.ical = function(options) 
    {
        $.fn.ical.defaults = {
           daynames: ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So'], //default short names for the days of the week
           monthnames: ['Jan', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'],
           startdate: new Date(), // The date the calender should take as start point
           eventdates: {},
           beforeDay: function (insdate) {},
           beforeMonth: function(insdate) {},
           beforeYear: function(insdate) {},
					 afterCreation: function() {}
        };
        
        var options = $.extend({}, $.fn.ical.defaults, options);
          
        return this.each(function() 
        {
            var obj = $(this); //get the object
            eventdates = options.eventdates;
            
            var insdate = options.startdate; //The date that gets used for calculating the month
            createCalendar(obj, insdate);
        });
        
        /**
        * Create the calendar
        */
        function createCalendar(obj, insdate)
        {
        
        

        
            obj.html('');
            createTable(obj); //create table
            createNavigation(obj, insdate);
            addDatesToTable(obj, insdate);
						options.afterCreation(formatDate());
        };
        
        /**
        * Create the navigation and handle its clicks
        */
        function createNavigation(obj, insdate)
        {
            $("table thead, obj").append("<tr><th><span id ='icalprev'>&laquo;</span></th><th colspan='5' style='font-size: 14px; color: #333;'><span id = 'currentmonth'>"+ options.monthnames[insdate.getMonth()] +"</span> <span id = 'currentyear'>"+ insdate.getFullYear() +"</span></td>" +
                      "<th><span id ='icalnext'>&raquo;</span></th></tr>");
                      
            $("#icalnext", obj).click(function()
            {
                var month = insdate.getMonth() + 1;
                
                if(month > 11)
                {
                    month = 0;
                    var year = insdate.getFullYear() + 1;
                    options.beforeYear(formatDate(year, month, 1));
                }
                else
                {
                    var year = insdate.getFullYear();    
                }
                
                options.beforeMonth(formatDate(year, month, 1));
                
                date = new Date(year, month, 1);
                createCalendar(obj, date);
            }); 
            
            $("#icalprev", obj).click(function()
            {
                var month = insdate.getMonth() - 1;
                
                if(month < 0)
                {
                    month = 11;
                    var year = insdate.getFullYear() - 1;
                    options.beforeYear(formatDate(year, month, 1));
                }
                else
                {
                    var year = insdate.getFullYear();    
                }
                
                options.beforeMonth(formatDate(year, month, 1));
                
                date = new Date(year, month, 1);
                createCalendar(obj, date);
            });         
        };
        
        /**
        * Create the table for the calendar
        */
        function createTable(obj)
        {
            obj.append("<table class='icaltable' cellspacing='0'><thead></thead><tr></tr></table>"); //add a table             
            for (var i = 0; i < options.daynames.length; i++) 
            {
                $(".icaltable tr", obj).append("<th>"+ options.daynames[i] +"</th>"); //add the day header
            }
        };
        
        
function getWeekDay(dd,mm,yyyy) {
        // Referenztag ist Samstag, der 01.01.0001.
        // Nun werden alle Tage bis zum Eingabe-Datum gezählt.
        // Alle-Vergangenen-Tage modulo 7 ergibt dann eine Zahl
        // zwischen 0 und 6, die einen Wochentag
        // zwischen Samstag und Freitag repräsentiert.

        // grobe Zählung: Ganze Jahre +
        // Tage im aktuellen Monat + ganze Monate im aktuellen Jahr
        var month = "312831303130313130313031";
        var days = (yyyy-1)*365 + (dd-1);
        for(var i=0;i<mm-1;i++) days += month.substr(i*2,2)*1;

        // Kalenderreform: Sprung vom 04.10.1582 zum 15.10.1582
        if(yyyy>1582 || yyyy==1582 && (mm>10 || mm==10 && dd >4)) days -= 10;

        // Schaltjahre bis 1599: alle Jahre, die durch 4 teilbar sind.
        // Ab 1600: alle Jahre, die durch 4 teilbar sind,
        // außer den vollen Jahrhunderten,
        // es sei denn, sie sind durch 400 teilbar.
        var leapyears = Math.floor(yyyy / 4);
        if(yyyy%4==0 && mm<3) leapyears--;
        if(yyyy>=1600) {
          leapyears -= Math.floor((yyyy-1600) / 100);
          leapyears += Math.floor((yyyy-1600) / 400);
          if(yyyy%100==0 && mm<3) {
            leapyears++;
            if(yyyy%400==0) leapyears--;
          }
        }
        days += leapyears;

        // Ergebnis anzeigen
        var week = "SaSoMoDiMiDoFr";
        //alert(week.substr(days%7*2,2)+",  "+ dd+"."+mm+"."+yyyy);
        
        return week.substr(days%7*2,2);
        
      }        
        
        function addDatesToTable(obj, insdate)
        {
        

        
            var month = insdate.getMonth();
            var year  = insdate.getFullYear();
            
            var days = getDaysInMonth(year, month);
            var first = getFirstDayOfMonth(year, month); // 0 - 6
            var last = getLastDayOfMonth(year, month, days);// 0 - 6 
            
            var afterpadding = 6 - last; // week minus the last day of the month = afterpadding
            
            var firstrow = true;

   					$('#month_list').html('');
            for (var i = 1; i <= days; i++) //each day in month
            {
                if((first + i - 1) % 7 === 0 || firstrow === true ) //add new tr for each new monday our if $i is zero
                {
//                    $("table", obj).append("<tr></tr>");
                    $(".icaltable", obj).append("<tr></tr>");
                }
                
                for(var j = 0; j < first && firstrow; j++) //add pre padding
                {
//                    $("table tr:last, obj").append("<td class = 'padding'></td");
                    $(".icaltable tr:last", obj).append("<td class = 'padding'></td");
                }
                
                firstrow = false; //no more pre padding
                
                var month = getMonthNumber($("#currentmonth", obj).text());
                var year = $("#currentyear", obj).text();
                
                var formatdate = formatDate(year, month, i);
                var formatdate_de = formatDateDe(year, month, i);                

				
                var datejson = isEventDate(formatdate)
                

                
                
             /*   
				jQuery.each(eventdates['dates'], function(i, val) {
				 datejson = new Array();
				 if isEventDate(formatdate)
			     alert(i+":"+val.title);
	            //var datejson = isEventDate(formatdate)
			    });
*/



                if(!datejson.length>0)
                {
                    options.beforeDay(formatdate);
                     $(".icaltable tr:last", obj).append("<td id = '"+formatdate+"'>"+i+"</td"); //add day
                }
                else
                {
                    options.beforeDay(formatdate);

				
                


				/*	
					var myObject = datejson;
					jQuery.each(					myObject, function() {
					 var mo = eval(this);
				     alert(this['desc']);
				    });
*/			
	

						var eventlist = "<ul>";
						jQuery.each(datejson, function(ii, val) {
						

						
							eventlist += "<li>"
							if (val.url)
							{
								eventlist += "<a href='"+val.url+"'>"+val.title+"</a>";
							} else {
								eventlist += val.title;
							}
							eventlist += "</li>"
				     	
						 });
						eventlist += "</ul>"
						
                    $(".icaltable tr:last", obj).append("<td class='date_has_event' id = '"+formatdate+"'>"+i+"<div class='events'>"+eventlist+"</div></td"); //add day  
                    
                    
                    $('#month_list').append('<h1>'+formatdate_de+'</h1>'+eventlist);
                    
                }
            };
            
            for (var i = 0; i < afterpadding; i++) //add after padding
            {
                 $(".icaltable tr:last", obj).append("<td class = 'padding'></td");
            }
            
            highlightToday(obj);
        };
        
        function getMonthNumber(month)
        {
        
            for (var i = 0; i < options.monthnames.length; i++)
            {
                if(options.monthnames[i] === month)
                {
                    return i;
                }
            }
        };
        
        function getDaysInMonth(year, month)
        {
            return 32 - new Date(year, month, 32).getDate();
        };
        
        function highlightToday(obj)
        {
            var today = new Date();
            today = formatDate(today.getFullYear(), today.getMonth(), today.getDate());
            $("#"+today, obj).addClass("today");
        };
        
        function isEventDate(date) 
        {     
				
							
					var today_dates = new Array();
					var counter = -1;
					
					
					
					
					jQuery.each(eventdates['dates'], function(i, val) {
	
					//	Date.parse(date).between(Date.parse(evalbegin), Date.parse(evalend));
											
							var checkdate;
							if (val.end)
							{
								checkdate = Date.parse(date).between(Date.parse(val.begin), Date.parse(val.end));
							} else {
								checkdate = Date.parse(date)==Date.parse(val.begin);
							}
						
							if (checkdate)
							{
								counter = counter + 1;
								this.date = date;
             		today_dates[counter] = this;
							}
			    });
				
					return today_dates; 
	
        };
        
        function evaluateEventDate(eventdate, date)
        {
            var eventdate = eventdate.split('-');
            var date = date.split('-');
            
            if(eventdate[0] === 'yyyy')
            {
                eventdate[0] = date[0];
            }
            
            if (eventdate[1] === 'mm') 
            {
                eventdate[1] = date[1];
            }
            
            if(eventdate[2] === 'dd')
            {
                eventdate[2] = date[2];
            }
            
            return eventdate[0]+'-'+eventdate[1]+'-'+eventdate[2];
        };
        
        function getLastDayOfMonth(year, month, days)
        {
            var date = new Date(year, month, days);
            if(date.getDay() == 0)//we start on monday!
            {
                return 6;
            }
            else
            {
                return date.getDay() -1;
            }
        };
            
        function getFirstDayOfMonth(year, month)
        {
            var date = new Date(year, month, 1);
            if(date.getDay() == 0) //we start on monday!
            {
                return 6;
            }
            else
            {
                return date.getDay() -1;
            }
        };
        
        function formatDate (year, month, day) 
        {    
            return year+'-'+formatMonth(month)+'-'+formatDay(day);
        };
        
       function formatDateDe (year, month, day) 
        {    
        
        		var week_day = getWeekDay(year, month, day);
        
        		switch (month+1) {
        			case 1:
        				var month_name = 'Jan.';
        				break;
        			case 2:
        				var month_name = 'Feb.';
        				break;
        			case 3:
        				var month_name = 'Mär.';
        				break;
        			case 4:
        				var month_name = 'Apr.';
        				break;
        			case 5:
        				var month_name = 'Mai';
        				break;
        			case 6:
        				var month_name = 'Jun.';
        				break;
        			case 7:
        				var month_name = 'Jul.';
        				break;
        			case 8:
        				var month_name = 'Aug.';
        				break;
        			case 9:
        				var month_name = 'Sep.';
        				break;
        			case 10:
        				var month_name = 'Okt.';
        				break;
        			case 11:
        				var month_name = 'Nov.';
        				break;
        			case 12:
        				var month_name = 'Dez.';
        				break;

        		}
        		
        
            return week_day+', '+day+'. '+month_name;
        };        
        
        function formatMonth(month)
        {
            month = month + 1;
            
            if (month < 10)
            {
                month = '0'+month;
            }
            
            return month; 
        };
        
        function formatDay(day)
        {
            if (day < 10) 
            {
                day = '0'+day;
            }
            
            return day;
        };
        
       
    };
    
    $.fn.ical.changeEventDates = function(array){
       eventdates = array;
    };
    
})(jQuery);


