jQuery.fn.uncheck = function(){
	$(this).each(function(){
		this.checked = false;
		return $(this);
	});
}

jQuery.preloadImages = function() {
	for(var i = 0; i<arguments.length; i++) {
		$("<img>").attr("src", arguments[i]);
	}
}

jQuery.trim = function(s){
	return s.replace(/^\s+|\s+$/,'');	
}


var Site = {
	
	waitlistOk: false,
	
	/*
	 * Sets a tags with a rel=external to open in new window
	 */ 
	initExternalLinks: function(){
		$('a[rel="external"]').click( function() {
		    window.open( $(this).attr('href') );
		    return false;
		});		
	},
	
	/*
	 * Initialize rollover states for buttons
	 */
	initRollovers:function(){
		$('#remove').hover(
			function() { $(this).attr({src:"/assets/img/remove_guest_over.gif"})},
			function() { $(this).attr({src:"/assets/img/remove_guest.gif"})}
		);

		$('#send').hover(
			function() { $(this).attr({src:"/assets/img/send_over.gif"})},
			function() { $(this).attr({src:"/assets/img/send.gif"})}
		);

		$('#add').hover(
			function() { $(this).attr({src:"/assets/img/add_guest_over.gif"})},
			function() { $(this).attr({src:"/assets/img/add_guest.gif"})}
		);

		$('#forum').hover(
			function() { $(this).attr({src:"/assets/img/visit_forum_over.gif"})},
			function() { $(this).attr({src:"/assets/img/visit_forum.gif"})}
		);		
	},
	
	/*
	 * Add all events to show entries, hover, click.  Mainly visual
	 * display prompts
	 */
	initShowListings:function(){
		$('#shows>li').hover(
			function() { 
				var li = $(this);
				li.addClass('hover').find('.tickets>a>img').attr({src:"/assets/img/get_tickets_over.gif"});

				if (li.attr('id') != 'first') {
					li.css ({ borderTop: '5px solid #3bc6ec' });
				}
			},
			function() { 
				var li = $(this);
				li.removeClass('hover').find('.tickets>a>img').attr({src:"/assets/img/get_tickets.gif"});

				if (li.attr('id') != 'first') {
					li.css({ borderTop: '5px solid #e3e3e3' });
				}
			}
		).click(function(e){
			window.location = $(this).find('.tickets>a').attr('href');
			e.stopPropagation();
			e.preventDefault();
		});		
	},
	
	/*
	 * Add events to input elements to restore fields to original
	 * values if left blank
	 */
	bindInputEvents:function(){
		$("input.text").focus(function () {
			 if (this.value.match(/first name|last name|unique e-mail address per guest|e-mail address/i)) {
				this.value = ''; 
			 }
		});

		$("input.firstname,input.lastname,input.email").blur(function () {
			 if ((this.value).replace(/\s/g,"") == "") {
				this.value = this.defaultValue; 
			 }
		});	
	},
	
	/*
	 * Adds mouse and click events to show for adding and delting
	 * show entries.  Also addresses color change of show upon selection
	 */
	bindShowEvents:function(){
		$(".form-cont").click(function () {		
			$('.form-cont').each(function() {
				$(this).find('input.text').css ({ 'color': '#000' });
			});
			$(this).find('input.text').css ({ 'color': '#ef4323' });
		});	
		
		$("#add").click( Site.addNewGuest );
		
		$("#remove").click( Site.removeLastGuest );
		
		$("#send").click(function () {	  
			var ok = Site.validateGuestSubmissions($('#seats').get(0));
			if(ok){
				$('#seats').submit();
			}
		});
	},
	
	/*
	 * Clone a DOM node and create a new guestfrom it.  Append after
	 * the current guest and reset form fields
	 */
	addNewGuest:function(){
		var guestList = $('.form-cont');
		var lastGuest = $('.form-cont:last');
		var id = parseInt(lastGuest.find('input.firstname').attr('name').match(/^guest\[(\d+)\]/)[1]);
		
		// Verify seats have been selected for first guest
		if($('#seats input[type=checkbox]').length && $('#seats input[type=checkbox]:checked').length == 0){
			Site.showError('Please select show(s) before adding another person.');
			return false;
		}

		// Create and give our new guest an incrmental id based on the last guest
		var newGuest = lastGuest.clone(true);
		newGuest.attr({id:'guest_'+(id+1)}).insertAfter(lastGuest);

		// Reset input text colors on all guest textboxes
		guestList.each(function() {
			$(this).find('input.text').css ({ color: '#000' });
		});
	
		// Update properties on new guest fields
		with(newGuest){
			find('.text').css ({ color : '#ef4323'});
			find('input.firstname').val('first name');
		   find('input.lastname').val('last name');
		   find('input.email').val('unique e-mail address per guest');
			find('input.checkbox').uncheck();
			find('input').each(function(){ 
				var inp = $(this);
				inp.attr('name', inp.attr('name').replace(/guest\[\d+\]/, 'guest['+(id+1)+']')); 
				inp.attr('id', inp.attr('id').replace(/guest_\d+/, 'guest_'+(id+1)))
			});
			find('label').each(function(){ 
				var lbl = $(this);
				lbl.attr('for', lbl.attr('for').replace(/guest_\d+/, 'guest_'+(id+1)))
			});
		}

		// Reset guest list as we appended a new node
		guestList = $('.form-cont');

		// Hide/Show Add and Remove Buttons based on guest count
		if (guestList.length > 1){
			$('#remove').css({ visibility: 'visible'});
		}
		
		if (guestList.length == 6){
			$('#add').css({ visibility: 'hidden'});
		}		
	},
	
	/*
	 * Remove the last guest from the DOM tree of guest listings
	 */
	removeLastGuest:function(){
		var guestList = $('.form-cont');
		var lastGuest = $('.form-cont:last');
		
		lastGuest.remove();
		
		guestList = $('.form-cont');	// Reset guest list since we removed a node	
		guestList.each(function() {
			$(this).find('input.text').css ({ color: '#000' });
		});
		
		$('.form-cont:last').find('.text').css({ color : '#ef4323'});
		
		if (guestList.length < 2){
			$(this).css({ visibility: 'hidden'});
		}
		
		if (guestList.length < 6){
			$('#add').css({ visibility: 'visible'});
		}	
	},
	
	showError:function(msg){
		var timeout = 3;
		var counter = timeout;
	
		$('.info').html(msg + '<span class="counter">Closing in '+timeout+' seconds</span>').slideDown();
		

		var interval = setInterval(function(){
			$('.info .counter').text('Closing in '+(counter--)+' seconds');
		},1000);		

		window.setTimeout(function(){
			$('.info').slideUp(function(){ clearInterval(interval)});
		}, (timeout+1) * 1000);		
		
	},
	
	/*
	 * Validate information for all guests entered
	 */
	validateGuestSubmissions:function(form){
		
		var inputs = $('#seats input');
		
		for(i=0;i<inputs.length;i++){
			var el = inputs[i];
			
			if(typeof el.name != 'undefined'){
				if(el.name.match(/email/i)){
					if(!el.value.match(/^[A-Za-z_0-9'\.\-]+@[A-Za-z_0-9'\.\-]+(\.\w+)+$/)){
						Site.showError('E-mail entered is not valid.');
						el.focus();	
						return false;
					}
				}else if(el.name.match(/firstname/i)){
					if($.trim(el.value) == '' || $.trim(el.value).match(/first name/i)){
						Site.showError('First name entered is not valid.');
						el.focus();
						return false;				
					}
				}else if(el.name.match(/lastname/i)){
					if($.trim(el.value) == '' || $.trim(el.value).match(/last name/i)){
						Site.showError('Last name entered is not valid.');
						el.focus();
						return false;				
					}
				}		
			}
		}


		// 2009.11.08
		// adding error checking for duplicate email addresses AFTER field type checking
		// using jquery standards + sequencial style for ease of coding
		// --------------------------------------------		
		var dup_emails = [];
		$("input.email").each(function(i)
		{
			dup_emails[i] = $(this).val(); // get all emails first
		});
		
		// using a double foreach to test for duplicates
		jQuery.each(dup_emails, function() // loop 1
		{
			var dup_email = this;
			var dup_email_catch = 0;

			$("input.email").each(function() // loop 2
			{
				if ( dup_email == $(this).val() )
				{
					dup_email_catch += 1;
				}

			});
				
			if ( dup_email_catch > 1) // this is outside of loop 2 because of over buffering loop logic due to jquery's api use on loop logic
			{
				Site.showError('You must enter a different e-mail address for each guest.');
				error = true;
			}
			else
			{
				error = false;
			}
		});
		
		if (error) { return false; }
		
		// --------------------------------------------		


		var error = false;

		$('.form-cont').each(function(){
			var num = parseInt($(this).attr('id').match(/\d+$/)[0]) + 1;
			if($('input[type=checkbox]',this).length && $('input[type=checkbox]:checked',this).length == 0){
				Site.showError('No shows have been selected for guest #'+num+'.');
				error = true;
			}
		});

		return error ? false : true;			
	}
}

$(document).ready( function() {
	$.preloadImages("/assets/img/remove_guest_over.gif","/assets/img/send_over.gif", "/assets/img/send_over.gif","/assets/img/visit_forum_over.gif");	
	Site.initRollovers(); 
	Site.initExternalLinks(); 
	Site.initShowListings(); 
	Site.bindInputEvents();
	Site.bindShowEvents();
});
// END DOC READY




















