(function() {
	var
	Y = YAHOO,
	Connection = Y.util.Connect,
	Event = Y.util.Event,
	Dom = Y.util.Dom,
	JSON = Y.lang.JSON,
	form,
	ajax;
	
	Y.namespace('ln');
	
	Y.ln.SearchForm = function(form, spinner, slider) {
		this.form = Dom.get(form);
		
		this.submit = Dom.get('search_box_submit');
		
		this.text = Dom.get('search_string');
		
		this.spinner = spinner;
		
		this.slider = slider;
		
		this.slider.red.onChange.subscribe(this.update, null, this);
		this.slider.blue.onChange.subscribe(this.update, null, this);
		
		this.index = {};
		this.cities = {};
		
		this.checkboxes = Dom.getElementsBy(Y.ln.SearchForm.checkbox, 'input', this.form);
		
		this.init();
		
		if(!Dom.hasClass(document.body, 'search_box_ready')) {
			Dom.addClass(document.body, 'search_box_ready');
		}
	};
	
	Y.ln.SearchForm.prototype = {
		ajax: null,
		ticker: null,
		last: null,
		abort: function() {
			if(this.ajax) {
				Connection.abort(this.ajax);
			}
			
			this.ajax = null;
		},
		addIndex: function(index, value) {
			if(index) {
				if(!this.index[index]) {
					this.index[index] = {};
				}
				
				this.index[index][value] = 1;
			}
		},
		removeIndex: function(index, value) {
			if(index && this.index[index] && this.index[index][value]) {
				delete this.index[index][value];
			}
		},
		addCityIndex: function(index, value) {
			if(index) {
				if(!this.cities[index]) {
					this.cities[index] = {};
				}
				
				this.cities[index][value] = 1;
			}
		},
		removeCityIndex: function(index, value) {
			if(index && this.cities[index] && this.cities[index][value]) {
				delete this.cities[index][value];
			}
		},
		init: function() {
			var i;
			
			for(i = 0; i < this.checkboxes.length; i++) {
				if(this.checkboxes[i].name && this.checkboxes[i].checked) {
					this.addIndex(this.checkboxes[i].name, this.checkboxes[i].value);
				}
			}
			
			Event.on(this.checkboxes, 'click', this.clickEvent, this);
			Event.on(this.text, 'keyup', this.keyupEvent, this.text, this);
			Event.on(this.text, 'click', function() {
				if(this.value == 'Extra sökord eller web-ID') {
					if(!Dom.hasClass(this, 'filled')) {
						Dom.addClass(this, 'filled');
					}
					
					this.value = '';
				}
			});
			Event.on(this.text, 'blur', function() {
				if(!this.value) {
					Dom.removeClass(this, 'filled');
					this.value = 'Extra sökord eller web-ID';
				}
			});
		},
		clickEvent: function(e, me) {
			if(this.checked) {
				me.addIndex(this.name, this.value);
			} else {
				me.removeIndex(this.name, this.value);
			}
			
			me.update();
		},
		keyupEvent: function(e, el) {
			if(!Dom.hasClass(el, 'filled')) {
				Dom.addClass(el, 'filled');
			}
			
			if(this.ticker) {
				clearTimeout(this.ticker);
			}
			
			this.ticker = setTimeout(bind(this, this.update), 500);
		},
		update: function() {
			var result = [], ix, iy;
			
			for(iy in this.index) {
				for(ix in this.index[iy]) {
					result.push(iy + '=' + ix);
				}
			}
            
            for(iy in this.cities) {
                for(ix in this.cities[iy]) {
                    result.push(iy + '=' + ix);
                }
            }
			
			result.push('search_string=' + this.text.value);
			result.push('min_size=' + this.slider.red.field.value);
			result.push('max_size=' + this.slider.blue.field.value);
			
			var post = result.join('&');
			if(post == this.last) {
				return;
			}
			
			this.last = post;
			
			this.abort();
			this.ajax = Connection.asyncRequest(
				'post',
				'/result.php',
				{
					success: function(response) {
						try {
							var config = JSON.parse(response.responseText);
						} catch (e) { return; }
						
						this.spinner.setValue(config.total);
						
						this.submit.disabled = config.total < 1;
						
						Dom.setStyle(this.submit, 'opacity', config.total < 1 ? 0.5 : 1);
						
						this.slider.setMax(config.max);
					},
					scope: this
				},
				this.last
			);
		}
	};
	
	Y.ln.SearchForm.checkbox = function(el) {
		return el.type.toLowerCase() == 'checkbox' && el.name;
	};
	
	function stateLink(e, symbol) {
		Event.stopEvent(e);
		
		Dom.setStyle(this, 'display', symbol.innerHTML == '+' ? 'block' : 'none');
		
		symbol.innerHTML = symbol.innerHTML == '+' ? '-' : '+';

	}
	
	function stateCheckbox(e, data) {
        //alert(this.value + ' ' + this.name);
        
        // Hämta alla stadsdelar tillhörande en stad
		var els = data['areas'].getElementsByTagName('input'), i;
		
		// Kryssa ur alla om stad kryssas ur
		for(i = 0; i < els.length; i++) {
			els[i].checked = 0;
			
			//form[this.checked ? 'addIndex' : 'removeIndex'](els[i].name, els[i].value);
			form['removeIndex'](els[i].name, els[i].value);
		}
		
		
		// Sätta cities, som används om man inte har valt areas
		form[this.checked ? 'addCityIndex' : 'removeCityIndex'](this.name, this.value);
		
		
		
		//Dom.setStyle(data['areas'], 'display', 'block');
		//data['symbol'].innerHTML = '-';
		
		Dom.setStyle(data['areas'], 'display', data['city'].checked ? 'block' : 'none');
		data['symbol'].innerHTML = data['city'].checked ? '-' : '+';
		
		form.update();
	}
	
	function stateAll(e, data)
	{
		//Event.stopEvent(e);
		
		var els = data['areas'].getElementsByTagName('input'), i;
		
		for(i = 0; i < els.length; i++) {
			els[i].checked = data['all'].checked;
			
			//form['addIndex'](els[i].name, els[i].value);
			form[data['all'].checked ? 'addIndex' : 'removeIndex'](els[i].name, els[i].value);
		}
		
		data['city'].checked = 1;
        
		// se till att stad följer med om man klickar "alla"
		form['addCityIndex'](data['city'].name, data['city'].value);
		
		form.update();
	}
	
	function stateArea(e, data)
	{
		//alert(this.name + ' - ' + this.value);
		form[this.checked ? 'addIndex' : 'removeIndex'](this.name, this.value);
		
		data['city'].checked = 1;
		data['all'].checked = 0;
		
		// se till att stad följer med om man klickar stadsdel
		form['addCityIndex'](data['city'].name, data['city'].value);
		
		form.update();
	}
	
	function bind(scope, fn, args) {
		return function() {
			return fn.apply(scope, args || []);
		};
	}
	
	function abort(e, checkbox) {
		Event.stopEvent(e);
		
		checkbox.click();
	}
	
	function init() {
		var links = Dom.getElementsByClassName('search_city', 'a', 'search_main'), area_links, checkbox, symbol, areas, i, x;
		
		for(i = 0; i < links.length; i++) {
			symbol = Dom.getFirstChild(links[i]);
			checkbox = Dom.getPreviousSibling(links[i]);
			areas = Dom.getNextSibling(Dom.getNextSibling(links[i]));
			
			var all = Dom.getFirstChild(areas);
			
			var data = [];
			data['areas'] = areas;
			data['symbol'] = symbol;
			data['all'] = all;
			data['city'] = checkbox;
			
			Event.on(links[i], 'click', stateLink, symbol, areas);
			//Event.on(checkbox, 'click', stateCheckbox, areas);
			Event.on(checkbox, 'click', stateCheckbox, data);
			Event.on(all, 'click', stateAll, data);
			
			var els = data['areas'].getElementsByTagName('input');
			
			for(var n = 1; n < els.length; n++)
			{
				Event.on(els[n], 'click', stateArea, data);
			}
			
			
		}
		
		links = Dom.getElementsByClassName('search_type', 'a', 'search_main');
		for(i = 0; i < links.length; i++) {
			checkbox = Dom.getPreviousSibling(links[i]);
			
			Event.on(links[i], 'click', abort, checkbox);
		}
		
		form = new Y.ln.SearchForm('quick_search', new Y.ln.Spinner('spinner'), new Y.ln.Slider('slider', 'min-size', 'max-size'));
		
		//new YAHOO.ln.Monthly('monthly');
		
		form.update();
	}
	
	Event.onDOMReady(init);
})();
