/**
 * @author Sjors
 */
var ProgramSearch = new Class({
	initialize: function (el) {
		this.controlpanel = el;
		this.xhr = new Request.HTML({'update': $('content').getParent()});
		this.selectedClass = 'selected';
		this.searchTimeout = undefined;
		this.timeoutDuration = 1000;

		document.addEvent('click', this.clickDelegator.bind(this));
		el.getElements('input:checked').getParent().addClass(this.selectedClass);

		el.getElements('.facetspanel').each(function (element) {
			var newParent = element.getPrevious();
			var trigger = new Element('span', {'class': 'trigger closed'});
			trigger.set('text', element.get('data-trigger'));

			trigger.inject(newParent, 'bottom');

			element.setStyle('left', trigger.getPosition(trigger.getParent('fieldset')).x + 19);

			var selectedItems = new Element('span', {'class': 'selected-items'});
			selectedItems.inject(newParent, 'bottom');
			
			element.addEvent('mouseleave', function () {
				element.setStyle('display', 'none');
			});
		});

		if (document.location.hash) {
			var queryString = document.location.hash.substr(1);
			var keyValuePairs = queryString.split('&');
			var dataStructure = {};

			searchObjectInstance = this;

      keyValuePairs.each(function (keyValue) {
        keyValuePair = keyValue.split('=');
        key   = keyValuePair[0];
        value = decodeURIComponent(keyValuePair[1]);

        if (key.match(/\[\]$/) != null) {
          if (dataStructure[key] == undefined) {
            dataStructure[key] = new Array();
          }

          dataStructure[key].push(value);
        } else {
          dataStructure[key] = value;
        }
      });

      for (var key in dataStructure) {
        $$('input[name="' + key + '"]').each(function (element) {
          if (element.get('type') == 'checkbox' && element.get('checked')) {
            this.selectFacet(element.getParent());
          }
        }, this);
      }

			keyValuePairs.each(function (keyValue) {
				keyValuePair = keyValue.split('=');
				key   = keyValuePair[0];
				value = decodeURIComponent(keyValuePair[1]);

				$$('input[name="'+ key + '"]').each((function (el) {
					if (el.get('type') == 'text') {
						el.set('value', value);
					} else {
						if (el.get('value') == value) {
							var inputId = el.get('id');
							this.selectFacet($$('label[for=' + inputId + ']')[0])
						}
					}
				}).bind(searchObjectInstance));
			});
		}

		el.getElements('input[type=text]').addEvent('keyup', (function (evt) {
			if (evt.key == 'enter') {
				this.doSearch();
			} else {
				window.clearTimeout(this.searchTimeout);
				this.searchTimeout = window.setTimeout(this.doSearch.bind(this), this.timeoutDuration)
			}
		}).bind(this))

		this.doSearch();
	},


	/**
	 * Delegated a click somewhere on the control panel to the correct method
	 * @param {Object} evt
	 */
	clickDelegator: function (evt) {
		var clickedElm = document.id(evt.target);

		if (clickedElm.get('tag') == 'span' && (clickedElm.hasClass('trigger') || clickedElm.hasClass('selected-items')) && clickedElm.getParent('#controlpanel')) {
			this.showFacetsPanel(clickedElm);

		} else {

			if (clickedElm.getParent('#controlpanel')) {
				if (clickedElm.get('tag') == 'label') {
					this.selectFacet(clickedElm);

					if (clickedElm.hasClass(this.selectedClass) && clickedElm.hasClass('all')) {
						evt.preventDefault();
					}

				} else if (clickedElm.get('tag') == 'button') {
					this.doSearch();
					evt.preventDefault();
				}
			}
		}
	},


	/**
	 * Handles all dependencies when a facet is clicked
	 * @param {Object} facet
	 */
	selectFacet: function (facet) {
		var facetParent = facet.getParent('fieldset');
		var facetsInSet = facetParent.getElements('label');
		var allFacet    = facetParent.getElement('label.all');

		window.clearTimeout(this.searchTimeout);
		this.searchTimeout = window.setTimeout(this.doSearch.bind(this), this.timeoutDuration);

		if (!facet.hasClass(this.selectedClass)) {
			if (facet.hasClass('all')) {
				facetsInSet.each((function (currentFacet) {
					currentFacet.removeClass(this.selectedClass);
					$(currentFacet.get('for')).set('checked', false);
				}).bind(this));

				if (facet.getParent().getElement('.trigger')) {
					facet.getParent().getElement('.trigger').setStyle('display', 'inline');
				}

				if (facet.getParent().getElement('.selected-items')) {
					facet.getParent().getElement('.selected-items').setStyle('display', 'none');
				}

			} else {
				allFacet.removeClass(this.selectedClass);
				allFacet.getElement('input').set('checked', false);
			}
		}

		facet.toggleClass(this.selectedClass);

		if (facetParent.getElements('label.' + this.selectedClass).length == 0) {
			facetParent.getElement('label.all').addClass(this.selectedClass);
			facetParent.getElement('label.all').getElement('input').set('checked', true);
		}

		var facetsPanel = facet.getParent('.facetspanel');

		if (facetsPanel != null) {
			var selectedSubFacets = facetsPanel.getElements('label.selected');

			if (selectedSubFacets.length > 0) {
				var subFacetNames = [];

				selectedSubFacets.each(function (element) {
					subFacetNames.push(element.get('text'));
				});

				var selectedItems = facetsPanel.getPrevious().getElement('.selected-items');
				selectedItems.set('text', subFacetNames.join(', '));
				selectedItems.setStyle('display', '');
				facetsPanel.getPrevious().getElement('.trigger').setStyle('display', 'none');
			} else {
				facetsPanel.getPrevious().getElement('.trigger').setStyle('display', '');
				facetsPanel.getPrevious().getElement('.selected-items').setStyle('display', 'none');
			}
		}
	},

	showFacetsPanel: function (trigger) {
		trigger.getParent('fieldset').getElement('.facetspanel').setStyle('display', 'block');
	},

	/**
	 * Do the actual search. Intercept the actual posting of the form and handle it with AJAX
	 */
	doSearch: function () {
		var url = this.controlpanel.getElement('form').get('action');
		var textInputs = this.controlpanel.getElements('input[placeholder]');
		var queryString = '';

		$$('label.selected').each(function (el) {
			var inputId = el.get('for');

			if (queryString != '') queryString += '&';

			queryString += $(inputId).get('name') + '=' + encodeURIComponent($(inputId).get('value'));
		});

		textInputs.each(function (textInput) {
			if (textInput.get('value') != textInput.get('placeholder')) {
				if (queryString != '') queryString += '&';

				queryString += textInput.get('name') + '=' + encodeURIComponent(textInput.get('value'));
			}
		});

		document.location.href = '#' + queryString;

		this.xhr.get(url + '?' + queryString);
	}
});

window.addEvent('domready', function () {
	if ($('controlpanel')) {
		new ProgramSearch($('controlpanel'));
	}
});
