
/*global jQuery _gaq */

(function ($, window, document) {
	if (typeof $ === 'undefined') {
		return; // jQuery isn't available - abort!
	}

	//	--	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 <html>, <head> and <body> elements, why don't you?
		$.HTML = $.root.find('html');
		$.Head = $.HTML.find('head');
		$.Body = $.HTML.find('body');

		//	Add "js" class to body for styling
		$.Body.addClass('js');

		//	Tweak attributes
		$.Body.find('.other_cables a').attr('target', '_blank');

		//	Add classes
		$.Body.find('tr:nth-child(even)').addClass('even');
		$.Body.find('th:last-child').addClass('last');
		$.Body.find('td:last-child').addClass('last');

		//	Invoke plugins, yo...
		$.Body.find('.cable_spec_options').cableSpecPrint();
		$.Body.find('.contact_form').contactForm();
		$.Body.find('td.del a').deleteCableRow();
		$.Body.find('.back_warn').infoPanel();
		$.Body.find('.quote_animation').prepAnimation();
		$.Body.find('.swf').prepFlash();
		$.Body.find('.sample_table').samplePicker();
		$.Body.find('.track_this').trackLink();

	});



	//	Adds a Javascript "print" link
	$.prototype.cableSpecPrint = function () {

		this.each(function () {
			var spec_options  = $(this),
				download_link = spec_options.find('a:first-child');

			$('<a class="print_link track_this" data-category="General" data-action="Print Spec" href="#"></a>')
				.insertAfter(download_link)
				.trackLink();

			spec_options.find('.print_link')
				.text($.Body.data('print'))
				.bind('click', function (event) {
					event.preventDefault();
					window.print();
				});
		});

		return this;

	};



	//	Change button text and disable button on submit
	$.prototype.contactForm = function () {

		this.each(function () {
			var form        = $(this),
				button      = form.find('button'),
				button_text = $.Body.data('please-wait');

			form.bind('submit', function (event) {
				if ($.submittingForm) {
					event.preventDefault();
				}

				$.submittingForm = true;

				button.text(button_text);
				
				_gaq.push(['_trackEvent', 'Emails', 'Form Submission']);
			});
		});

		return this;

	};



	//	Delete Cable Rows
	$.prototype.deleteCableRow = function () {

		this.bind('click', function (event) {
			event.preventDefault();

			var a        = $(this),
				form     = a.closest('form'),
				fieldset = a.closest('fieldset'),
				this_row = a.closest('tr'),
				row_cols = this_row.find('td');

			$.ajax({
				url: a.attr('href'),
				data: { ajax: true },
				success: function () {
					row_cols.css('background', '#fcc');

					this_row.fadeOut('slow', function () {
						this_row.remove();

						if (!fieldset.find('tbody tr').length) {
							fieldset.fadeOut('slow', function () {
								fieldset.remove();

								if (form.find('fieldset').length === 1) {
									window.location = $.Body.data('cancel-url');
								}
							});
						}
					});
				}
			});
		});

		return this;

	};



	//	InfoPanel
	$.prototype.infoPanel = function () {

		this.bind('click', function (event) {
			event.preventDefault();

			if ($.Body.find('.infopanel').length) {
				return false;
			}

			var back_link = $(this);

			$.ajax({
				url: '/incs/actions/infopanel.php',
				data: {
					dest: back_link.attr('href'),
					chat: back_link.data('chat'),
					back: back_link.data('back'),
					or:   back_link.data('or'),
					stay: back_link.data('stay')
				},
				type: 'POST',
				success: function (response) {
					$(response).hide().insertAfter(back_link).fadeIn(100);

					var infopanel = $.Body.find('.infopanel');

					$.root.bind('click', function () {
						infopanel.fadeOut(100, function () {
							infopanel.remove();
						});

						$.root.unbind('click');
					});
				}
			});

			return false;
		});

		return this;

	};



	//	Sort out sidebar animation
	$.prototype.prepAnimation = function () {

		this.each(function () {
			var ul   = $(this).find('ul'),
				dest = ul.next().find('a').attr('href');

			ul.cycle({ timeout: 5000 }).bind('click', function () {
				window.location = dest;
			});
		});

		return this;

	};



	//	Prep flash
	$.prototype.prepFlash = function () {

		this.each(function () {
			var swf_file = $(this).attr('id'),
				lang     = $.HTML.attr('lang');

			$(this).flash({
				swf: '/incs/flash/' + lang + '/' + swf_file + '.swf',
				params: {
					allowfullscreen: true,
					allowscriptaccess: 'always'
				},
				height: 224,
				width: 470
			});
		});

		return this;

	};



	//	Cable picker adder/remover
	$.prototype.samplePicker = function () {

		this.each(function () {
			var table       = $(this),
				add_text    = $.Body.data('add'),
				remove_text = $.Body.data('remove'),
				link_text   = '';

			table.find('a').bind('click', function (event) {
				event.preventDefault();

				var a            = $(this),
					quote_action = a.hasClass('chosen') ? 'del' : 'add',
					code         = a.attr('rel').split(' ')[0];

				$.ajax({
					url: '/incs/actions/cable_quote.php',
					data: { ajax: true, quote_action: quote_action, code: code },
					success: function () {
						if (a.hasClass('chosen')) {
							link_text = add_text;
						} else {
							link_text = remove_text;

							a.addClass('hover').bind('mouseleave', function () {
								a.removeClass('hover');
							});
						}

						a.text(link_text).toggleClass('chosen');
					}
				});
			});
		});

		return this;

	};



	$.prototype.trackLink = function () {

		this.each(function () {
			var link     = $(this),
				event    = link.data('event'),
				category = link.data('category'),
				action   = link.data('action'),
				label    = link.data('label');

			link.bind('click', function () {
				_gaq.push(['_track' + event, category, action, label]);
			});
		});

		return this;

	};

}(jQuery, this, this.document));
//	--	Good.. Can you say it faster?

