$(function() {
	slideshow.init();
	calendar.init();

	
	if ( $('.organizations #filter').size() ) {
		var filter = $('.organizations #filter');
		var categories = $('.categories', filter);
		var search_by_location = $('.search_by_location', filter);
		var ul = $('ul', filter);
		
		$('.search_type input[type=radio]', filter).bind('change', function() {
		
			if ( $(this).attr('checked') && $(this).val() == 'location' )
			{
				$('fieldset.location_fields', filter).show();
				$('fieldset.name_fields', filter).hide();
			}
			else
			{
				$('fieldset.location_fields', filter).hide();
				$('fieldset.name_fields', filter).show();
			}			
		});
		
		$('input[type=checkbox]', search_by_location).bind('change', function() {
			if ( $(this).attr('checked') )
			{
				$(search_by_location).hide();
				$('.the_location', filter).show();
			}
			else
			{
				$(search_by_location).hide();
				$('.the_location', filter).show();
			}
		});
		
		$('input[type=checkbox]', categories).bind('change', function() {
			var li = $(this).parent();
			
			if ( ! li.hasClass('all') )
			{
				$('li.all input[type=checkbox]', ul).removeAttr('checked');
			}
			else
			{
				$('li.other input[type=checkbox]', ul).removeAttr('checked');
			}
		});
	}
	
	new Modal('.overlay.signin', modals.login);
	new Modal('.overlay.claim', modals.claim);
	new Modal('.overlay.share', modals.share);
	new Modal('.overlay.photo', modals.photo);
	new Modal('.overlay.signup', modals.register);
	new Modal('.overlay.create_organization', modals.create_organization);
	
	new Accordian('#course .lessons', '.lesson', 'h3');
	new Accordian('#education_sidebar', '.block', 'h3');
	new Accordian('.menu_container .strains', '.strain', 'h2');
	
	new MapFilter();
	
	$('.comments .form').each(function() {
		$(".select_rating", self.comment).hide();	
		$('.rating_picker', self.comment).show();
		
		rating_picker.init();	
	});
	
	new Panel($('.comments .other'), function(parent) {
		if ( $('.slide.form', parent.panel).size() > 0 )
		{
			parent.slide(1, false);
	
			$('.create_comment', parent.panel).bind('click', function() {
				parent.slide(0);
				return false;		
			});
			
			$('.cancel', parent.panel).bind('click', function() {
				parent.slide(1);
				return false;
			});	
		}	
	});
	
	$('.comments .comment').each(function() {		
		new Panel(this, function(parent) {
			if ( $('.slide.form', parent.panel).size() > 0 )
			{	
				parent.slide(1, false);
				
				$('.update', parent.panel).bind('click', function() {
					parent.slide(0);
					return false;
				});
				
				$('.cancel', parent.panel).bind('click', function() {
					parent.slide(1);
					return false;
				});
			}
		});
	});
});

function Panel(panel, extend) {
	var self = this;
	
	self.panel = panel;
	
	this.slide = function(index, animate) {
		$('.slide', self.panel).show();
	
		var slider = $('.slider', self.panel);
		var slide = $('.slide', slider).eq(index);
		
		if ( animate == null || animate == true )
		{
			$('.slider_wrapper', slider).animate({top: -slide.position().top});
			$(slider).animate({height: slide.outerHeight()+'px'});
		}
		else 
		{
			$('.slider_wrapper', slider).css({top: -slide.position().top});
			$(slider).css({height: slide.outerHeight()+'px'});			
		}
		
		return false;		
	}
	
	if ( extend ) extend(self);
}

