// @author btapley

adobe.use("adobe.Loader");

adobe.Loader.requireAsset("/products/creativesuite/compare/include/chart/screen.css", {media: "screen"});

Event.observe(window, "load", function () {

	var ToggleButton = Class.create({
		initialize: function(oid, control, state) {
			this.oid = oid;
			this.selected = state || false;
			this.control = $(control);
			this.control.observe("click", this.toggle.bind(this));
		},
		toggle: function() {
			return this.control.fire("toggle:statechange",
						{
							id: this.oid,
							selected: (this.selected = !this.selected)
						});
		},
		observe: function(eventname, callback) {
			return this.control.observe(eventname, callback);
		},
		ignore: function(eventname, callback) {
			return this.control.stopObserving(eventname, callback);
		}
	});
	
	var chart = $("compare-chart");
	if(!chart) { return }
	var row_item = "td",
	row_checked = ".checked",
	row_item_test = function(row_item) {
		return row_item.match(".yes");
	},
	buttons = chart.select(".tr-toggle-button"),
	rows = buttons.invoke("up", "tr"),
	datarows = rows.collect(createDataRow),
	controls = buttons.zip(datarows, createButton),
	headers = chart.select(".th-toggle").collect(createHeader);
	
	
	controls.invoke("observe", "toggle:statechange", function(event) {
		var id = event.memo.id;
		var selected = event.memo.selected;
		datarows[id].apply = selected;
		
		var applicants = datarows.partition(dataApplicable);
		var accepted = applicants[0];
		var denied = applicants[1];
		
		if(!accepted.length) {
			denied.invoke("rest");
			headers.invoke("rest");
		} else {
			accepted.invoke("show");
			denied.invoke("hide");
			
			var matched = headers.partition(function(header, index) {
				var oid = header.oid;
				return accepted.all(function(applicant) {
					return !!applicant.items[oid];
				});
			});
			
			matched[0].invoke("show");
			matched[1].invoke("hide");
		}
	});
	
	function dataApplicable(data) {
		return data.apply;
	}
	
	function createDataRow(row, index) {
		var row = row;
		return {
			oid: index,
			apply: row.match(row_checked),
			row: row,
			items: row.select(row_item).collect(row_item_test),
			show: function() {
				row.removeClassName("unchecked").addClassName("checked");
			},
			hide: function() {
				row.removeClassName("checked").addClassName("unchecked");
			},
			rest: function() {
				row.removeClassName("checked").removeClassName("unchecked");
			}
		}
	}
	
	function createHeader(header, index) {
		var header = header;
		var oid = index;
		return {
			oid: index,
			header: header,
			show: function() {
				header.removeClassName("unselected").addClassName("selected");
			},
			hide: function() {
				header.removeClassName("selected").addClassName("unselected");
			},
			rest: function() {
				header.removeClassName("selected").removeClassName("unselected");
			}
		}
	}
	
	
	function createButton(agg) {
		return new ToggleButton(agg[1].oid, agg[0], agg[1].apply);
	}

});

