$extend( FY, {

	_tabsInitalised: false,

	onGoogleReady: function() {
		$log( 'Google maps ready!' );
		FY.initMapLocations();
	},

	initMapLocations: function()
	{
		if ( !$( 'map' ) )
			return;
		
		if ( !GBrowserIsCompatible() ) 
			return;

		var map = new GMap2( $( 'map' ) );
		
		map.addControl( new GLargeMapControl() );
		map.addControl( new GMapTypeControl() );
		
		map.setCenter( new GLatLng( 37, -90 ), 3 );
		
		var bounds = new GLatLngBounds();
		
		var types = [ 'studios' /*, 'teachers', 'events'*/ ];
		
		types.each( function( type ) {
			
			FY._results[ type ].each( function( locationData ) {
				
				if ( !locationData.location.longitude && !locationData.location.latitude ) {
					$log( 'No longitude and latitude found.' );
					return;
				}
				
				// Set current type so we can specify a custom link
				locationData._type = type;

				var point = new GLatLng( locationData.location.latitude, locationData.location.longitude );
				var marker = FY.createMarker( point, locationData );

				map.addOverlay( marker );
				bounds.extend( point );

			});
		
		});
		
		map.setZoom( map.getBoundsZoomLevel( bounds ) );
		
		map.setCenter( bounds.getCenter() );
	
	},

	createMarker: function( point, locationData )
	{
		var marker = new GMarker( point );
		
		var html = '';
		
		html += '<div class="textPanel">';
			
			html += '<div class="closeButton"></div>';
		
			$log( 'Data:', locationData );
		
			html += '<h3 style="color: #5B5F61; font-weight: bold; margin: 0px 15px 0px 0px; margin-bottom: 10px;"><a class="darkBlue" style="font-size: 15px;" href="http://www.findyoga.com/Page/StudioDetails/' + locationData.itemId + '">' + locationData.name + '</a></h1>';
		
			var location = '';
		
			if ( locationData.location.address.length )
				location += locationData.location.address + '<br>';
		
			if ( locationData.location.suburb.length )
				location += locationData.location.suburb + '<br>';
			
			if ( locationData.location.state.length )
				location += locationData.location.state + '<br>';
	
			if ( locationData.location.postcode.length )
				location += locationData.location.postcode + '<br>';
			
			html += '<div style="margin-bottom: 10px;">' + location + '</div>';
			
			if ( locationData._type = 'studios' )
				html += '<a class="darkBlue" href="http://www.findyoga.com/Page/StudioDetails/' + locationData.itemId + '">More Details</a>';
		
		html += '</div>';
		
		GEvent.addListener( marker, "click", function() {
			marker.openInfoWindowHtml( html );
		});
		
		return marker;
	},

	initClasses: function()
	{
		if ( !FY._results || !FY._results.studios || !FY._results.studios.length )
			return;
		
		// Set initial data
		FY._classes = {
			studioIds: [],
			dayOfWeek: 1,
			dayOfWeek_text: 'monday',
			startRow: 1 
		};
	
		// Store references to studio ids
		FY._results.studios.each( function(s) {
			
			FY._classes.studioIds.push( s.itemId );
		
		});
		
		// Load initial Monday classes
		FY.loadClasses( 1, FY._classes.startRow );
		
	},
	
	setDay: function( day )
	{
		FY._classes.dayOfWeek = day;
	
		switch( day )
		{
			case 1:
				FY._classes.dayOfWeek_text = 'monday';
				break;
			case 2:
				FY._classes.dayOfWeek_text = 'tuesday';
				break;
			case 3:
				FY._classes.dayOfWeek_text = 'wednesday';
				break;
			case 4:
				FY._classes.dayOfWeek_text = 'thursday';
				break;
			case 5:
				FY._classes.dayOfWeek_text = 'friday';
				break;
			case 6:
				FY._classes.dayOfWeek_text = 'saturday';
				break;
			case 7:
				FY._classes.dayOfWeek_text = 'sunday';
				break;
		}
	},
	
	loadClasses: function( day, start )
	{
		if ( !$( 'classTimetable' ) )
			return;
	
		// Set inital data
		var data = {
			studioIds: FY._classes.studioIds,
			dayOfWeek: day,
			maxRows: 25,
			startRow: start,
			classTimeEarliest: 0000,
			classTimeLatest: 2359
		}
		
		$log( 'Sending data:', data );
		
		// Set reference to start row
		FY._classes.startRow = start;
		
		// Apply link styles and set day
		$( 'button_' + FY._classes.dayOfWeek_text ).removeClass( 'selected' );
		
		FY.setDay( day );
		
		$( 'button_' + FY._classes.dayOfWeek_text ).addClass( 'selected' );
		
		// Load new data, temp solution to get data
		new Request.JSON({
		          
		    url: callActionURL + '?action=classes.loadClasses&jsonData=' + JSON.encode( data ),
		
		    onComplete: function( rtnData ) {
			
				if ( rtnData && rtnData.success )
				{
					FY.renderClasses( rtnData.classes );
					FY.initTabs( rtnData );
				}
				else
				{
					$log( 'No classes found!' );
					return;
				}
		
		    }
		
		}).post();
		
		/*
		Aurora.callAction({
			
			action: 'classes.loadClasses',
			
			data: data,
			
			onComplete: function( rtnData ) {
				
				if ( rtnData.success )
				{
					FY.renderClasses( rtnData.classes );
					FY.renderPagination( rtnData.classesFoundOnDaysOfWeek );
				}
				else
				{
					$log( 'No classes found!' );
					return;
				}
				
			}
			
		});
		*/
	
	},
	
	initTabs: function( classes )
	{
		if ( FY._tabsInitalised )
			return;
			
		var classesFound = false;
	
		// Init days of weeks
		var days = [ 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday' ];
		
		days.each( function( day, index ) {
		
			// Rename label of button based on data returned
			var classCount = classes.classesFoundOnDaysOfWeek[ index ];
			
			// Determine the label based on what data there is
			var label = ( day + ' (' + classCount + ')' ).toUpperCase();
			
			if ( !classCount )
				label = ( day ).toUpperCase();
			
			$( 'button_' + day ).getElement( 'a' ).set( 'text', label );
				
			// Don't add any events if we have no classes and change the styles
			if ( !classCount ) {
				$( 'button_' + day ).addClass( 'inactive' );
				return;
			}
			
			classesFound = true;
			
			// Remove inactive class, just in case
			$( 'button_' + day ).removeClass( 'inactive' );
				
			// Add click event
			$( 'button_' + day ).addEvent( 'click', function() {
			
				// Increment by one to support the action
				var dayInteger = index + 1;
			
				// $log( 'Loading class with day: ' + dayInteger );

				FY.loadClasses( dayInteger, FY._classes.startRow )
			
			});
		
		});
		
		if ( classesFound ) {
			$( 'jump_timetables' ).show();
			$( 'container_timetable' ).show();	
		}
		
		FY._tabsInitalised = true;
	
	},
	
	renderClasses: function( classes )
	{
		var $classes = $( 'classes' );
		
		$classes.empty();
		
		// Render the classes
		classes.each( function( c ) {
			
			$log( c );
			
			var container = new Element( 'div', { style: 'border-bottom: 1px solid #D3D3D3; overflow: auto;' } );
				
			// Determine time of class
			var startTime = c.time;
			var length = c.time.toString().length;
			
			var startTimeFormatted;
			
			switch( length )
			{
				case 2:
					startTimeFormatted = '00:' + startTime;
				break;
				
				case 3:
					startTimeFormatted = '0' + startTime.toString().slice( 0, 1 ) + ':' + startTime.toString().slice( 1 );
				break;
				
				case 4:
					startTimeFormatted = startTime.toString().slice( 0, 2 ) + ':' + startTime.toString().slice( 2 );
				break;
			
			}
			
			new Element( 'div', { 'class': 'tableCol', style: 'width: 50px;', text: startTimeFormatted } ).inject( container );
				
			new Element( 'div', { 'class': 'tableCol', style: 'width: 65px;', html: c.length + ' mins &nbsp;' } ).inject( container );
			
			new Element( 'div', { 'class': 'tableCol', html: c.studioCity + '&nbsp;' } ).inject( container );
							
			new Element( 'div', { 'class': 'tableCol', style: 'width: 185px;', html: '<a class="darkBlue" href="/Page/StudioDetails?studio=' + c.studioId + '">' + c.studioName + '</a>' } ).inject( container );		
			
			new Element( 'div', { 'class': 'tableCol', style: 'width: 75px;', html: c.style + '&nbsp;' } ).inject( container );
			
			new Element( 'div', { 'class': 'tableCol', style: 'width: 75px;', html: c.type + '&nbsp;' } ).inject( container );	
			
			new Element( 'div', { 'class': 'tableCol', style: 'width: 150px;', html: '<a class="darkBlue" href="/Page/TeacherDetails?teacher=' + c.teacherId + '">' + c.teacherName + '</a>' + '&nbsp;' } ).inject( container );
			
			container.inject( $classes );

		});
		
		if ( FY._tabsInitalised )
			top.location.href = '#classTimetable';
	
	},
	
	renderPagination: function( classes )
	{
		// In-progress pagination code
		return;
	
		var $pagination = $( 'pagination' );
		var $pagination_pages = $( 'pagination_pages' );
		var $pagination_previous = $( 'pagination_previous' );
		var $pagination_next = $( 'pagination_next' );
		
		$pagination_pages.empty();
	
		// Render pagination links and turn on/off days of week depending on results
		var records = classes[ FY._classes.dayOfWeek - 1 ];
	
		// No classes
		if ( records <= 25 ) {
			$log( 'Less than 25 records found, hiding pagination.' );
			$pagination.hide();
			return;
		}

	}
	
});
