(function() {
	if (!dojo) return;

	var queue = new AjaxQueue();
	var termNamePattern = /^terms__(.*?)$/;
	var wildcardNamePattern = /^wildcards__(.*?)$/;
	var contextNodeCode;

	dojo.require("dojox.data.dom");
	dojo.require("dojo.fx");
	dojo.require("dojo.cookie");

	dojo.addOnLoad(function() {
		contextNodeCode = dojo.byId("contextNodeCodeField").value;
		
		connectPageLinks();
		connectFilters();
		loadState();
	});
	
	function connectFilters() {
		dojo.query("input.filterCheckbox").connect("onclick", onFilterClick);
		dojo.query(".filterTitle").connect("onclick", onFilterTitleClick);		
	}

	function connectPageLinks() {
		dojo.query(".pageLink").connect("onclick", onPageLinkClick);	
	}
	
	function onFilterTitleClick(event) {
		dojo.stopEvent(event);
		
		var id = event.target.id;
		var fieldName = id.substr("filterTitle_".length);
		var bodyElement = dojo.byId("filterBody_" + fieldName);
		
		dojo.toggleClass(event.target, "closed", toggleFilterBody(bodyElement));
	}
	
	function toggleFilterBody(element) {
		if (!element) return;
		
		if (!element.toggler) {
			element.toggler = new dojo.fx.Toggler({
				node: element,
				showFunc: dojo.fx.wipeIn,
				hideFunc: dojo.fx.wipeOut,
				onEnd: onFilterToggleEnd
			})
		}
		
		var isClosed;
		
		if (dojo.style(element, "display") == "none") {
			element.toggler.show();
			isClosed = false;
		}
		else {
			element.toggler.hide();
			isClosed = true;
		}
		
		return isClosed;
	}
	
	function onFilterToggleEnd() {
		// Need the setTimeout because the display style gets set to "none" by the default onEnd action,
		// and we're getting called before that.
		
		window.setTimeout(saveState, 0);
	}
	
	function loadState() {
		var cookie = dojo.cookie("filterState_" + contextNodeCode);
	
		if (cookie){
			dojo.forEach(cookie.split(','), function(fieldName){
				var title = dojo.byId("filterTitle_" + fieldName);
				
				if (title) {
					dojo.toggleClass(title, "closed", false)
				}
				
				var body = dojo.byId("filterBody_" + fieldName);
				
				if (body) {
					dojo.style(body, "display", "block");
				}
			});
		}
	}

	function saveState() {
		// Store the field names of the filters that are open.

		var fields = [];

		dojo.query(".filterBody").forEach(function(element) {
			if (dojo.style(element, "display") == "block") {
				fields.push(element.id.substr("filterBody_".length));
			}
		});
		
		dojo.cookie("filterState_" + contextNodeCode, fields.join(","), { expires: 365 });
	}

	function onPageLinkClick(event) {
		dojo.stopEvent(event);

		var page = parseInt(dojox.data.dom.textContent(event.target));
		applyFilters(page);
	}

	function onFilterClick(event) {
		var field = event.target;
		if (!field) return;

		setCheckStates(field);
		applyFilters();
	}
	
	function setCheckStates(checkbox) {
		//if (!checkbox.checked) return;

		var name = dojo.attr(checkbox, "name");
		if (!name) return;

		if (name.match(termNamePattern)) {
			var indexFieldName = RegExp.$1;

			if (checkbox.checked) {
				var wildcardFieldId = "wildcards__" + indexFieldName;
				var allField = dojo.query("input[id^='" + wildcardFieldId + "'][value='*']");
				allField.forEach(uncheckField);
			}
			else {
				var termFieldId = "terms__" + indexFieldName;
				var termFields = dojo.query("input[id^='" + termFieldId + "']");
	
				if (termFields.every(function(element) { return !element.checked })) {
					var wildcardFieldId = "wildcards__" + indexFieldName;
					var allField = dojo.query("input[id^='" + wildcardFieldId + "'][value='*']");
					allField.forEach(function(element) {
						element.checked = true;
					});
				}
			}
		}
		else if (name.match(wildcardNamePattern)) {
			if (checkbox.checked) {
				var indexFieldName = RegExp.$1;
				var termFieldId = "terms__" + indexFieldName;
				var termFields = dojo.query("input[id^='" + termFieldId + "']");
				termFields.forEach(uncheckField);		
			}
		}
	}

	function applyFilters(page) {
		var form = dojo.byId("filterForm");
		if (!form) return;

		var callId = queue.addPendingCall();

		if (!page) page = 1;

		dojo.xhrPost({
			url: dojo.attr(form, "action"),
			form: form,
			handleAs: "json",
			timeout: 10000,

			content: {
				output: "json",
				page: page
			},

			load: function(response, args) {
				if (queue.isLastCall(callId)) {
					for(var selector in response) {
						var elements = dojo.query(selector);
	
						for(var attrName in response[selector]) {
							elements.forEach(function(element) {
								element[attrName] = response[selector][attrName];
							});
						}
					}
					
					connectPageLinks();
					//connectFilters();
					//loadState();
					select.init();
	
					// If this was the last call made, clear out any older pending calls.

					queue.clearAllPendingCalls();
				}
				else {
					queue.clearPendingCall(callId);	
				}
			},

			error: function(err) {
				queue.clearPendingCall(callId);
				alert(err.message);
			}
		});
	}
	
	function uncheckField(element) {
		element.checked = false;
	}
})()