function Modal(selector, extend) {
	this.overlay = $(selector);
	this.positioned = false;
	this.height = 0;
	this.current_slide = 0;
	this.hide_callback = null;
		
	var self = this;
	
	$('.shade', this.overlay).click(function() {
		self.hide();
		
		return false;
	});

	$('.close', this.overlay).click(function() {
		self.hide();
		
		return false;
	});
		
	this.show = function() {
		var slider = $('.slider', self.overlay);

		if ( slider.size() )
		{
			self.slide(0, false);
		}

		if ( self.positioned == false )
		{
			self.positioned = true;
			self.position();
		}
				
		var slider = $('.slider', self.overlay);
		if ( slider.size() )
		{
			$(slider).height(self.height+'px');
			$('.slider_wrapper', slider).css({top: 0+'px'});
		}
				
		$(self.overlay).fadeIn(150, function() {
			$('.modal', self.overlay).delay(150).fadeIn(100, function() {
				$('#username_field', self.overlay).trigger('focus');
			});	
		});		
	}
	
	this.hide = function() {
		$('.modal', self.overlay).fadeOut(100, function() {
			$(self.overlay).fadeOut(150);
			$('#signin_email_field', this).val('');
			$('#signin_password_field', this).val('');
			$('.signin_error', this).hide();					
			
			if ( self.hide_callback )
			{
				self.hide_callback(self);
			}
		});		
	}
	
	this.slide = function(index, animate, callback)
	{
		var slider = $('.slider', self.overlay);
		var slide = $('.slide', slider).eq(index);
				
		if ( animate || animate == null )
		{
			$('.slider_wrapper', slider).animate({top: -slide.position().top});
			$(slider).animate({height: slide.outerHeight()+'px'});
		}
		else
		{
			$('.slider_wrapper', slider).css({top: -slide.position().top});
			$(slider).css({height: slide.outerHeight()+'px'});
		}
		
		if ( callback )
		{
			callback(self);
		}

		return false;		
	}
		
	this.shake = function()
	{
		var modal = $('.modal', self.overlay)

		var times = 2;
		var distance = 10;
		var duration = 150;
		var left = modal.offset().left;
		
		for (var i = 0; i < times; i++ )
		{
			$(modal).animate({
				left: left + (distance * -1)
			}, duration / 4).animate({
				left: left + distance
			}, duration / 2).animate({
				left: left
			}, duration / 4);
		}		
	}
	
	this.position = function() {
		var modal = $('.modal', self.overlay);
		
		var ww = $(window).width();
		var mw = modal.width();

		modal.offset({left: ((ww/2)-(mw/2))});		
	};
	
	this.errors = function(errors)	{
		self.clear_errors();
		
		for (key in errors)
		{
			var field = $('.field[ref='+key+']', self.overlay);
			self.set_error(field, errors[key]);
		}
	};
	
	this.clear_errors = function() {
		$('.field', self.overlay).removeClass('error');		
		self.slide(self.current_slide, false);
	};

	this.clear_error = function(field) {
		$(field).removeClass('error');		
		self.slide(self.current_slide, false);
	};
	
	this.set_error = function(field, message, resize) {
		if ( message )
		{
			$(field).addClass('error');
			$('.message', field).text(message);
			
			if ( resize || resize == null )
			{
				self.slide(self.current_slide, false);
			}
		}
	};
		
	extend(this);

	return {
		show: this.show,
		hide: this.hide,
		shake: this.shake,
		slide: this.slide,
		clear_errors: this.clear_errors
	}	
}

var rating_picker = {
	init: function() {
		if ( $('.rating_picker').size() )
		{
			$('.rating_picker').each(function() {
				var temp = 0;
	
				var selector = $(this).prev('.select_rating');
	
				var rating = $(selector).val();
				rating_picker.show(this, rating);	
				
				$('li', this).bind('mouseenter', function() {
					var rating = $(this).attr('ref');
					var picker  = $(this).parent('.rating_picker');
										
					if ( rating != temp )
					{
						temp = rating;
												
						rating_picker.show(picker, temp);
					}
				});
				
				$(this).bind('mouseleave', function() {
					var rating = $(selector).val();
					rating_picker.show(this, rating);
				});
				
				$('li', this).bind('click', function() {
					var rating = $(this).attr('ref');
					$(selector).val(rating);					
				});
			});
		}
	},
	show: function(picker, rating) {
		var rate = $('li[ref='+rating+']', picker);
		$('li.current', picker).removeClass('current');

		rate.addClass('current');
		rate.prevAll().each(function() {
			$(this).addClass('current');
		});		
	}
}

