
/*global jQuery google */

//  This is where the magic happens, like on Cribs, except nowhere near as vile.
(function ($, window, 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('.google_map').googleMap();
		$.Body.find('form.ajax').ajaxForm();
		$.Body.find('#office_details').directionsWidget();

        $.Body.find('.ie #gallery_images figure:nth-child(even)').addClass('new_row');

    });



    //	--	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');

				$.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);

										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);
							}
							
    						button.html(buttonHTML);

							return false;
						}

						// success ?
						else if (response.success) {

							//$.Body.find('.alert.help').remove();

							formObject.after(response.success).remove();

							$.Body.find('#formErrors').remove();

    						button.html(buttonHTML);
						}
						// redirect ?
						else if (response.redirect) {

							window.location.replace(response.redirect);
						}
						else if (response.commentID) {
							
							//alert(response.moderated);
							
							commentShow(response);
							
							formObject.find('input.def').removeClass('error').val('');
							formObject.find('textarea').removeClass('error').val('');

    						button.html(buttonHTML);

							$('#formErrors').remove();
						}
					}
					/*
					,
					error: function(xhr, textStatus, errorThrown){
		                alert("Error: " +errorThrown)
		            }
					*/
				});

				return false; // don't process form
			});
		});
	};



	//	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;

	};



    $.prototype.directionsWidget = function () {

        this.each(function () {
            var office    = $(this),
                post_code = office.data('post-code');
                widget    = '';

            widget += '<div id="map_widget"> ';
            widget += '<form> ';
            widget += '<fieldset> ';
            widget += '<label for="putinyourpostcodepleasethanks">Enter a postcode or address for directions to this office:</label> ';
            widget += '<input id="putinyourpostcodepleasethanks" name="postcode" type="text" /> ';
            widget += '<button>Get Directions</button>';
            widget += '</fieldset> ';
            widget += '</form> ';
            widget += '</div>'

            $(widget).insertAfter(office).find('form').bind('submit', function (event) {
                event.preventDefault();

                var form       = $(this),
                    input      = form.find('input'),
                    lookup_val = input.val().replace(' ', '+');

                window.location = 'http://maps.google.co.uk/maps?q=From+' + lookup_val + '+to+' + post_code;
            });
        });

        return this;

    };



	//	nth-child fixes for rubbish browsers
	$.prototype.newRow = function (config) {

		if (config.after) {
			this.each(function () {
				$(this).filter(':nth-child(' + config.after + 'n+1):not(:first-child)').addClass('wrap');
			});
		}

		return this;

	};

}(jQuery, this, this.document));
//  --  FIX UP; LOOK SHARP!

