var generic = ( function( )
{
	var single = 
	{
		fields:{},
		get:function( key ){ return this.fields[ key ]; },
		set:function( key, val ){ this.fields[ key ] = val; },

		ajaxFail:function( ){ $.apprise( 'There was an error retrieving the events from the server.' ); },

		processData:function( data )
		{
			if( $.isArray( data ) )
			{
				single.set( 'total', data.shift( ) );
				single.set( 'xhrResult', data );			
			}
		},

		strReplace:function( search, replace, subject, count )
		{
			var i = 0, j = 0, temp = '', repl = '', sl = 0, fl = 0, f = [ ].concat( search ), r = [ ].concat( replace ), s = subject, 
				ra = r instanceof Array, sa = s instanceof Array; s = [ ].concat( s );

			if( count ){ this.window[count] = 0; }
			for( i = 0, sl = s.length; i < sl; i++ ){ if( s[ i ] === '' ){ continue; }
			for( j = 0, fl = f.length; j < fl; j++ )
			{
				temp = s[ i ]+'';
				repl = ra ? ( r[ j ] !== undefined ? r[ j ] : '' ) : r[ 0 ];
				s[ i ] = ( temp ).split( f[ j ] ).join( repl );
				if( count && s[ i ] !== temp ){ this.window[ count ] += ( temp.length - s[ i ].length ) / f[ j ].length; } }
			}

			return sa ? s : s[ 0 ];
		}, // end strReplace.
		
		ucwords:function( str ){ return ( str + '' ).replace( /^(.)|\s(.)/g, function ( $1 ){ return $1.toUpperCase( ); }); }
	} // end single.

	// constructor.
	return function( param ){ for( i in param ){ single.fields[ i ] = param[ i ]; } return single; }
})( );





