/* jquery plugin for the events calendar section of nz.com */
;(function($){
	
	TYPE_ELEM 		= "#eventtypeid";
	SUBTYPTYPE_ELEM = "#eventsubtypeid";
	COMPONENT		= "travel.cfcs.utilities.events.EventGateway";
	METHOD			= "GET";
	IMG_CLOSED		= "/travel/images/arrow_lists.gif";
	IMG_OPEN		= "/travel/images/arrow_lists_expanded.gif";
	IMG_ID_PREFIX	= "root_type_image_";
	DATEELEMS		= "startyear,startmonth,startday,endyear,endmonth,endday";
	DAYSINMONTH		= [31,28,31,30,31,30,31,31,30,31,30,31];
	
	lookup			= {};//dictionary
	
	//Private vars
	__currentStart	= new Date();
	__currentEnd	= new Date();
	__endDateUpdated	= false;
	
	//private functions
	var loadSubTypes	= function( types ){

		var options = "";
		if( types.length > 0 ){
			for( var i = 0 ; i < types.length ; i++ )
			{
				options += "<option value='"+types[ i ].data+"'>"+types[ i ].label+"</option>";
			}
			$( SUBTYPTYPE_ELEM ).css("width","150px");
			$( SUBTYPTYPE_ELEM ).html(options).slideDown();
		} else {
			$( SUBTYPTYPE_ELEM ).html(options);
		}
		
	}
	
	$.extend({
		events: {
			init : function (){
				var elems = DATEELEMS.split(",");
				for( var i = 0 ; i < elems.length ; i++ )
				{
					
					if( elems[ i ].indexOf("start") != -1  )
					{
						$("#" + elems[ i ] ).change( function() {
							$.events.setDayOptions('start');
							__currentStart 	= new Date( $("#startyear").val() , $("#startmonth").val() - 1 , $("#startday").val() );
							if( !__endDateUpdated || __currentStart > __currentEnd )
							{
								__currentEnd = new Date( __currentStart.getFullYear() , __currentStart.getMonth() , __currentStart.getDate() + 7 ); 
								$("#endyear").val( __currentEnd.getFullYear() );
								$("#endmonth").val( __currentEnd.getMonth() + 1 );
								$("#endday").val( __currentEnd.getDate() )	
							}
						});
						
					}
					else
					{
						$("#" + elems[ i ] ).change( function() {
							$.events.setDayOptions('end');
							__currentEnd	= new Date( $("#endyear").val() , $("#endmonth").val() - 1 , $("#endday").val() );
							__endDateUpdated = true;
						});

				
					}
				}
				/*
				alert(__currentStart);
				alert(__currentStart);
				alert(__currentEnd);
			*/
				
			}
			, getSubTypes : function( lang ){
				
				var currenttype = $(TYPE_ELEM).val();
				
				if( currenttype == - 1)
				{
					$( SUBTYPTYPE_ELEM ).slideUp(200);
					loadSubTypes([]);				
				}else{
					if( lookup[ currenttype ] ){
						$( SUBTYPTYPE_ELEM ).slideUp( 200 ,function(){ loadSubTypes( lookup[ currenttype ] ); });
					} else {
						$( SUBTYPTYPE_ELEM ).slideUp( 200 );
						$.TNZCFC.invoke({
							component : COMPONENT
							, method : "getSubTypes"
							, args: { typeid : currenttype , lang : lang }
							, dataType : "json"
							, type : METHOD
							, resultHandler : function( result ){
								lookup[ currenttype ] = result;
								loadSubTypes( lookup[ currenttype ] );	
							} 
						});
					}
				}
			}
			, showSubTypes : function( catID )
			{
				var elemID	= "sub_type_"+catID;
				$("div[id^='sub_type_']:visible").each(
					function(){
						if( this.id != elemID){ 
							$(this).slideUp()
						} 
					}
				);
				$("img[id^='" + IMG_ID_PREFIX + "']").attr("src", IMG_CLOSED);
				if ($("#" + elemID).is(':visible') == false) {
					$("#" + elemID).slideDown();
					$("#" + IMG_ID_PREFIX + catID).attr("src", IMG_OPEN);
				} else {
					$("#" + elemID).slideUp();
				}
			}
			, setDayOptions : function ( type )//function so set up the number of days for the start
			{
				
				var yearElem 	= "#" + type + "year";
				var monthElem 	= "#" + type + "month";
				var dayElem		= "#" + type + "day";
				
				var year 		= $( yearElem ).val();
				var month		= $( monthElem ).val();
				var days		= $.events.getDaysInMonth( month , year );//the number of days in the start month
				
				if( $( dayElem + " option").length != days )
				{
					var initialDate = $( dayElem ).val();
					if (initialDate > days) { initialDate = days	};
					
					var options		= "";
					for( var i = 0 ; i < days ; i++)
					{
						options += '<option value="'+ (i + 1 ) + '">'+( i + 1 )+ '</option>';
					}
					$( dayElem ).html( options );
					$( dayElem ).val( initialDate );
				}
				
			}			
			, getDaysInMonth : function( month , year )
			{
				var returnValue = DAYSINMONTH[ month - 1 ];
				if( month == 2 && ( ( year -  2008 ) % 4 ) == 0 )
				{
					returnValue = 29;
				}
				return returnValue;
			}
		}
		
	});
})( jQuery );

jQuery( function(){
	jQuery.events.init();
});

