jQuery.ajaxSetup({
	'beforeSend': function(xhr) { xhr.setRequestHeader("Accept", "text/javascript") }
});

/** Extensions */
	(function($){
		$.fn.tabify = function(options) {
			var main_container = $(this);
			var headers = main_container.find("ul > li > a");
			var content_containers = main_container.children("div")
			var current_header = headers.eq(0), current_content_container = content_containers.eq(0);
		
			var open = function(new_header) {
				current_header.parent("li").removeClass("current");
				current_header = new_header;
				current_content_container = $(current_header.attr("href"));
			
				current_header.parent("li").addClass("current");
				content_containers.each(function() {
					$(this).attr("id") == current_content_container.attr("id") ? $(this).show() : $(this).hide();
				});
			}
		
			open(current_header);
			headers.click(function() { open($(this)) });
		}
	})(jQuery);

	function affiliated_url_prefix() {
		var affiliate = $("div#affiliate_name");
		return affiliate.size() > 0 ? "/" + affiliate.text() : ""
	}


/** Convenience Methods */
	function flash(el) {
		el.effect('highlight', { color: '#ffcc00' }, 5000);
	}
	
	function disable(el, parent_form) {
		if (parent_form.size()) {
			parent_form.append("<input type='hidden' name='" + el.attr("name") + "' value='" + el.val() + "' />");
		}
		el.attr("disabled", "disabled");
	}


