/*
 * Javascript for zoobar.com
 */

var zoobar = {
	
	api_key : '',
	
	run : function() {
		
		// Add CSS enhancements
		zoobar.addEnhancement();
		
		// Load the calendar
		zoobar.loadCalendar();
		
		//Handle the forms
		zoobar.handleSubscribe();
		zoobar.handleUnsubscribe();
		zoobar.handleLogin();
		zoobar.handleMailer();
		
		$('ul#calendar_events li.more > ul > li > a.show_more_events').click(function() {
			$('ul#calendar_events li.events').show();
			return false;
		});
		
	},

	addEnhancement: function() {
		
		$('head').append('<link href="/css/zoobar_enhancement.css" ' +
						 'rel="stylesheet" type="text/css" media="screen, projection" title="The Zoo Bar" />');
						
	},
	
	fillCalendar : function(data) {
		
		var current_date = new Date(0);
		var current_block = '';
		var calendar_block = $('ul#calendar_events > li.events')[0];
		var calendar_event_block = $('ul#calendar_events > li.events > ul > li.event')[0];
		var coming_soon_block = $('div.coming_soon_body')[0];
		var coming_soon_divider = $('div.coming_soon_divider')[0];
		var coming_soon_count = 0;
		
		$('ul#calendar_events > li.events').remove();
		$('div.coming_soon_body').remove();
		$('div.coming_soon_divider').remove();
		
		$.each(data, function(index, value) {
			
			var current_date_day = current_date.getMonth() + '/' + current_date.getDate() + '/' + current_date.getFullYear();
			
			var event_end_date = new Date(value.end * 1000);
			var event_start_date = new Date(value.start * 1000);
			var event_start_date_day = event_start_date.getMonth() + '/' + 
										event_start_date.getDate() + '/' + 
										event_start_date.getFullYear();
				
			if(value.image != '' && coming_soon_count < 4) {
				
				var new_block = $(coming_soon_block).clone(true);
				$('p.day', new_block).html(zoobar.formatDate(event_start_date.valueOf()));
				$('img', new_block).attr('src', value.image);
				$('p.time', new_block).html(zoobar.formatTime(event_start_date.valueOf()) + ' - ' + 
												zoobar.formatTime(event_end_date.valueOf()));
				$('p.title', new_block).html(value.title);
				$('p.description', new_block).html(value.description);
				
				if(coming_soon_count > 0){
					var new_divider = $(coming_soon_divider).clone(true);
					$(new_divider).insertBefore('div.coming_soon_bottom');
				}
				$(new_block).insertBefore('div.coming_soon_bottom');
				
				coming_soon_count++;
				
			}
										
			if(event_start_date_day == current_date_day) {
				
				var event_block = $(calendar_event_block).clone(true);
				
				$('p.time', event_block).html(zoobar.formatTime(event_start_date.valueOf()) + ' - ' + 
												zoobar.formatTime(event_end_date.valueOf()));
				$('p.title', event_block).html(value.title);
				$('p.description', event_block).html(value.description);
				
				$('ul', current_block).append(event_block);
				
			} else {
				
				current_date = event_start_date;
				
				current_block = $(calendar_block).clone(true)
				$('p', current_block).html(zoobar.formatDate(event_start_date.valueOf()));
				$('ul > li.event > p.time', current_block).html(zoobar.formatTime(event_start_date.valueOf()) + ' - ' + 
												zoobar.formatTime(event_end_date.valueOf()));
				$('ul > li.event > p.title', current_block).html(value.title);
				$('ul > li.event > p.description', current_block).html(value.description);
				$(current_block).insertBefore('ul#calendar_events > li.more');
				
			}
			
		});
		
	},
	
	formatDate: function(utc) {
		
		var days = [
			'Sunday',
			'Monday',
			'Tuesday',
			'Wednesday',
			'Thursday',
			'Friday',
			'Saturday'
		];
		
		var months = [
			'January',
			'February',
			'March',
			'April',
			'May',
			'June',
			'July',
			'August',
			'September',
			'October',
			'November',
			'December'
		];
		
		var date = new Date(utc);
		var date_suffix = '';
		
		switch(date.getDate()) {
			
			case 1:
			case 21:
			case 31:
				date_suffix = 'st';
				break;
			case 2:
			case 22:
				date_suffix = 'nd';
				break;
			case 3:
			case 23:
				date_suffix = 'rd';
				break;
			default:
				date_suffix = 'th';
		}
		
		return days[date.getDay()] + ', ' + 
			months[date.getMonth()] + ' ' + 
			date.getDate() + date_suffix;
		
	},
	
	formatTime: function(utc) {
		
		var date = new Date(utc);
		var date_hours = '';
		var date_meridiem = '';
		var date_minutes = '';
		
		if(date.getHours() > 12){
			date_hours = date.getHours() - 12;
			date_meridiem = 'pm';
		} else if(date.getHours() == 0) {
			date_hours = 12;
			date_meridiem = 'am';
		} else {
			date_hours = date.getHours();
			date_meridiem = 'am';
		}
		
		if(date.getMinutes() < 10){
			date_minutes = '0' + date.getMinutes();
		} else {
			date_minutes = date.getMinutes();
		}
		
		return date_hours + ':' + date_minutes + date_meridiem;
		
	},
	
	handleSubscribe: function() {
		
		$('form#subscribe input#name').focus();
		$('form#subscribe').validate();
		$('form#subscribe').submit(function(){
			
			if($('form#subscribe').valid()){
				
				$('form#subscribe img.loading').show();
				
				$.ajax({
					url: 'subscribe',
					type: 'POST',
					cache: false,
					data: $('form#subscribe').serialize(),
					dataType: 'json',
					success: function(data){
						$('form#subscribe img.loading').hide();
						$('form#subscribe label.response').html(data.result);
					},
					error: function(){
						$('form#subscribe img.loading').hide();
						$('form#subscribe label.response').html('Error sending form. Try again later.');
					}
				});
				
			}
			
			return false;
			
		});
		
	},
	
	handleUnsubscribe: function() {
		
		$('form#unsubscribe input#email').focus();
		$('form#unsubscribe').validate();
		$('form#unsubscribe').submit(function(){
			
			if($('form#unsubscribe').valid()){
				
				$('form#unsubscribe img.loading').show();
				
				$.ajax({
					url: 'unsubscribe',
					type: 'POST',
					cache: false,
					data: $('form#unsubscribe').serialize(),
					dataType: 'json',
					success: function(data){
						$('form#unsubscribe img.loading').hide();
						$('form#unsubscribe label.response').html(data.result);
					},
					error: function(){
						$('form#unsubscribe img.loading').hide();
						$('form#unsubscribe label.response').html('Error sending form. Try again later.');
					}
				});
				
			}
			
			return false;
			
		});
		
	},
	
	handleLogin: function() {
		
		$('form#login input#username').focus();
		$('form#login').validate();
		$('form#login').submit(function(){
			
			if($('form#login').valid()){
				
				$('form#login img.loading').show();
				
				$.ajax({
					url: 'auth',
					type: 'POST',
					cache: false,
					data: $('form#login').serialize(),
					dataType: 'json',
					success: function(data){
						
						$('form#login img.loading').hide();
						
						if(data.success){
							zoobar.api_key = data.api_key;
							$('div.mailer').show();
						} else {
							$('form#login label.response').html('Error: Incorrect login.');
						}
						
					},
					error: function(){
						$('form#login img.loading').hide();
						$('form#login label.response').html('Error: Bad request.');
					}
				});
				
			}
			
			return false;
			
		});
		
	},
	
	handleMailer: function() {
		
		$('form#mailer input#subject').focus();
		$('form#mailer').validate();
		$('form#mailer').submit(function(){
			
			if($('form#mailer').valid()){
				
				$('form#mailer img.loading').show();
				
				$.ajax({
					url: 'mail',
					type: 'POST',
					cache: false,
					data: { 
						'api_key': zoobar.api_key,
						'subject': $('form#mailer input#subject').val(),
						'message': $('form#mailer textarea#message').val()
					},
					dataType: 'json',
					success: function(data){
						
						$('form#mailer img.loading').hide();
						
						if(data.success){
							$('form#mailer label.response').html('Newsletter dispatched for e-mailing to ' + data.recipients + ' subscribers.');
						} else {
							$('form#mailer label.response').html('Error: ' + data.message);
						}
						
					},
					error: function(){
						$('form#mailer img.loading').hide();
						$('form#mailer label.response').html('Error: Bad request.');
					}
				});
				
			}
			
			return false;
			
		});
		
	},
	
	loadCalendar : function() {
		
		$('ul#calendar_events li.loading').show();
		$('ul#calendar_events li.error').hide();
		$('ul#calendar_events li.events').hide();
		$('div.coming_soon').hide();
		
		$.ajax({
			url: 'data',
			dataType: 'json',
			success: function(data){
				zoobar.fillCalendar(data);
				$('ul#calendar_events li.loading').hide();
				$('ul#calendar_events li.events').each(function(index, value){
					if(index < 8){
						$(value).show();
					}
				});
				$('div.coming_soon').show();
			},
			error: function(){
				$('ul#calendar_events li.loading').hide();
				$('ul#calendar_events li.error').show();
			}
		});
		
	}

}