/*global $ */
/*global activateCheckboxHierarchy */
/*jslint browser: true, eqeqeq: true, undef: true */
/******************************************************************************
Lines above are for jslint, the JavaScript verifier.
http://www.jslint.com/
******************************************************************************/

/******************************************************************************
Additional scripts required for this to work:
	/scripts/jquery.js
	/scripts/checkboxhierarchy.js
	/scripts/array.js
******************************************************************************/

/******************************************************************************
EXAMPLE

	<div id="compareFormContainer">
		<!-- form will go here. -->
	</div>

	<script type="text/javascript">
		var cf = new CompareForm({
			name: "Refrigerators",
			displayName: "Refrigerators"
		});

		cf.addCategory({
			name: "Side-By-Side",
			displayName: "Side-By-Side Refrigerators"
		});
		cf.addSubCategory({
			name: "Free-Standing_Side-By-Side",
			displayName: "Free-Standing Side-By-Side Refrigerators"
		});
		cf.addSubCategory({
			name: "Built-In_Side-By-Side",
			displayName: "Built-In Side-By-Side Refrigerators"
		});

		cf.addCategory({
			name: "Top-Freezers",
			displayName: "Top-Freezer Refrigerators"
		});

		cf.display($("#compareFormContainer"));
	</script>

addCategory and addSubcategory must be called in the order in which
their respective categories and subcategories are to be displayed.  For
each category, call addCategory for it, then immediately call
addSubcategory for each of its subcategories.
******************************************************************************/

/* Object constructor */
/* o is an object containing "name" and "displayName" attributes. */
var CompareForm = function (o) {
	this.category = o;
	this.categories = [];
	this.currentCategory = null;
	this.index = CompareForm.index;
	CompareForm.index += 1;
};

CompareForm.COMPACT = false; /* true triggers display format for main products page */

CompareForm.index = 0; // incase more than one CompareForm is on the page

/* Add a category to a CompareForm object. */
/* o is an object containing "name" and "displayName" attributes. */
CompareForm.prototype.addCategory = function (o) {
	o.index = this.categories.length;
 	this.categories.push(o);
	this.currentCategory = o;
	o.categories = [];
};

/* Add a subcategory to the category most recently added to a
   CompareForm object. */
/* o is an object containing "name" and "displayName" attributes. */
CompareForm.prototype.addSubCategory = function (o) {
	if (this.currentCategory) {
		o.index = this.currentCategory.categories.length;
		this.currentCategory.categories.push(o);
	}
};

/* Place a form into the specified element. */
/* e is a DOM reference or jQuery object. */
CompareForm.prototype.display = function (e) {
	var that = this;
	var form, button;
	
	form = $("<form></form>");
	$(e).append(form);
	this.form = form;

	if (!CompareForm.COMPACT) {
		$(form).append($("<h3></h3>").
			       append("Compare " + 
				      this.category.displayName));
		$(form).append($("<div>Seleccione los modelos " + 
				 "que desea ver:</div>"));
	}
	
	this.categories.forEach(function (subcat) {
		that.displayCategory(form, subcat);
	});

	if (!CompareForm.COMPACT) {
		$(form).append($("<br />"));
	}

	$(form).append($("<div class='button'></div>").
		       css("width", "75%").
		       css("text-align", "center").
		       append($("<a class='compareFormLink'></a>").
			      css("display", "block").
			      text("Ver " + this.category.displayName).
			      attr("href", "#")));

	$(form).unbind("submit").submit(function () {
		that.submit();
		return false;
	});

	this.updateCompareLinks();
	
	activateCheckboxHierarchy(form.get(0), "cb_" + this.index);
};

CompareForm.prototype.displayCategory = function (form, cat) {
	var that = this;
	var checkbox, id, label, parent;

	id = "cb_" + this.index + "_" + cat.index;
	checkbox = $("<input type='checkbox' name='category' />");
	checkbox.attr("id", id);
	checkbox.attr("value", cat.name);
	label = $("<label></label>").append(cat.displayName);
	label.attr("for", id);
	cat.checkbox = checkbox.get(0);
	checkbox.unbind("click");
	checkbox.click(function () {
		that.updateCompareLinks();
		return true;
	});

	parent = $("<div class='checkboxContainer parent'></div>");
	if (!CompareForm.COMPACT) {
		parent.addClass("strokeB");
	}
	parent.append(checkbox).append("&nbsp;").append(label);

	$(form).append(parent);
	cat.categories.forEach(function (subcat) {
		that.displaySubCategory(form, cat, subcat);
	});
};

CompareForm.prototype.displaySubCategory = function (form, cat, subcat) {
	var that = this;

	var checkbox, id, label;

	id = "cb_" + this.index + "_" + cat.index + "_" + subcat.index;
	checkbox = $("<input type='checkbox' name='category' />");
	checkbox.attr("id", id);
	checkbox.attr("value", subcat.name);
	label = $("<label></label>").append(subcat.displayName);
	label.attr("for", id);
	subcat.checkbox = checkbox.get(0);
	checkbox.unbind("click");
	checkbox.click(function () {
		that.updateCompareLinks();
		return true;
	});
	
	$(form).append(
		$("<div class='checkboxContainer child'></div>").
		append(checkbox).append("&nbsp;").append(label));
};

CompareForm.prototype.submit = function () {
	var url;

	url = this.getResultPageURL();
	window.location = url;
};

CompareForm.prototype.getResultPageURL = function () {
	var a;

	a = this.getSelectedCategories();
	return "http://espanol.geappliances.com/enes/sdproducts/" + 
		"ApplProducts/html/GEAResults.htm#Category=" +
		encodeURIComponent(a.join("~")).replace(/\%/g, "$");
};

CompareForm.prototype.updateCompareLinks = function () {
	var url;

	url = this.getResultPageURL();
	$(this.form).find("a.compareFormLink").attr("href", url);
};

(function () {
	var isChecked, getName, isAnyChecked;
	
	/* These work on 2nd- and 3rd-level categories. */
	isChecked = function (cat) {
		return cat.checkbox.checked; 
	};
	getName = function (cat) { 
		return cat.name;
	};
	isAnyChecked = function (cat) { 
		if (cat.checkbox.checked) {
			return true;
		}
		if (!("categories" in cat)) {
			return false;
		}
		return cat.categories.some(isAnyChecked);
	};

	CompareForm.prototype.getSelectedCategories = function () {
		if (this.allCategoriesAreSelected()) {
			return [this.category.name];
		}
		if (this.noCategoriesAreSelected()) {
			return [this.category.name];
		}
		return (this.categories.
			map(function (cat) { 
				if (cat.checkbox.checked) {
					return [cat.name]; 
				}
				else {
					return (cat.categories.
						filter(isChecked).
						map(getName));
				}
			}).
			filter(function (a) { return a && (a.length !== 0); }).
			reduce(function (previous, current) {
				return previous.concat(current);
			}, []));
	};
	
	CompareForm.prototype.allCategoriesAreSelected = function () {
		return this.categories.every(isChecked);
	};
	
	CompareForm.prototype.noCategoriesAreSelected = function () {
		return !this.categories.some(isAnyChecked);
	};
})();

function openShoppingGuidePopup (url) {
	openPop(url, 600, 500, "resizable=yes,scrollbars=yes",
		"shoppingGuide");
}

