$extend( Page, {

	_filters: {
		states: [],
		search: '',
		parent: '!!undefined!!',
		month: ''
	},
	
	_searchTimer: null,
	
	_startRow: 0,
	
	hitTimer: function()
	{
		$clear( Page._searchTimer );
		
		Page._searchTimer = (function() {
		
			Page.clearResults();
			
			Page.loadResults();
		
		}).delay( 500 );
	},
	
	initData: function()
	{
		var formData = $( 'formData' ).getDataFromComment();
		
		// Month
		if ( formData.month )
		{
			Page._filters.month = formData.month;
		
			var $month = $( 'whatsOn-monthSelect' );
			
			$month.value = formData.month;
		}
		
		// States
		if ( formData.states )
		{
			var states = formData.states.split(',');
			
			states.each( function(s) {
			
				$( 'state_' + s ).checked = true;
			
			});
			
			Page._filters.states = states;
		}
	
	},
	
	initSearch: function()
	{
		// Search (input)
		var $search = $( 'whatsOn-searchField' );
		
		$search.focus();
		
		$search.addEvents({
		
			'keyup': function(e) {
			
				e.stop();
				
				if ( Page._filters.search == $search.value )
					return;
				
				Page.hitTimer();
			}
		
		});
		
		// Company (select)
		var $company = $( 'whatsOn-companySelect' );
		
		$company.addEvents({
		
			'change': function(e) {
			
				e.stop();
				
				if ( Page._filters.parent == $company.value )
					return;
				
				Page.hitTimer();
			}
		
		});
		
		// Month (select)
		var $month = $( 'whatsOn-monthSelect' );
		
		$month.addEvents({
		
			'change': function(e) {
			
				e.stop();
				
				if ( Page._filters.month == $month.value )
					return;
				
				Page.hitTimer();
			}
		
		});
		
		// States (checkboxes)
		var states = $$( '#categories .checkbox' );
		
		states.each( function(s) {
		
			var key = s.getProperty( 'name' );
			
			s.addEvent( 'click', function(e) {
				
				var isChecked = s.checked;
				
				Page._filters.states[ !isChecked ? 'erase' : 'include' ]( key );
				
				Page.clearResults();
				Page.loadResults();
			
			});
			
		
		});
		
		
		/* Buttons */
		
		// Select all States
		var $selectAllStates = $( 'whatsOn-selectAllStates' );
		
		$selectAllStates.addEvent( 'click', function() {
		
			$$( '#categories .checkbox' ).each( function(c) {
			
				c.checked = true;
				
				var key = c.getProperty( 'name' );
				
				Page._filters.states.include( key );
			
			});
			
			Page.clearResults();
			Page.loadResults();
		
		});
		
		// Clear States
		var $clearStates = $( 'whatsOn-clearStates' );
		
		$clearStates.addEvent( 'click', function() {
		
			$$( '#categories .checkbox' ).each( function(c) {
			
				c.checked = false;
				
				Page._filters.states = [];
			
			});
			
			Page.clearResults();
			Page.loadResults();
		
		});
		
		// Clear Search
		var $clearSearch = $( 'whatsOn-clearSearch' );
		
		$clearSearch.addEvents({
		
			'click': function(e) {
			
				e.stop();
				
				var $search = $( 'whatsOn-searchField' ),
					$company = $( 'whatsOn-companySelect' ),
					$month = $( 'whatsOn-monthSelect' );
				
				$search.value = '';
				$company.value = '';
				$month.value = '';
				
				$search.focus();
				$search.blur();
				
				Page.clearResults();
				Page.loadResults();
				
			}
		
		});
	
	},
	
	clearResults: function()
	{
		var $results = $( 'whatsOn-results' );
		
		$results.empty();
	},
	
	daysInMonth: function( month, year )
	{
		var dd = new Date(year, month, 0);
		return dd.getDate();
	},
	
	loadResults: function( startRow )
	{	
		if ( startRow )
			Page._startRow = startRow;
		
		var $results = $( 'whatsOn-results' );
		
		// Remove current load more links
		$$( '.load-more' ).hide();
		
		// Create container
		var $container = new Element( 'div', { 'class': 'loading' } ).inject( $results );
		
		
		// Search
		Page._filters.search = $( 'whatsOn-searchField' ).value;
		
		// Parent
		var parent = $( 'whatsOn-companySelect' ).value;
		
		if ( parent )
			Page._filters.parent = parent;
		else
			Page._filters.parent = '!!undefined!!';
		
		// Month
		var month = $( 'whatsOn-monthSelect' ).value;
		
		if ( month )
			Page._filters.month = month;
		else
			Page._filters.month = '';
		
		
		// Process filters
		var processedFilters = {
			search: '%',
			parent: '!!undefined!!',
			startDate: '',
			endDate: ''
		};
		
		if ( Page._filters.states.length )
			processedFilters.states = Page._filters.states.toString();
		
		if ( Page._filters.search )
			processedFilters.search = '%' + Page._filters.search + '%';
			
		if ( Page._filters.parent )
			processedFilters.parent = Page._filters.parent;
			
		if ( Page._filters.month )
		{
			var currMonth = new Date().getMonth();
			var year = new Date().getFullYear(),
				startDate = ( ( Page._filters.month >= currMonth ) ? year : year + 1 ) + '-' + Page._filters.month + '-01',
				dateParsed = new Date().parse( startDate ),
				endDate = dateParsed.increment( 'month', 1 ).increment( 'day', -1 ).format( '%Y-%m-%d' );
			
			processedFilters.startDate = startDate;
			processedFilters.endDate = endDate;
		}
		
		
		// Standard filters (hardcoded, in case we have no custom filters, used by the standard search)
		var currentDate = new Date();
		var currentMonth = currentDate.getMonth() + 1;
		
		processedFilters.startOfMonth = currentDate.getFullYear().toString() + '-' + currentMonth + '-' + '01';  //'2011-02-01';
		processedFilters.endOfMonth = currentDate.getFullYear().toString() + '-' + currentMonth + '-' + Page.daysInMonth(currentMonth,currentDate.getFullYear())//'2011-02-28'; // new Date().daysInMonth()
		
		
		// Send start row if supplied
		if ( startRow )
			processedFilters.startRow = startRow;
		
		
		// Log filters
		$log( processedFilters );
		
		
		// Call the action
		Aurora.loadSparkle({
			path: 'Actions/WhatsOn-Results',
			data: processedFilters
		})
		.then( function( rtn ) {
			
			$container.removeClass( 'loading' );
			
			$container.set( 'html', rtn.html );
			
			$container.getElements( '.item' ).each( function( $i ) {
			
				 var link = $i.getElement( '.name a' ).getProperty( 'href' );
				 
				 $i.addEvent( 'click', function() {
				 
				 	top.location.href = link;
				 
				 });
			
			});
		
		});
	
	}
	
});

whenReady(function(){

	Page.initData();

	Page.initSearch();
	
	Page.loadResults();

});