var Event = ( function( )
{
	var object = new generic( );
	
	jQuery.fn.sort = function( ){ return this.pushStack( Array.prototype.sort.apply( this, arguments ), [ ] );  };

	object.sortPosition = function( a, b )
	{
		if( a.position == b.position ){ return 0; }
		return a.position > b.position ? 1 : -1;
	}

	object.sortLinks = function( a, b ){ return object.sortPosition( a, b ); }

	object.addControls = function( )
	{
		$( '#listfilter' ).click( function( )
		{
			var fullList = object.get( 'fullList' );
			var eventType = $( 'select[name="client_id"]' ).val( );
			var startMonth = ( $( '#startMonth' ).val( ) == 0 ) ? null : $( '#startMonth' ).val( );
			var startYear = ( $( '#startYear' ).val( ) == 0 ) ? null : $( '#startYear' ).val( );
			var endMonth = ( $( '#endMonth' ).val( ) == 0 ) ? null : $( '#endMonth' ).val( );
			var endYear = ( $( '#endYear' ).val( ) == 0 ) ? null : $( '#endYear' ).val( );
			var list = new Array( );
			var startDate = new Date( startYear, startMonth - 1 );
			var endDate = new Date( endYear, endMonth, 0, 23, 59, 59 );

			switch( eventType )
			{
				case 'all':
				{ 
					for( i in fullList )
					{
						eventDate = new Date( dateFormat( fullList[ i ][ 'event_date' ] ) );

						if( startDate.getTime( ) <= eventDate.getTime( ) && endDate.getTime( ) >= eventDate.getTime( ) )
						{
							list.push( fullList[ i ] );
						}
					}

					break; 
				}

				// other.
				case '1292':
				{
					for( i in fullList )
					{
						obj = fullList[ i ];

						if( obj.eventTypeId != 3 )
						{
							if( jsonPath( obj, '$..[?(@.client_id<1289||@.client_id>1290)]' ) )
							{ 
								eventDate = new Date( dateFormat( fullList[ i ][ 'event_date' ] ) );

								if( startDate.getTime( ) <= eventDate.getTime( ) && endDate.getTime( ) >= eventDate.getTime( ) )
								{
									list.push( fullList[ i ] );
								}
							}
						}
					}

					break;
				}

				// galaxy
				case '1289':
				{
					var newset = jsonPath( fullList, '$..client..[?(@.client_id==1289)]', { resultType:"PATH" } );

					for( i in newset )
					{
						temp = object.strReplace( ['$', '[' ], '', newset[ i ] );	
						parts = temp.split( ']' );
						num = parts[0];
						eventDate = new Date( dateFormat( fullList[ i ][ 'event_date' ] ) );

						if( startDate.getTime( ) <= eventDate.getTime( ) && endDate.getTime( ) >= eventDate.getTime( ) )
						{
							list.push( fullList[ num ] );
						}
					}
					break; 
				}

				// chivas
				case '1290':
				{
					var newset = jsonPath( fullList, '$..client..[?(@.client_id==1290)]', { resultType:"PATH" } );

					for( i in newset )
					{
						temp = object.strReplace( ['$', '[' ], '', newset[ i ] );	
						parts = temp.split( ']' );
						num = parts[0];
						eventDate = new Date( dateFormat( fullList[ i ][ 'event_date' ] ) );
						
						if( startDate.getTime( ) <= eventDate.getTime( ) && endDate.getTime( ) >= eventDate.getTime( ) )
						{
							list.push( fullList[ num ] );
						}
					}
					break;
				}

				case 'concert':
				{
					for( i in fullList )
					{ 
						if( fullList[ i ][ 'eventTypeId' ] == 3 )
						{ 
							eventDate = new Date( dateFormat( fullList[ i ][ 'event_date' ] ) );
					
							if( startDate.getTime( ) <= eventDate.getTime( ) && endDate.getTime( ) >= eventDate.getTime( ) )
							{
								list.push( fullList[ i ] );
							}
						} 
					}

					break;
				}

				// all
				default:
				{
					for( i in fullList )
					{
						eventDate = new Date( dateFormat( fullList[ i ][ 'event_date' ] ) );
						if( startDate.getTime( ) <= eventDate.getTime( ) && endDate.getTime( ) >= eventDate.getTime( ) ){ list.push( fullList[ i ] ); }
					}
					break; 
				}
			}

			object.set( 'currentList', list );
			object.pagination( );
			object.displayEvents( 1 );
		});
	}

	object.displayEvents = function( page )
	{
		var result = this.get( 'currentList' );

		if( result.length > 0 )
		{
			var start = ( page - 1 ) * 10;
			var end = page * 10;
			var html =
'<table cellspacing="0" cellpadding="0">\
<tr valign="top">\
	<td width="120" align="left"><h3>DATE/TIME</h3></td>\
	<td width="6" height="10">&nbsp;</td>\
	<td width="290" align="left"><h3>EVENT</h3></td>\
	<td width="6" height="10">&nbsp;</td>\
	<td width="150" align="left"><h3>VENUE</h3></td>\
</tr>';
			var template =
'<tr valign="top">\
	<td width="120" align="left"><!--||EVENTDATE||--></td>\
	<td width="6" height="10">&nbsp;</td>\
	<td width="290" align="left"><!--||TITLE||--><p class="event_links"> <!--||LINKHTML||--> </p></td>\
	<td width="6" height="10">&nbsp;</td>\
	<td width="150" align="left"><!--||SUBVENUE||--></td>\
</tr>\
<tr><td align="center" colspan="5"><hr width="100%" size="1" noshade="" color="#cdcdcd"/></td></tr>';


			for( var i = start; i < end; i++ )
			{
				var obj = result[ i ];

				if( obj )
				{
					var link = obj[ 'link' ];
					var media = obj[ 'media' ];
					var client = obj[ 'client' ];
					var linkHtml = '';
					var subvenue = '';

					var eventDate = dateFormat( obj[ 'event_date' ], 'mmm. dd, yyyy<br />hh:MM TT' );

					if( link != null )
					{
						sorted = $( link ).sort( object.sortLinks );
						var num  = sorted.length;

						for( var key = 0; key < num; key++ )
						{
							target = ( sorted[ key ][ 'target_blank' ] == 1 ) ? ' target="_blank"' : '';
							label = ( sorted[ key ][ 'link_type_id' ] == 14 ) ? object.strReplace( '%20', '', sorted[ key ][ 'label' ] ) + 
								' <img src="images/website/calendar.gif" style="border: 0px; vertical-align: middle;">' : sorted[ key ][ 'label' ];

							if( sorted[ key ][ 'active' ] != 0 )
							{
								if( num - 1 == key ){ linkHtml += '<a href="' + sorted[ key ][ 'url' ] + '"'+ target +'>'+ label +'</a>'; }
								else{ linkHtml += '<a href="' + sorted[ key ][ 'url' ] + '"'+ target +'>'+ label +'</a> | ' ; }
							}
						}
					}

					html += this.strReplace(
						[ 
							'<!--||TITLE||-->', 
							'<!--||EVENTDATE||-->', 
							'<!--||LINKHTML||-->',
							'<!--||SUBVENUE||-->'
						],
						[
							obj[ 'title' ], 
							eventDate,
							linkHtml,
							this.getSubVenue( obj[ 'venue' ][ 0 ][ 'sub_venue_id' ] )
						],
					template );
				}
			} // end loop.

			html += '<tr><td colspan="7" align="center">'+ this.pagination( page - 1 ) +'</td></tr>';
			html += '</table>';

			$( '#eventslist' ).hide( 'slide', { direction:'left' }, 300, function( )
			{
				$( '#eventslist' ).html( html );
				$( 'a[name="page"]' ).click( function( ){ if( !$( this ).is( '.pageFocus' ) ){ object.displayEvents( $( this ).html( ) ); } });
				$( this ).show( 'slide', { direction:'left' }, 500 );
			});
		} // event info is good.

		else{ $( '#eventslist' ).html( '<div style="font-size:14px; padding:50px 0;">No events were found for the search... Try again.</div>' ); }

	} // end displayEvents.

	object.getEvents = function( )
	{ 
//		$.ajax({ data:{ type:'eventsList' }, type:'post', async:false, url:'ajax/events.php', error:this.ajaxFail, success:this.processData });

		$.ajax(
		{
			"type":"GET", "dataType":"json", "async":false, "url":"proxy.php",
			"error":this.ajaxFail,
			"success":this.processData
		});

		var result = this.get( 'xhrResult' );
	} // end getEvents.


	object.getSubVenue = function( id )
	{
		switch( id )
		{
			case '1':{ subVenue = 'Soccer Stadium'; break; }
			case '2':{ subVenue = 'Tennis Stadium'; break; }
			case '3':{ subVenue = 'Velodrome'; break; }
			case '4':{ subVenue = 'Track &#38; Field Facility'; break; }
			case '5':{ subVenue = 'Other'; break; }
			case '6':{ subVenue = 'None'; break; }
			case '7':{ subVenue = 'LeBard Stadium'; break; }
			default :{ subVenue = ''; }
		}

		return subVenue;
	} // end eventStatusImage.

	object.pagination = function( page )
	{
		var result = this.get( 'currentList' );
		var total = Math.ceil( result.length / 10 );
		var html = 'Page &nbsp;&nbsp;';

		for( var i = 0; i < total; i++ )
		{
			var className = ( i == page ) ? 'pageFocus' : '';	
			html += '<a name="page" href="javascript:;" rel="'+ ( i + 1 ) +'" class="'+ className +'">'+ ( i + 1 ) +'</a> &nbsp;&nbsp;';
		}
		return html;
	} // end pagination.

	return function( ){ return object; }
})( );