var slideshow = {
	pause_speed: 10000,
	ease: 'easeInOutCirc',
	transition_speed: 750,
	frame: 	$('#slideshow .slide_container'),
	slide_width: 	$('#slideshow .slide_container').width(),
	slide_count: 	$('#slideshow .slide').size(),
	current_position: 0,
	indicators_created: false,
	interval: false,
	
	init: function() {
		// Init Interface

		if ( $('#slideshow').size() )
		{		
			// Resets the width
			$('#slideshow .slide_container .wrapper').width(slideshow.slide_width * slideshow.slide_count);
		
			// Draw Interface
			slideshow.refresh();

			// Start slideshow on window focus and load.
			$(window).bind('focus, load', function() {
				slideshow.start();
			});

			// Stop slideshow on window blur.
			$(window).bind('blur', function() {
				slideshow.stop();
			});		
		}
	},
	
	// Start animation
	start: function() {	
		slideshow.interval = setInterval(function() {
			var p = slideshow.current_position;
			var c = slideshow.slide_count;

			slideshow.current_position = (p+1) < c ? p + 1 : 0;	
			slideshow.refresh();

			slideshow.animate(slideshow.current_position);
		}, slideshow.pause_speed);		
	},
	
	// Stop animation
	stop: function() {
		clearInterval(slideshow.interval);
	},
	
	// Animate to position
	animate: function(position) {
		$('.wrapper', slideshow.frame).animate({
			'left': slideshow.slide_width*(-position)
		}, slideshow.transition_speed, slideshow.ease);		
	},
	
	// Create indicators, if not created, and 
	// set current indicator. 
	refresh: function() {
		slideshow.create_indicators();
		
		$('.indicators a').removeClass('current');
		$('.indicators li:nth-child('+(slideshow.current_position+1)+') a').addClass('current');
	},
	
	// Create indicators and set events
	create_indicators: function() {
		if ( slideshow.indicators_created == false)
		{
			slideshow.indicators_created = true;
			
			var ul = '<ul class="indicators">';
			
			for(var i = 0; i < slideshow.slide_count; i++) {
				ul += '<li><a href="#" rel="'+i+'">Slide '+i+'</a></li>';
			}
			
			ul += '</ul>';
		
			$(ul).appendTo('#slideshow');
		
			$('.indicators', '#slideshow').delegate('a', 'click', function(ev) {
				var old_position = parseInt(slideshow.current_position);
				var new_position = parseInt($(this).attr('rel'));
				
				// Only change position if it isn't the current position
				if ( new_position != old_position )
				{
					slideshow.stop();

					slideshow.current_position = new_position;
					slideshow.refresh();

					slideshow.animate(slideshow.current_position);

					slideshow.start();
				}
				
				ev.stopPropagation();
				return false;
			});
		}
	}
}

var calendar = {
	init: function() {
		$('#community_events').each(function() {
			var a_calendar = this;

			$('.header .prev', a_calendar).bind('click', calendar.change_month);
			$('.header .next', a_calendar).bind('click', calendar.change_month);
						
			$('.week .has_events', a_calendar).bind('click', calendar.show_events);
		});
	},
	change_month: function() {
		var url = $(this).data('url');
		var a_calendar = $('#community_events');		
		
		$('.header', a_calendar).addClass('loading');
		
		$.get(url, function(data) {
			$('.header', a_calendar).removeClass('loading');
			
			$('#community_events').replaceWith(data);
			calendar.init();
		});
		
		return false;
	},
	show_events: function() {
		var a_calendar = $('#community_events');		
		var events = $(this).parent('.week').next();
		var prev_day = $(events).data('day');
		var day = $(this).data('day');
		var day_selector = '.'+day;

		events.data('day', day);
		
		$('.day', a_calendar).removeClass('current');
		$(this).addClass('current');
				
		$(events).siblings('.events').slideUp();
		$('.week', a_calendar).removeClass('open');
		$(this).parent('.week').addClass('open');
				
		if ( day != prev_day)
		{
			events.slideUp(function () {
				$(day_selector, events).siblings().hide();
				$(day_selector, events).show();
				
				$(this).slideDown();
			});
		}
		else
		{
			$(day_selector, events).siblings().hide();
			$(day_selector, events).show();
			
			events.slideToggle();
		}	
	}
}

