$.fn.rollover = function(rollover) {
	this.each(function() {
		$.data(this, 'unrolledover', this.src);
		$.data(this, 'rolledover', rollover || this.src.replace(/\.(jpe?g|gif|png)$/i, '_ro.$1'));
		$("<img />")[0].src = $.data(this, 'rolledover'); // Preload rollover image
	}).hover(
		function() {
			this.src = $.data(this, 'rolledover');
		}, function() {
			this.src = $.data(this, 'unrolledover');
		}
	);
	
	return this;
}

$.fn.buttonPress = function(rollover) {
	this.each(function() {
		$.data(this, 'unrolledover', this.src);
		$.data(this, 'rolledover', rollover || this.src.replace(/\.(jpe?g|gif|png)$/i, '_ro.$1'));
		$("<img />")[0].src = $.data(this, 'rolledover'); // Preload rollover image
	}).mousedown(function() {
		this.src = $.data(this, 'rolledover');
	}).mouseup(function() {
		this.src = $.data(this, 'unrolledover');
	});
	
	return this;
}

jQuery.expr[':'].focus = function(elem) {
	return elem === document.activeElement && (elem.type || elem.href);
};

$.fn.backgroundText = function(text) {
	this.each(function() {
		var message = text || this.value;
		$(this)
			.focus(function() {
				$(this).removeClass('idleField').addClass('focusField');
				if (this.value == message)
					this.value = "";
			})
			.blur(function() {
				if (this.value == "" || this.value == message) {
					$(this).removeClass('focusField').addClass('idleField');
					this.value = message;
				}
			})
			.closest("form").submit(function() {
				$(this).find("input[type=text].idleField, input[type=password].idleField, textarea.idleField").val("");
			});
		if ($(this).is(":focus"))
			$(this).focus();
		else
			$(this).blur();
	});
}

$.fn.compare = function(t) {
    if (this.length != t.length) {return false;}
    var a = this.sort(),
        b = t.sort();
    for (var i = 0; t[i]; i++) {
        if (a[i] !== b[i]) {
			return false;
        }
    }
    return true;
};

function addPseudoClasses() {
	$("form div:has(label)").addClass('has_label');
}

function initFormSubmitLinks() {
	$("a.form_submit_link").click(function() {
		if (!this.title || confirm(this.title)) {
			$(this).closest("form").submit();
		}
	});
}

function initTableSorter(options) {
	var settings = $.extend({
		sortList: [[0, 0]]
	}, options);
	$("table.data:has(thead):has(tbody)").tablesorter(settings)
		.bind("sortEnd", function() {
			$(this).find("tr:even").removeClass('even').addClass('odd');
			$(this).find("tr:odd").removeClass('odd').addClass('even');
		});
}

function initCartButtons() {
	$(".cart_quantity").live('focus', function() {
		$.data(this, 'quantity', this.value);
	})
	.live('blur keyup', function() {
		if (this.value == $.data(this, 'quantity')) {
			return;
		}
		$.data(this, 'quantity', this.value);

		var product_id = $(this).next(".cart_single_price")[0].name.match(/^product_(\d+)$/)[1];
		if (product_id) {
			updateCartTotals();
			updateCart();
		}
	});
}

function updateCartTotals() {
	var total_quantity = 0;
	var total_price = 0;
	$(".cart_quantity").each(function() {
		var quantity = parseInt(this.value, 10);
		if (isNaN(quantity)) {
			quantity = 0;
		}
		total_quantity += quantity;

		var price = parseInt($(this).next(".cart_single_price").val(), 10) * quantity;
		total_price += price;

		$(this).closest("tr").find(".cart_price").html("$" + price);
	});
	$("#cart_total_quantity").html(total_quantity);
	$("#cart_total_price").html("$" + total_price);
}

function showMessage(message) {
	$("<div />")
		.attr({'class': 'msg'})
		.html(message)
		.prependTo("#content_container")
		.delay(2000)
		.fadeOut('slow', function() {$(this).remove();});
}

$.fn.validateAjaxForm = function(opts) {
	this.validate($.extend({
		submitHandler: function(form) {
			$(form).ajaxSubmit({
				dataType: "json",
				beforeSubmit: function(data, form) {
					if ($(form).valid()) {
						showLoader();
						return true;
					}
					return false;
				},
				success: function(response, statusText, xhr, $form) {
					hideLoader();
					if (response.success && opts.success) {
						opts.success(response);
					} else if (!response.success && opts.error) {
						opts.error(response.message);
					}
				},
				error: function(xhr, textStatus, errorThrown) {
					hideLoader();
					if (opts.error) {
						switch (textStatus) {
							case "timeout":
								opts.error("The request timed out.");
								break;

							default:
								opts.error("An error occurred. Please try again later.");
						}
					}
				}
			});
		}
	}, opts.validateOpts));

	return this;
}

function showLoader() {
	if ($("#loader").length) {
		$("#loader").show();
	} else {
		$("<div id=loader />")
			.append( $("<div id=loadingOverlay />").css('opacity', 0.2) )
			.append( $("<div id=cartLoader />") )
			.appendTo("body");
		$("#loader, #loadingOverlay, #cartLoader").height($(document).height()).width("100%");
	}
}

function hideLoader() {
	$("#loader").hide();
}

function setRegisterPopup() {
	$(".register_popup").colorbox({
		iframe: true,
		width: "650",
		height: "350",
		current: "",
		next: ""
	});	
}

function shuffle(items) {
	for (var i = items.length - 1; i > 1; i--) {
		var j = Math.floor(Math.random() * (i + 1)),
			tmp = items[j];
		items[j] = items[i];
		items[i] = tmp;
	}
}
