/* --------------------------------------------------
	1. News Archive toggle Year/Date fields
-------------------------------------------------- */

General.event.register( window , 'load' , function( e ){
	dafCalendar.init( );
} );

General.event.register( document , 'click' , function( e ){
	var theNode = e.targetNode;
	
	if( theNode.nodeName != "IMG" || theNode.className.indexOf( "open-calendar" ) == -1 )
	{
		return true;
	}
	
	var x = 0;
	var y = 0;
	
	if (theNode.className.indexOf('rel') != -1) {
		x = theNode.relPosX;
		y = theNode.relPosY;
	}
	else {
		x = theNode.posX;
		y = theNode.posY;
	}
	
	dafCalendar.open( y , x , theNode );
} );


var dafCalendar = {
	date: null ,
	picker: null ,
	day: -1,
	month: -1,
	year: -1,
	numDays: -1,
	firstDay: -1,
	fieldDay: null,
	fieldMonth: null,
	fieldYear: null,
	closeTimer: null,
	monthNames: ["January","February","March","April","May","June","July",
		"August","September","October","November","December"],
	dayNames: ["M","T","W","T","F","S","S"],
	
	init: function( )
	{
		dafCalendar.picker = document.createElement( "DIV" );
		document.body.appendChild( dafCalendar.picker );
		
		General.event.register( dafCalendar.picker , 'mouseover' , function( e ){
			clearTimeout( dafCalendar.closeTimer );
		} );
		
		General.event.register( dafCalendar.picker , 'mouseout' , function( e ){
			dafCalendar.closeTimer = setTimeout( function( )
				{
					dafCalendar.close( );
				} , 700 );
		} );
		
		var picker = dafCalendar.picker;
		picker.className = "daf-calendar";
		picker.style.position = "absolute";
		picker.style.display = "none";
	},
	
	setDate: function( date )
	{
		dafCalendar.date = date;
		dafCalendar.day = dafCalendar.date.getDate( );
		dafCalendar.month = dafCalendar.date.getMonth( );
		dafCalendar.year = dafCalendar.date.getFullYear( );

		var tmpDate = dafCalendar.date.getDate( );
		dafCalendar.date.setDate( 1 );
		dafCalendar.firstDay = dafCalendar.date.getDay( ) == 0 ? 6 : ( dafCalendar.date.getDay( ) - 1 );
		dafCalendar.date.setDate( tmpDate );
		tmpDate = null;

		dafCalendar.numDays = this.getNumDays( dafCalendar.month , dafCalendar.year );
		dafCalendar.redraw( );
	},
	
	changeDate: function( day , month , year )
	{		
		var selectedDate = new Date( );
		selectedDate.setDate( day );
		selectedDate.setMonth( month );
		selectedDate.setFullYear( year );
		dafCalendar.setDate( selectedDate );
		
		dafCalendar.fieldDay.selectedIndex = (day-1);
		dafCalendar.fieldMonth.selectedIndex = month;
		
		var yearOptions = dafCalendar.fieldYear.options;
		for( var i = 0; i < yearOptions.length; i++ )
		{			
			if( yearOptions[i].value == year )
			{
				dafCalendar.fieldYear.selectedIndex = i;
				break;
			}
		}
	},
	
	getMonthName: function( month )
	{
		return dafCalendar.monthNames[month];	
	},
	
	getNumDays: function( month , year )
	{
		switch( month )
		{
			case 1:
				if( ( year % 4 == 0 && year % 100 != 0 ) || year % 400 == 0 )
				{
					return 29;
				}else 
				{
					return 28;
				}
				break;
				
			case 3: case 5: case 8: case 10:
				return 30;
				break;
			default:
				return 31;
				break;
		}
		
		return -1;
	},
	
	redraw: function( )
	{
		dafCalendar.picker.innerHTML = "";
		dafCalendar.build( );
	},
	
	previousMonth: function( )
	{
		var month = dafCalendar.month;
		var year = dafCalendar.year;
									
		if( month <= 0 )
		{
			month = 11;
			year -= 1;
		}else 
		{
			month -= 1;
		}
									
		dafCalendar.changeDate( 1 , month , year );	
	},
	
	nextMonth: function( )
	{
		var month = dafCalendar.month;
		var year = dafCalendar.year;
									
		if( month >= 11 )
		{
			month = 0;
			year += 1;
		}else 
		{
			month += 1;
		}
									
		dafCalendar.changeDate( 1 , month , year );
	},
	
	build: function( )
	{
		var numRows = Math.ceil( ( dafCalendar.firstDay + dafCalendar.numDays ) / 7 );
		var table = document.createElement( "table" );
		var thead = document.createElement( "thead" );
		var tbody = document.createElement( "tbody" );
		var tableRow = null, tableHead = null, tableCell = null, anchor = null;
		var picker = dafCalendar.picker;
		var numDays = 1;
		var header = document.createElement( "div" );
		var caption = document.createElement( "strong" );
		
		header.className = "heading";
		
		var anchor = document.createElement( "a" );
		anchor.className = "prev";
		anchor.href = "#";
		
		General.event.register( anchor , 'click' , function( e ) 
			{
				dafCalendar.previousMonth( );
				
				e.cancelEvent( );
				return false;
			} );
		
		header.appendChild( anchor );
		
		caption.appendChild( document.createTextNode( dafCalendar.getMonthName( dafCalendar.month ) ) );
		header.appendChild( caption );
		
		var anchor = document.createElement( "a" );
		anchor.className = "next";
		anchor.href = "#";
		
		if( dafCalendar.month == 11 && dafCalendar.year < ( new Date( ).getFullYear( ) ) )
		{
			anchor.style.visibility = "hidden";
		}else
		{
			General.event.register( anchor , 'click' , function( e ) 
				{
					dafCalendar.nextMonth( );
				
					e.cancelEvent( );
					return false;
				} );
		}
		
		header.appendChild( anchor );
		
		
		if( dafCalendar.month > 0 )
		{
			var numDaysPrevMonth = dafCalendar.getNumDays( dafCalendar.month - 1 , dafCalendar.year );
		}else 
		{
			var numDaysPrevMonth = dafCalendar.getNumDays( 11 , dafCalendar.year - 1 );
		}
		
		var tableRow = document.createElement( "TR" );
		for( headIndex in dafCalendar.dayNames )
		{
			var tableHead = document.createElement( "TH" );
				tableHead.appendChild( document.createTextNode( dafCalendar.dayNames[headIndex] ) );
			
			tableRow.appendChild( tableHead );
		}
		
		thead.appendChild( tableRow );
		
		for( var currentRow = 0; currentRow < numRows; currentRow++ )
		{
			var tableRow = document.createElement( "TR" );
						
			for( var currentDay = 1; currentDay <= 7; currentDay ++ )
			{
				var tableCell = document.createElement( "TD" );
				
				if( currentRow == 0 && currentDay <= dafCalendar.firstDay )
				{
					tableCell.className = "inactive";
					tableCell.appendChild( document.createTextNode( ( numDaysPrevMonth - dafCalendar.firstDay ) + currentDay ) );
					
					General.event.register( tableCell , 'mousedown' , function( e ) 
						{
							var day = parseInt( e.targetNode.innerHTML );
							var month = dafCalendar.month;
							var year = dafCalendar.year;
														
							if( month <= 0 )
							{
								month = 11;
								year -= 1;
							}else 
							{
								month -= 1;
							}
														
							dafCalendar.changeDate( day , month , year );
							dafCalendar.close( );
						} );
					
				}else if( numDays > dafCalendar.numDays )
				{
					if( dafCalendar.month == 11 && dafCalendar.year < ( new Date( ).getFullYear( ) ) )
					{
						tableCell.className = "unavailable";
						tableCell.appendChild( document.createTextNode( ( numDays - dafCalendar.numDays ) ) );
						numDays++;
					}else
					{
						General.event.register( tableCell , 'mousedown' , function( e ) 
							{
								var day = parseInt( e.targetNode.innerHTML );
								var month = dafCalendar.month;
								var year = dafCalendar.year;
														
								if( month >= 11 )
								{
									month = 0;
									year += 1;
								}else 
								{
									month += 1;
								}
														
								dafCalendar.changeDate( day , month , year );
								dafCalendar.close( );
							} );
					
						tableCell.className = "inactive";
						tableCell.appendChild( document.createTextNode( ( numDays - dafCalendar.numDays ) ) );
						numDays++;
					}
				}/*else if( numDays > dafCalendar.day && dafCalendar.month == ( new Date( ).getMonth( ) ) && dafCalendar.year == ( new Date( ).getFullYear( ) ) )
				{
					tableCell.className = "unavailable-day";
					tableCell.appendChild( document.createTextNode( numDays ) );
					numDays++;
				}*/else
				{
					if( numDays == dafCalendar.day )
					{
						tableCell.className = "today";
					}
					
					General.event.register( tableCell , 'mousedown' , function( e ) 
						{
							var day = parseInt( e.targetNode.innerHTML );
							var month = dafCalendar.month;
							var year = dafCalendar.year;
														
							dafCalendar.changeDate( day , month , year );
							dafCalendar.close( );
						} );
					
					tableCell.appendChild( document.createTextNode( numDays ) );
					numDays++;
				}
				
				tableRow.appendChild(tableCell);		
			}
			
			tbody.appendChild( tableRow );
		}
		
		table.appendChild( thead );
		table.appendChild( tbody );
		
		picker.appendChild( header );
		picker.appendChild( table );
	},
	
	close: function( )
	{
		var picker = dafCalendar.picker;
		picker.style.display = "none";
	},	
	
	open: function( top , left , node )
	{
		var picker = dafCalendar.picker;
		var parentNode = node.parentNode;
		if( node.nextSibling )
		{
			parentNode.insertBefore( picker , node.nextSibling  );
		}else
		{
			parentNode.appendChild( picker );
		}
		
		picker.style.left = left + node.offsetWidth + "px";
		picker.style.top = top + node.offsetHeight + "px";
		
		// set fieldYear
		if( ( node.previousSibling && node.previousSibling.nodeType == 1 ) && node.previousSibling.nodeName == "SELECT" )
		{
			dafCalendar.fieldYear = node.previousSibling;
		}else if( ( node.previousSibling.previousSibling && node.previousSibling.previousSibling.nodeType == 1 ) && node.previousSibling.previousSibling.nodeName == "SELECT" )
		{
			dafCalendar.fieldYear = node.previousSibling.previousSibling;
		}
		
		// set fieldMonth
		if( ( dafCalendar.fieldYear.previousSibling && dafCalendar.fieldYear.previousSibling.nodeType == 1 ) && dafCalendar.fieldYear.previousSibling.nodeName == "SELECT" )
		{
			dafCalendar.fieldMonth = dafCalendar.fieldYear.previousSibling;
		}else if( ( dafCalendar.fieldYear.previousSibling.previousSibling && dafCalendar.fieldYear.previousSibling.previousSibling.nodeType == 1 ) && dafCalendar.fieldYear.previousSibling.previousSibling.nodeName == "SELECT" )
		{
			dafCalendar.fieldMonth = dafCalendar.fieldYear.previousSibling.previousSibling;
		}
		
		// set fieldDay
		if( ( dafCalendar.fieldMonth.previousSibling && dafCalendar.fieldMonth.previousSibling.nodeType == 1 ) && dafCalendar.fieldMonth.previousSibling.nodeName == "SELECT" )
		{
			dafCalendar.fieldDay = dafCalendar.fieldMonth.previousSibling;
		}else if( ( dafCalendar.fieldMonth.previousSibling.previousSibling && dafCalendar.fieldMonth.previousSibling.previousSibling.nodeType == 1 ) && dafCalendar.fieldMonth.previousSibling.previousSibling.nodeName == "SELECT" )
		{
			dafCalendar.fieldDay = dafCalendar.fieldMonth.previousSibling.previousSibling;
		}
		
		if( dafCalendar.fieldDay.disabled || dafCalendar.fieldMonth.disabled || dafCalendar.fieldYear.disabled )
		{
			return true;
		}
		
		node.onmouseout = function( )
		{
			dafCalendar.closeTimer = setTimeout( function( )
				{
					dafCalendar.close( );
				} , 700 );
		}		
		
		var selectedDate = new Date( );
		selectedDate.setDate( dafCalendar.fieldDay.value );
		selectedDate.setMonth( dafCalendar.fieldMonth.value - 1 );
		selectedDate.setFullYear( dafCalendar.fieldYear.value );
		dafCalendar.setDate( selectedDate );
		picker.style.display = "block";
	}
};

/* @eof */
