/*
 * Calendar Application 
 * 
 * (c) 2009 Logat - Contextual Internet Technologies
 * 
 */
	

function CalendarApplication( options ) {
	
	var appId = 'my-calendar';
	var eventList = null;
	
	var _options = {
		selectDate: 'today'
	};
	
	var weekdays = ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'];
	var months	 = ["Januar", "Februar", "M&auml;rz", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"];
	var months_noenc = ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"];

	
	
	// default
	options = $.extend( _options, options );
	
	var updateEventList = function() {
		$.getJSON( 'my/calendar/get-events',  
				function(result) {
					eventList = result;
					// restart init
					init();
			}	
		);
	};
	
	// var getEventByDate = function( date )
	function getEventByDate( date )
	{
		// try to lookup event from eventlist:
		var day 	= date.getDate();
		var month	= date.getMonth()+1;
		var year 	= date.getFullYear();
		
		var today = new Date();
		
		
		var event = null;
		
		if( today.getDate() == day &&
			today.getMonth()+1 == month )
		{
			event = {"type":"generic" };
		}
		
		// id=305 date=2009-06-09 userId=30 type=hu
			
		
		/*
		if( day < 10 )
			day = '0' + day; // this is a string operation. 
							 // NOT arithmetic!
		
		if( month < 10 )
			month = '0' + month;
		
		var hashDate = year + '-' + month + '-' + day;
		var event = eventList[hashDate];
		*/	
		
		return event;
	};
	
	
	var activityIndicator = function(show) {
		var indicator = $( '#' + appId + '-app-indicator' );
		
	 	 if( show == true )
	  	 	indicator.fadeIn();
	  	 else
	  	 	indicator.fadeOut();
	};
	
	
	var showEventEditMask = function( id, dateText ) {
		
		var date = new Date( dateText );
		var dayInWeek = date.getDay();
		var day		  = date.getDate();
		var month 	  = date.getMonth();
		var year	  = date.getFullYear();

		var dialogTitle = weekdays[dayInWeek].toUpperCase() + ' | ' + day + '. ' + months[month].toUpperCase() + ' | ' + year; 
		
	 	// display loader
	 	activityIndicator( true );
/*
		$.get( 'my/calendar/edit-event', {id: id}, 
		 		function( result ) {
		 			$("#" + appId + "-dialog .dialog-content").html(result);
		 			
		 			// open dialog:
		 			var dlg = $("#" + appId + "-dialog");
		 			dlg.dialog('option', 'title', dialogTitle );
		 			dlg.dialog('open');
		 			activityIndicator(false);
		 		});
		 		*/
	 	
	};
	
	
	// callback: Event finished editing
	var onEventEditFinished = function( id ) {
		var formId = appId + '-event-edit-form-' + id;
		var formElements = $('#' + formId + ' :input' );

				
		$.each( formElements, function( eId, element ) {
		});
						
		
	};
	
	var setDate = function(dateText) {
		
		if( !dateText || dateText == undefined )
		{
			/*
			if( options.selectDate == 'today' )
				var date = new Date();
			else
				var date = new Date(options.selectDate);
			*/
			
			var date = new Date();
		}
	 	else
	 	{
	 		var date = new Date( dateText );
	 	}

		
	 	var calendarPanel = $('#' + appId + '-app-panel');
	 	
	 	// display loader
	 	activityIndicator( true );
	 	
	 	// get event for this day and display it.
	 	// if no event is set display edit form.
		// (--> Add Event)
	 	
		$.get( 'my/calendar/list-demo',
				{ day: date.getDate(), month: date.getMonth()+1, year: date.getFullYear() },
				function(result) {
					calendarPanel.html(result);
					activityIndicator( false );
			});
		
	 	
	 	
	};
	
	
	var showNewEventMask = function( dateText ) {
		
		var date = new Date( dateText );
		var dayInWeek = date.getDay();
		var day		  = date.getDate();
		var month 	  = date.getMonth();
		var year	  = date.getFullYear();
		
		var dialogTitle = weekdays[dayInWeek].toUpperCase() + ' | ' + day + '. ' + months[month].toUpperCase() + ' | ' + year; 
		
		activityIndicator(true);

		
		$.get( 'my/calendar/new-event', {day: day, month: month, year: year}, 
		 		function( result ) {
		 			$("#" + appId + "-dialog .dialog-content").html(result);
		 			
		 			// open dialog:
		 			var dlg = $("#" + appId + "-dialog");
		 			dlg.dialog('option', 'title', dialogTitle );
		 			dlg.dialog('open');

		 			activityIndicator(false);
		 		});
		
	};
	

	var renderDay = function(date) {

		// try to lookup event from eventlist:
		var day 	= date.getDate();
		var month	= date.getMonth()+1;
		var year 	= date.getFullYear();
		
		var today = new Date();
		
		
		var event = null;
		
		if( today.getDate() == day &&
			today.getMonth()+1 == month )
		{
			event = {"type":"generic" };
		}
		
		
		if( event )
			return [true, 'big event ' + event.type ];
		else
			return [true];
		
	};

	var init = function() {
		// hide default calendar:
		$('#calendar').hide();
		
		// update event list
		/*
		if( eventList == null )
		{
			// updateEventList();
			return ;
		}
		*/
		// we now have our eventlist.
		// hide indicator
		activityIndicator(false);
		
		// new date object from default date
		var defaultDate = new Date( ); 
		
		// show datepicker instance
		$('#' + appId ).datepicker({
			beforeShowDay:	renderDay,
			onSelect:	   	setDate,
			defaultDate: 	defaultDate,
            changeYear: true,
            changeMonth: true,
            dayNamesMin: weekdays,
            monthNames: months,
            monthNamesShort: months,
            firstDay: 1
		});
		
		// init edit dialog
		$("#" + appId + "-dialog").dialog({
			bgiframe: true,
			autoOpen: false,
			height: 240,
			width: 315,
			resizable: false,
			modal: false } );
		
		setDate(); // today
		
		activityIndicator(false);
		
		
		// new header bindings:
		var c_month_offset = 0;
		
		var update_date_header = function( date )
		{
			var dayInWeek = date.getDay();
			var day		  = date.getDate();
			var month 	  = date.getMonth();
			var year	  = date.getFullYear();
			
			var title = months_noenc[month].toUpperCase() + ' ' + year; 
			$('.my-calendar-header .current-date').html( title );
		};
		
		update_date_header( defaultDate );
	
		/*
		 * events:
		 */
		
		$("#my-calendar-prev-month").click( function() {
			c_month_offset--;
			var dir = '+';
			if( c_month_offset < 0 ) { dir = '-'; }
			
			$('#' + appId ).datepicker('setDate', dir + c_month_offset + 'm');
			update_date_header( $('#' + appId ).datepicker( 'getDate' ) );
			
			setDate( $('#' + appId ).datepicker( 'getDate' ) );
		});
		
		$("#my-calendar-next-month").click( function() {
			c_month_offset++;

			var dir = '+';
			if( c_month_offset < 0 ) { dir = '-'; }
				
			$('#' + appId ).datepicker('setDate', dir + c_month_offset + 'm' );
			update_date_header( $('#' + appId ).datepicker( 'getDate' ) );
			
			setDate( $('#' + appId ).datepicker( 'getDate' ) );
		});
		
	};

	
	init( options );
	
	// export public variables and functions
	return {
		// api version
		version: '0.5.1 beta',
		
		// public functions:
		showEventEditMask:	 showEventEditMask,
		showNewEventMask:	 showNewEventMask,
		onEventEditFinished: onEventEditFinished
	};
}

	