/** Callbacks */
	// Fetches the list of categories, subcategories, and brands from the server for the product selector.
	function fetch_level(select_element) {
		var level = select_element.attr('id');
		level = level == 'category_id' ? 0 : level == 'subcategory_id' ? 1 : level == 'brand_id' ? 2 : 3;

		if (select_element.val() != -1) {
			var parent_form = select_element.parents('form')
			
			parent_form.find("select").each(function() {
				disable($(this), parent_form);
			});
			
			select_element.siblings('img').show();
			$.get(parent_form.attr('action'), parent_form.serialize() + '&level=' + level, null, 'script');
		}

		return false;
	};




	// system and component deletion
	$(document).ready(function() {
		// Set up product picker dropdown components to fetch next level of information.
		$('form#select_product select').livequery("change", function() {
			fetch_level($(this));
		});
	
		// generic delete confirmation
		var confirm_delete = function(source, preceding_el, item, differentiator, message, callback) {
			var item_id = source.attr(item + "_id");
		
			var confirm_delete_panel_id = "confirm_delete_panel_" + item + "_" + differentiator + "_" + item_id;
			var confirm_delete_panel = $("#" + confirm_delete_panel_id);
			if (confirm_delete_panel.length == 0) {
				var yes_id = "confirm_delete_panel_" + item + "_" + differentiator + "_" + item_id + "_yes";
				var no_id = "confirm_delete_panel_" + item + "_" + differentiator + "_" + item_id + "_no";
			
				var html = "<div id='" + confirm_delete_panel_id + "' style='display: none'>";
				html += "<p class='confirm_delete_panel confirm'>" + message + "</p>";
				html += "<p class='confirm_buttons confirm'>";
				html += "<img id='" + yes_id + "' src='/images/yes_button.png' alt='Yes' /> ";
				html += "<img id='" + no_id + "'src='/images/no_button.png' alt='No' />";
				html += "</p></div>";
				confirm_delete_panel = $(html);
				preceding_el.after(confirm_delete_panel);
			
				$('#' + no_id).click(function() {
					confirm_delete_panel.slideUp();
					return false;
				});
			
				$('#' + yes_id).click(function() {
					callback(source);
					return false;
				});
			}
		
			confirm_delete_panel.slideDown();
		}
	
		// If a delete request comes from the system home page, the request is sent thru form submission causing a full
		// page refresh because after the delete action, the system home page is no longer pertinent. In any other case, it is sent using AJAX.
		var delete_system_callback = function(el) {
			var user_id = el.attr("user_id");
			var system_id = el.attr("system_id");
			var system_name = el.attr("system_name");
			var force_page_refresh = el.attr("force_page_refresh") == "true";
		
			if (force_page_refresh) {
				$("<form action='" + affiliated_url_prefix() + "/users/" + user_id + "/systems/" + system_id + "' method='post'><input type='hidden' name='_method' value='delete' /></form>").appendTo('body').submit();
			} else {
				$.post(affiliated_url_prefix() + "/users/" + user_id + "/systems/" + system_id, '_method=delete', function(data, textStatus) {
					$('#system_locker_' + system_id).slideUp();
					$('#system_glance_' + system_id).slideUp();
				}, null);
			}
		}
	
		var delete_device_callback = function(el) {
			var system_id = el.attr("system_id");
			var device_id = el.attr("device_id");
			$("<form action='" + affiliated_url_prefix() + "/systems/" + system_id + "/devices/" + device_id + "' method='post'><input type='hidden' name='_method' value='delete' /></form>").appendTo('body').submit();
		
			return false;
		}
	
		$('.system_locker .del_sys_button').click(function() {
			var el = $(this)
			confirm_delete(el, el, 'system', 'locker', 'Are you sure you want to delete this system?', delete_system_callback)
			return false;
		});
	
		$('a.delete_system').click(function() {
			var el = $(this)
			confirm_delete(el, el.parents('div.home_system_container').children('h2'), 'system', 'overview', 'Are you sure you want to delete this system?', delete_system_callback)
			return false;
		});
	
		$('.system_locker li a.leftnav_delete_but').click(function() {
			var el = $(this)
			confirm_delete(el, el, 'device', 'locker', 'Are you sure you want to delete this component?', function() { delete_device_callback(el); })
			return false;
		});
	
		$('p.delete_button > a').click(function() {
			var el = $(this)
			confirm_delete(el, el.parents('.device').children('div:first'), 'device', 'overview', 'Are you sure you want to delete this component?', function() { delete_device_callback(el); })
			return false;
		})
	});


	$(document).ready(function() {
	
		// In-place edit code for a system's name.
		$('.system_overview .system_name, #system_header h1').each(function() {
			var el = $(this);
			var user_id = el.attr("user_id");
			var system_id = el.attr("system_id");
		
			el.hover(function() { el.addClass('system_name_highlighted'); }, function() { el.removeClass('system_name_highlighted'); })
		
			var original_name = el.text();
			el.editable(affiliated_url_prefix() + "/users/" + user_id + "/systems/" + system_id, {
				name		: "system[name]",
				method 		: "PUT",
				tooltip 	: "click here to rename",
				select		: true,
				maxlength	: 22,
				callback	: function(value, settings) {
					if (value != "Fail") {
						el.html(value);
						$('#system_locker_' + system_id + ' a:first').html(value);
					} else {
						el.html(original_name);
						alert("An error occurred! Please try again later.");
					}
				}
			});
		});
	
	
		var search_field = "Find products";
		$('#search_term').focus(function() {
			if ($(this).val() == search_field) {
				$(this).val("");
			}
		}).blur(function() {
			if ($(this).val() == "") {
				$(this).val(search_field);
			}
		})

		// Swap email login text field value
		var email_field = "Email";
		$('#locker .email').focus(function() {
			if ($(this).val() == email_field) {
				$(this).val("");
			}
		}).blur(function() {
			if ($(this).val() == "") {
				$(this).val(email_field);
			}
		})
	
		// Swap password field value and "type" by hiding a text field
		$('#fake_password').focus(function() {
			$('#fake_password').hide();
      $('#password').show();
      $('#password').focus();		
		})	
		$('#password').blur(function() {
			if ($('#password').attr('value') == '') {
				$('#password').hide();
				$('#fake_password').show();
      }
    })

		$('input#user_birthdate').datepicker({showOn: 'button', buttonImage: '/images/jquery/calendar.gif', buttonImageOnly: true, yearRange: '-100:0', maxDate: 0});
		$('input#user_date_of_purchase').datepicker({showOn: 'button', buttonImage: '/images/jquery/calendar.gif', buttonImageOnly: true, maxDate: 0});
	
		$('div#thumbnail_box a').lightBox({fixedNavigation:true});
	
		// When user refreshes a page or goes back to a page with a dynamic selector, the selector must be reset.
		$("select#category_id option[value='-1']").attr("selected", true);
		$("select#brand_id option[value='-1']").attr("selected", true);
	
		// automatically hide flash notifications
		flash($('div.flash'));
	
	
		$('.product_details').each(function() {
			$(this).tabify();
		});
	
	});
	
	
	$(document).ready(function() {
		var component_error_container = $(".component_error_container:first");
		if (component_error_container.size()) {
			$.facebox(component_error_container.html());	
		}
		
		$(".component_error").livequery(function() {
			var div = this;
			
			// user chooses existing duplicated item
			$(div).find("#current:visible").click(function() {
				$.facebox.close();
			});
			
			$(div).find("#replacement:visible").click(function() {
				$(this).parents("form").submit();
			});
		});
		
		$("#facebox input[name=decision]:visible").livequery("change", function() {
			var value = $(this).val();
			
			var ignore_tip_panel = $("#facebox .ignore_tip");
			var device_dropdown = $("#facebox select[name=device_id_to_replace]");
			
			if (value == "ignore") {
				ignore_tip_panel.show();
				device_dropdown.attr("disabled", "disabled");
			} else if (value == "remove") {
				ignore_tip_panel.hide();
				device_dropdown.attr("disabled", "disabled");
			} else if (value == "use") {
				ignore_tip_panel.hide();
				device_dropdown.attr("disabled", "");
			}
		});
		
		$("#facebox .resolve_system_message").livequery("submit", function() {
			var decision = $("#facebox input[name=decision]:visible:checked").val();
			
			if (decision == "ignore") {
				$.facebox.close();
				return false;
			} else if (decision == "use") {
				var device_dropdown = $("#facebox select[name=device_id_to_replace]");
				if (device_dropdown.val() == "") {
					alert("You must select a component.")
					return false;
				}
			} else {
				alert("Select an option!")
				return false;
			}
		});
		
		$("#system_messages_bar").each(function() {
			var bar = this;
			
			$(bar).find(".show_hide_link").click(function() {
				$(bar).find(".show_hide_content").toggle();
			});
			
			$(bar).find("a.show_overlay").click(function() {
				$.facebox($($(this).attr('href')).html());
				return false;
			})
		});
	});


	// form validations
	$(document).ready(function() {
		// A validation method that checks whether the date
		// provided has occurred in the past.
		$.validator.addMethod('date_occurred', function(value, element) {
			var value = $.trim(value)
			if (value != '') {
				var today = new Date();
				var purchase_date = new Date(value);
			
				return purchase_date.getTime() <= today.getTime();
			}
			return this.optional(element);
		});
	
		// TP #921. Validation of the phone number field in
		// the report a problem form is not desired.
		//
		// $.validator.addMethod("phone", function(phone_number, element) {
		// 	phone_number = phone_number.replace(/\s+/g, ""); 
		// 	return this.optional(element) || phone_number.length > 9 &&
		// 		phone_number.match(/^(1-?)?(\([2-9]\d{2}\)|[2-9]\d{2})-?[2-9]\d{2}-?\d{4}$/);
		// });
	
		// registration form validation setup
		$('form#registration, form#paywall').validate({
			rules: {
				user_first_name : 'required',
				user_last_name : 'required',
				user_address_1 : 'required',
				user_city : 'required',
				user_state : 'required',
				user_postal_code : 'required',
			
				user_email: {
					required: true,
					email: true
				},
				user_password: 'required',
				user_password_confirmation: {
					required: true,
					equalTo: '#user_password'
				},
			
				"card[number]" : 'required',
				"card[type]" : 'required',
				"card[month]" : 'required',
				"card[year]" : 'required',
				"card[verification_value]" : 'required',
			
				user_receipt_number: 'required',
				user_date_of_purchase: {
					required: true,
					date: true,
					date_occurred: true
				},
			
				user_terms_of_service: 'required'
			},
			messages: {
				user_first_name : "First name is required",
				user_last_name : "Last name is required",
				user_address_1 : 'Address is required',
				user_city : 'City is required',
				user_state : 'State is required',
				user_postal_code : 'Zipcode is required',
			
				user_email: {
					required: 'Email is required',
					email: 'Enter a valid email'
				},
				user_password: 'Password is required',
				user_password_confirmation: {
					required: 'Password Confirmation is required',
					equalTo: 'Passwords must match'
				},
			
				"card[number]" : 'Card number is required',
				"card[type]" : 'Card type is required',
				"card[month]" : "Card expiration month is required",
				"card[year]" : 'Card expiration year is required',
				"card[verification_value]" : 'CVV is required',
			
				user_receipt_number: 'Receipt Number is required',
				user_date_of_purchase: {
					required: 'Date of Purchase is required',
					date: 'Enter a valid date (e.g. 01/01/2009)',
					date_occurred: 'Date of Purchase cannot be in the future'
				},
			
				user_terms_of_service : 'You must agree to the Terms of Service and Privacy Policy'
			},
			errorPlacement: function(error, element) {
				element_name = element.attr("name");
			
			 	if (element_name == "user_terms_of_service") {
				 	element.parents("p").next("div.float_clearer").after(error)
				} else {
					element.after(error);
				}
			}
		});
	
		// login form validation setup
		$('form#login').validate({
			rules: {
				login: 'required',
				password: 'required'
			},
			messages: {
				login: 'Username is required',
				password: 'Password is required'
			},
			errorPlacement: function(error, element) {
				element.after(error);
			}
		});

		$('form#edit_user_info').validate({
			rules: {
				'user[email]': {
					required: true,
					email: true
				},
				'user[birthdate]': {
					date: true,
					date_occurred: true
				},
				'user[phone_number]' : 'phone'
			},
			messages: {
				'user[email]': {
					required: 'Email is required',
					email: 'Enter a valid email'
				},
				'user[birthdate]': {
					date: "Enter a valid date (e.g., 01/01/2009)",
					date_occurred: 'Birth Date cannot be in the future'
				},
				'user[phone_number]': 'Enter a valid phone number'
			},
			errorPlacement: function(error, element) {
				element.after(error);
			}
		});
	
		// send feedback validation setup
		$('form#send_feedback').validate({
			rules: {
				'cannonball[name]': 'required',
				'cannonball[email]': {
					required: true,
					email: true
				},
				'cannonball[subject]': {
					required: function(element) {
						return $(element).children('option:selected').text() == "- Select Subject -"
					}
				},
				'cannonball[phone_number]': 'phone',
				'cannonball[description]': 'required'
			},
			messages: {
				'cannonball[name]': 'Name is required',
				'cannonball[email]': {
					required: 'Email is required',
					email: 'Enter a valid email'
				},
				'cannonball[subject]': {
					required: 'Select a subject'
				},
				'cannonball[phone_number]': 'Enter a valid phone number',
				'cannonball[description]': 'Message is required'
			},
			errorPlacement: function(error, element) {
				element.after(error);
			}
		});
	
		// registration form validation setup
		$('form#edit_password').validate({
			rules: {
				'user[password]': {
					required: true,
					minlength: 4,
					maxlength: 40
				},
				'user[password_confirmation]': {
					required: true,
					equalTo: '#user_password'
				}
			},
			messages: {
				'user[password]': {
					required: 'Password is required',
					minlength: 'Password must be at least 4 characters',
					maxlength: 'Password must be at most 40 characters'
				},
				'user[password_confirmation]': {
					required: 'Password Confirmation is required',
					equalTo: 'Passwords must match'
				}
			},
			errorPlacement: function(error, element) {
				element.after(error);
			}
		});
	
		$('form#reset_password').validate({
			rules: {
				login: {
					required: true,
					email: true
				}
			},
			messages: {
				login: {
					required: 'Provide the email you signed up with',
					email: 'Enter a valid email'
				}
			}
		});
	
		$('form#new_system').validate({
			rules: {
				'system[name]': 'required'
			},
			messages: {
				'system[name]': 'System name is required'
			}
		});
	
		$('form#send_a_system, form#tell_a_friend').validate({
			rules: {
				'sending[recipient_email]': {
					required: true,
					email: true
				}
			},
			messages: {
				'sending[recipient_email]': {
					required: 'Recipient email is required',
					email: 'Enter a valid email'
				}
			}
		});
	
	});
