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

		ajaxFail:function( ){ throw( 'failed to complete server request...' ); },

		processData:function( data )
		{
			var result = false;
			try{ result = $.evalJSON( data ); }	catch( e ){ alert( e ); result = false; }
			single.set( 'xhrResult', result );
		},

		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( fullList[ i ][ 'eventDate' ] );
					
						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<1294||@.client_id>1297)]' ) )
							{ 
								eventDate = new Date( fullList[ i ][ 'eventDate' ] );
							
								if( startDate.getTime( ) <= eventDate.getTime( ) && endDate.getTime( ) >= eventDate.getTime( ) )
								{
									list.push( fullList[ i ] );
								}
							}
						}
					}

					break;
				}

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

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

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

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

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

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

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

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

					break;
				}

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

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

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

	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 width="100%" cellspacing="0">\
<tr valign="top" class="">\
	<td>&nbsp;</td>\
	<td width="6" height="10">&nbsp;</td>\
	<td width="80" align="left"><h4>DATE/TIME</h4></td>\
	<td width="6" height="10">&nbsp;</td>\
	<td align="left"><h4>EVENT</h4></td>\
	<td width="6" height="10">&nbsp;</td>\
	<td width="85" align="left"><h4>CATEGORY</h4></td>\
</tr>';
			var template =
'<tr valign="top">\
	<td style="vertical-align:top;"><!--||THUMBNAIL||--></td>\
	<td>&nbsp;</td>\
	<td valign="top" align="left"><p class="dateline"><!--||EVENTDATE||--></p></td>\
	<td>&nbsp;</td>\
	<td valign="top" align="left">\
	<h5><!--||TITLE||--></h5><br/>\
	<p class="aqua"> <!--||LINKHTML||--> </p>\
	</td>\
	<td>&nbsp;</td>\
	<td valign="top" align="left"><!--||CATEGORY||--></td>\
</tr>';

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

				if( obj )
				{
					var links = obj[ 'links' ];
					var media = obj[ 'media' ];
					var client = obj[ 'client' ];
					var thumbNail = '';
					var linkHtml = '';
					var category = '';

					if( client != null )
					{
						for( x in client )
						{
							switch( client[ x ][ 'client_id' ] )
							{
								case '1294':{ category = client[ x ][ 'name' ]; break; }
								case '1295':{ category = client[ x ][ 'name' ]; break; }
								case '1296':{ category = client[ x ][ 'name' ]; break; }
								case '1297':{ category = client[ x ][ 'name' ]; break; }
								case '1295':{ category = client[ x ][ 'name' ]; break; }
								case '1292':{ category = obj[ 'eventType' ]; break; }
								default:{ category = obj[ 'eventType' ]; }
							}
						}

						category = this.ucwords( category );
					}

					if( media != null )
					{
						for( x in media )
						{
							if( media[ x ][ 'media_type_id' ] == 11 ){ thumbNail = '<img src="'+ media[ x ][ 'url' ] +'" alt="'+ media[ x ][ 'alt_tag' ] +'" />'; }
						}
					}

					if( links != null )
					{
						sorted = $( links ).sort( object.sortLinks );

						var num  = sorted.length;
						var linkHtml = '';

						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/index/eventsbox/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||-->',
							'<!--||THUMBNAIL||-->',
							'<!--||LINKHTML||-->',
							'<!--||CATEGORY||-->'
						],
						[
							obj[ 'title' ],
							obj[ 'date' ],
							thumbNail,
							linkHtml,
							category
						],
					template );
				}
			} // end loop.

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

			$( '#eventslist' ).hide( 'slide', { direction:'left' }, 300, function( )
			{
				$( '#eventslist' ).html( html );			
				$( '#eventslist' ).find( 'table' ).colorRows( '', 'rowColor' );

				$( '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.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; }
})( );
