/*global jQuery google */

//  This is where the magic happens, like on Cribs, except nowhere near as vile.
(function ($, document) {
    //  Is any of this actually going to work?
    if (typeof jQuery === 'undefined') {
        return; // Hot Christ! jQuery isn't available!
    }

    //  --  Instantiate just ONE jQuery object, use this to find other elements
    //      rather than creating a new jQuery object for each selector
    $.root = new $.prototype.init(document);

    //  --  Make Rocket Go Now
    $.root.ready(function () {

        //  Cache the godforsaken <html>, <head> and <body> elements
        $.HTML = $.root.find('html');
        $.Head = $.HTML.find('head');
        $.Body = $.HTML.find('body');

        //  Invoke plugins, yo -> body.find('#element').functionName({ ... });

        $.Body.find('form.ajax').ajaxForm();
        $.Body.find('.club').clubAccordian();
        $.Body.find('.google_map').googleMap();

        //  Any other "loose" bindings?

        $.Body.find('#slideshow').cycle({
            timeout: 7000
        });

		$.Body.find('.multi_images').multiPics();

    });



    //  --  Hey buddy I got your custom jQuery plugins right here...

    //	AJAX Form Class Integration
	$.prototype.ajaxForm = function () {

		return this.each(function () {

			$(this).submit(function() {

				var	formObject		= $(this),
					button			= formObject.find('button'),
					buttonHTML		= button.html(),
					errorMessages	= [],
					errorBlock		= false,
					shortErrors		= false,
					longErrors		= false,
					errorType		= formObject.data('errortype'),
					key				= false;
					
				
				if(errorType === 'both') {
					shortErrors = true;
					longErrors = true;
				} else if (errorType === 'short') {
					shortErrors = true;
				} else if (errorType === 'long') {
					longErrors = true;
				}		

				
				if (formObject.parent().find('div.done').length !== 0) {
					formObject.parent().find('div.done').remove();
				}
								
				button.html('Please Wait');
				button.css('opacity',0.3);

				$.ajax({
					type:		"POST",
					url:		formObject.attr('action'),
					data:		formObject.serialize(),
					dataType:	'json',
					success:	function(response) {
						
						// Are there errors?
						if (response.errors) {
							
							// create error block if required (and not already there)
							if(longErrors) {

								if (formObject.parent().find('#formErrors').length === 0) {

									errorBlock = $('<div>').attr('id','formErrors').addClass('alert error');
									formObject.before(errorBlock);
								}
								else {
									errorBlock = $('#formErrors');
								}
							}

							// Loop errors
							for (key in response.errors) {
								
								if (response.errors.hasOwnProperty(key)) {
									
									// global errors are not tied to particular field
									if(key !== 'global') {
										
										var input = $('#' + key);
										
										if (shortErrors) {
											
											var shortError;

		         								if (input.parent().find('label strong.short_error').length == 0) {
             
												shortError = $('<strong>').addClass('short_error');
												input.parent().find('label').append(shortError);

		         								}
											else {
												shortError = input.parent().find('label strong.short_error');
											}

											shortError.html(response.errors[key].field);
										}

										input.addClass('error');
									}

									if(longErrors) {

										if(key !== 'global') {
											errorMessages.push(response.errors[key].master);
										}
										else {
											errorMessages.push(response.errors[key]);
										}
									}
								}
    						}

							var errorCount = errorMessages.length;
							if (errorCount > 0) {

								var errorList = $('<ul>');

								for(var i=0; i<errorCount; i++) {
									errorList.append('<li>' + errorMessages[i] + '</li>');
								}

								errorBlock.html(errorList);
							}

							
							// scroll to error messages if required
							var windowTop = $(window).scrollTop();
							var errorTop = ($('#formErrors').offset().top) - 130;
							
							if (errorTop < windowTop) {
								$('html, body').animate({
									scrollTop: errorTop
								}, 250);
							}
							
							$.Body.find('.alert.help').remove();
							//alert('test');
							
    						button.html(buttonHTML);
							button.css('opacity',1);

							return false;
						}

						// success ?
						else if (response.success) {

							//$.Body.find('.alert.help').remove();

							formObject.after(response.success).remove();
							
							$.Body.find('.alert.help').remove();

							$.Body.find('#formErrors').remove();

    						button.html(buttonHTML);
							button.css('opacity',1);
						}
						// redirect ?
						else if (response.redirect) {

							window.location.replace(response.redirect);
						}
					}
					/*
					,
					error: function(xhr, textStatus, errorThrown){
		                alert("Error: " +errorThrown)
		            }
					*/
				});

				return false; // don't process form
			});
		});
	};
	
	// Multipics gallery
	$.prototype.multiPics = function () {
		
		return this.each(function () {
			
			var container	=	$(this);
			var items		=	container.find('ul.multi_thumbs li');
			var thumbs		=	items.find('a');
			var master		=	container.find('div.master_wrap img');
			
			// Thumb Clicks
			thumbs.bind('click', function() {
				
				var thumb	=	$(this);
		        var src		=	thumb.attr('href');
		
				master.hide();
				
				// new <img> probably faster than doing cache[] lookup ??
				var img = document.createElement('img');
				
		        $(img).load(function() {

		            master.attr('src', src).fadeIn(250);
            
		            items.removeClass('active');
		
		            thumb.parent().addClass('active'); // apply class to <li>

		        }).attr('src', src); // odd, but fixes browser bug, can't remember which one
				
				return false;
					
			});
			
			
			// preload larger images
			thumbs.each( function() {
				
				var tmb = $(this);
				
				var fullsize 		=	$(this).attr('href');
				var cache_fullsize	=	document.createElement('img');
			
				$(cache_fullsize).load(function() {
            		
					tmb.animate({opacity: 1}, 250);

		        }).attr('src', fullsize);
			
			    //cache.push(cache_fullsize);
			});
			
			
		});
	};



    //  Club Accordian
    $.prototype.clubAccordian = function () {

        if (this.length > 1) {
            this.each(function () {
                $(this).addClass('closed')
                    .find('h1').bind('click', function () {
                        $(this).closest('article').toggleClass('closed');
                    });
            });
        }
        else {
            this.addClass('singular');
        }

        return this;

    };



    //  Google Maps
    $.prototype.googleMap = function () {

        this.each(function () {
            var map_el     = $(this),
                latlng     = new google.maps.LatLng(map_el.data('latitude'), map_el.data('longitude')),
                options    = {
                    center:    latlng,
                    mapTypeId: google.maps.MapTypeId.ROADMAP,
                    zoom:      13
                },
                map        = new google.maps.Map(this, options),
                infowindow = new google.maps.InfoWindow({
                    content: map_el.data('address')
                }),
                marker     = new google.maps.Marker({
                    animation: google.maps.Animation.DROP,
                    map:       map,
                    position:  latlng,
                    title:     map_el.data('title')
                });

            google.maps.event.addListener(marker, 'click', function () {
                infowindow.open(map, marker);
            });
        });

        return this;

    };

}(jQuery, this.document));
//  --  Aww yeah... Damn, yo...