var modals = {
	login: function(parent) {	
		overlay = parent.overlay;
		parent.height = 153;
					
		$('.sign_in').click(function() {
			parent.show();
			
			return false;
		});
		
		$('.cancel', parent.overlay).click(function() {
			parent.hide();
			
			return false;
		});
		
		$('.forgot a', overlay).click(function() {
			parent.slide(1, true);
		});
		
		$('.reset form', overlay).bind('submit', function(event) {
			var form = this;
			
			var data = {
				email: $('#reset_email_field').val()
			}
			
			$.ajax({
				url: $(form).attr('action'),
				context: document.body,
				data: data,
				type: 'POST',
				success: function(data){	
					if ( data.success == false)
					{
						parent.shake();
						$('.reset_error', overlay).show();
					}
					else
					{
						parent.slide(2, true);
					}
				}
			});			
					
			event.preventDefault();
			return false;
		});
			
		$('.login form', overlay).bind('submit', function(event) {
			var form = this;
			var data = {
				email: $('#signin_email_field').val(),
				password: $('#signin_password_field').val()
			};		
					
			$.ajax({
				url: $(form).attr('action'),
				context: document.body,
				data: data,
				type: 'POST',
				success: function(data){	
					if ( data.success == false)
					{
						parent.shake();
						$('.signin_error', overlay).show();
					}
					else
					{
						location.reload();
					}
				}
			});			
			
			event.preventDefault();
			return false;
		});	
	},
	share: function(parent) {
		$('.share_story_action').bind('click', function() {
			parent.show();
			
			return false;	
		});
	},
	create_organization: function(parent) {
		parent.height = 152;
		
		var form = $('form', parent.overlay);
			
		$('.create_organization_action').bind('click', function() {
			parent.show();
			
			return false;	
		});
		
		$('.cancel', parent.overlay).click(function() {
			parent.hide();
			
			return false;
		});		
		
		$('.next_1', parent.overlay).bind('click', function() {		
			parent.slide(1);
			return false;
		});

		$('.next_2', parent.overlay).bind('click', function() {		
			parent.slide(2);
			return false;
		});
		
		$('input[type=submit]', parent.overlay).bind('click', function() {						
			var data = {
				name: $('#organization_name_field').val(),
				category_id: $('#organization_category_id_field').val(),
				email: $('#organization_email_field').val(),
				phone: $('#organization_phone_field').val(),
				address: $('#organization_address_field').val(),
				city: $('#organization_city_field').val(),
				state: $('#organization_state_field').val(),
				zip: $('#organization_zip_field').val()
			}
						
			$.ajax({
				url: $(form).attr('action'),
				context: document.body,
				data: data,
				type: 'POST',
				success: function(data){							
					if ( data.success == false || data == null)
					{						
						parent.shake();
						parent.errors(data.error);
					}
					else
					{
						parent.clear_errors();
						parent.slide(3);
					}
				}
			});			
						
			return false;
		});
	},
	photo: function(parent) {
		parent.photos = [];
		parent.current = null;
		
		$('.photo_container .photo').each(function() {
			var url = $('a', this).attr('href');
			parent.photos.push(url);
		});
			
		$('.photo_container .photo').bind('click', function() {
			var url = $('a', this).attr('href');
			
			parent.set(url);
			parent.show();
			return false;
		});
		
		parent.set = function set(src) {
			$('img', parent.overlay).attr('src', src);	
			parent.current = src;	
		}
		
		parent.change = function change(direction) {
			var index = parent.photos.indexOf(parent.current);
	
			if ( direction == 1 && index >= (parent.photos.length - 1) )
			{
				index = 0;
			}
			else if ( direction == -1 && index <= 0)
			{
				index = parent.photos.length - 1;
			}
			else
			{
				index += direction;
			}
							
			var url = parent.photos[index];
			parent.set(url);		
		}
		
		$('.previous a', parent.overlay).click(function() {
			parent.change(-1);
			return false;
		});
		
		$('.next a', parent.overlay).click(function() {
			parent.change(1);
			return false;
		});
	},
	claim: function(parent) {
		parent.height = 244;
		overlay = parent.overlay;
		
		$('.claim_organization').bind('click', function() {
			parent.show();
			
			return false;
		});
		
		$('.cancel', parent.overlay).click(function() {
			parent.hide();
			parent.clear_errors();
			location.reload();
			
			return false;
		});
	
		$('form', overlay).bind('submit', function() {
			var form = this;
	
			$.ajax({
				url: $(form).attr('action'),
				context: document.body,
				data: {
					name: $('#claim_name_field').val(),
					phone_number: $('#claim_phone_field').val(),
					company_position: $('#claim_position_field').val()
				},
				type: 'POST',
				success: function(data){				
					if ( data.success == false || data == null)
					{						
						parent.shake();
						parent.errors(data.error);
					}
					else
					{
						parent.clear_errors();
						parent.slide(1, true);
					}
				}
			});			
	
	
			return false;
		});
	},
	register: function(parent) {
		parent.height = 305;
		
		parent.hide_callback = function(parent) {
			parent.clear_errors();
			
			$('#signup_password_field').val('');
			$('#signup_password_confirmation_field').val('');
		}
		
		$('.sign_up').click(function() {
			parent.show();
			
			return false;
		});
	
		$('.cancel', parent.overlay).click(function() {
			parent.hide();
			
			return false;
		});
	
		$('#signup_email_field').blur(function() {
			var input = $(this);
	
			if ( input.val() != '' )
			{
				var url = $(this).data('url');
				var field = input.parent('.field');
									
				$.ajax({
					url: url,
					context: document.body,
					data: {
						email: input.val()
					},
					type: 'POST',
					beforeSend: function() {
						field.addClass('loading');
					},
					success: function(data) {					
						field.removeClass('loading');
					
						if ( data.success == true )
						{							
							parent.clear_error(field);
						}
						else
						{
							parent.set_error(field, data.error.email, true);
							parent.shake();
						}
					}
				});
			}
			
			return false;
		});
	
		$('#signup_display_name_field').blur(function() {
			var input = $(this);
	
			if ( input.val() != '' )
			{
				var url = $(this).data('url');
				var field = input.parent('.field');
									
				$.ajax({
					url: url,
					context: document.body,
					data: {
						display_name: input.val()
					},
					type: 'POST',
					beforeSend: function() {
						field.addClass('loading');
					},
					success: function(data) {					
						field.removeClass('loading');
					
						if ( data.success == true )
						{							
							parent.clear_error(field);
						}
						else
						{
							parent.set_error(field, data.error.email, true);
							parent.shake();
						}
					}
				});
			}
			
			return false;
		});
		
		$('#signup_password_confirmation_field').blur(function() {
			var confirm = $(this);
			var password = $('#signup_password_field');
			
			if ( password.val() == confirm.val() )
			{
				parent.clear_error(confirm.parent('.field'));
			}
			else
			{
				parent.shake();
				parent.set_error(confirm.parent('.field'), 'Passwords do not match!', true);
			}
		});
		
		$('form', parent.overlay).bind('submit', function() {
			var form = this;
	
			$.ajax({
				url: $(form).attr('action'),
				context: document.body,
				data: {
					user: {
						display_name: $('#signup_display_name_field').val(),
						email: $('#signup_email_field').val(),
						password: $('#signup_password_field').val(),
						confirm_password: $('#signup_password_confirmation_field').val()
					}
				},
				type: 'POST',
				success: function(data){	
					if ( data.success == false)
					{						
						parent.shake();
						parent.errors(data.error);
					}
					else
					{
						parent.slide(1, true, function() {
							$('#signup_display_name_field').val('');
							$('#signup_email_field').val('');
							$('#signup_password_field').val('');
							$('#signup_password_confirmation_field').val('');
						});
					}
				}
			});			
			
			return false;
		});
	}
};

function MapFilter() {
	var self = this;
	
	self.filter = $('.organizations #filter');
	
	this.show = function() {
		self.filter.animate({
			right: -self.filter.width()+'px'
		});
		
		$('.hook .symbol', self.filter).text('+').attr('title', 'Click to reveal filter');
	
		return false;
	}
	
	this.hide = function() {
		self.filter.animate({
			right: '0px'
		});
		
		$('.hook .symbol', self.filter).text('-').attr('title', 'Click to hide filter');
	
		return false;
	}
	
	this.toggle = function() {
		self.filter.css('right') == '0px' ? self.show() : self.hide();
	
		return false;
	}
	
	if ( self.filter.size() )
	{
		$('.hook', self.filter).bind('click', self.toggle);
	}
}

function Accordian(items_selector, item_selector, hook_selector) {
	var items = $(items_selector);
	
	if ( items.size() )
	{
		$('.content', items).hide();
		
		$(item_selector+':first '+hook_selector, items).addClass('active').next().show();
		
		$(item_selector+' '+hook_selector, items).click(function() {
			if( $(this).next().is(':hidden') ) { //If immediate next container is closed...
				$(hook_selector, items).removeClass('active').next().slideUp(); //Remove all "active" state and slide up the immediate next container
				$(this).toggleClass('active').next().slideDown(); //Add "active" state to clicked trigger and slide down the immediate next container
			}
			return false; //Prevent the browser jump to the link anchor
		});
	}	
}
