if(typeof Array.indexOf === "undefined"){
	Array.prototype.indexOf = function(obj, start){
		for(var i=(start||0); i<this.length; i++){
			if(this[i]==obj){
				return i;
			}
		}
	}
}

// ===============
// = Constructor =
// ===============
var SearchWidget = function(element){

	var me = this;
		
	this.element_ = element;
	
	this.compartment_stops = [0, 92, 184, 276, 368, 460];
	this.compartment_stop_values = ['all', 'indoor', 'balcony', 'garden', 'greenhouse'];
	
	this.storage_ = {
		sliders : []
	};
	
	//Constructor
	(function(){
		
	})();
};


// ========
// = Menu =
// ========
SearchWidget.prototype.initMenu = function(callback) {
	
	var me = this;
	
	me.element_.find('.search_widget_menu_alternative').bind('click', function(e){
		e.preventDefault();
		return false;
	});
	
	//Make plants the default menu choice
	me.element_.find('.search_widget_menu_alternative.plants').addClass('active');
	me.element_.find('.search_widget_menu_alternative.plants').bind('click', function(e){
		if(!$(this).hasClass('active')) {
			me.element_.find('.search_widget_menu_alternative').removeClass('active');
			me.element_.find('.search_widget_settings').removeClass('active');
			me.element_.find('.search_widget_settings.plants').addClass('active');
			$(this).addClass('active');
			if(callback && typeof callback === "function") {
				callback(e, 'AD0006');
			}
		}
	});
	
	me.element_.find('.search_widget_menu_alternative.other').bind('click', function(e){
		if(!$(this).hasClass('active')) {
			me.element_.find('.search_widget_menu_alternative').removeClass('active');
			me.element_.find('.search_widget_settings').removeClass('active');
			me.element_.find('.search_widget_settings.other').addClass('active');
			$(this).addClass('active');
			if(callback && typeof callback === "function") {
				callback(e, 'AD0007');
			}
		}
	});
};

// ==========
// = Switch =
// ==========
SearchWidget.prototype.initSwitch = function(element, callback){
	var me = this;
	element.find('div.search_widget_switch_image').bind('click', function(e){
		$(this).toggleClass('off');
		if(callback && typeof callback === "function") {
			callback(e);
		}		
	});
};


// =============
// = Textfield =
// =============
SearchWidget.prototype.initTextField = function(element, callback) {
	var me = this;
	
	var field = element.find('input');

	var timeout;
	field.bind('textchange', function(e) {
		clearTimeout(timeout);
		timeout = setTimeout(function() {
			if(callback && typeof callback === "function") {
				callback(e);
			}
		}, 500);
	});	
};


// ======================
// = Compartment slider =
// ======================
SearchWidget.prototype.initCompartmentSlider = function(element, callback) {
	var me = this;
	
	var passed_element = element;
	var handle = passed_element.find('div.search_widget_slider_compartment_handle');
	var handle_width = parseInt(handle.css('width'));
	var slider_back_width = parseInt(element.css('width'));
	
	var stops = me.compartment_stops;
	var stop_values = me.compartment_stop_values;
		
	handle.bind('mousedown', function(e){
		e.preventDefault();
		var last_stop = 0;
		$(document).bind('mousemove', function(e){
			var localX = parseInt(e.pageX - element.offset().left) - (parseInt(handle.css('width')) / 2)
			localX = localX <= 0 ? 0 : localX;
			localX = localX >= slider_back_width - handle_width ? slider_back_width - handle_width : localX; 
			handle.css('left', localX + "px");
			last_stop = me.getSliderCompartment(passed_element, stops, stop_values);
		});
		$(document).bind('mouseup', function(){
			$(this).unbind('mousemove');
			$(this).unbind('mouseup');
			last_stop = me.getSliderCompartment(passed_element, stops, stop_values);
			handle.animate({left:stops[last_stop]}, 50);
			if(callback && typeof callback === "function") {
				//No callback here use click event instead?
			}
		});
	});
	
	handle.bind('touchstart', function(e){
		e.preventDefault();
		var last_stop = 0;
		$(document).bind('touchmove', function(e){
			var localX = parseInt(e.originalEvent.touches[0].pageX - element.offset().left) - (parseInt(handle.css('width')) / 2)
			localX = localX <= 0 ? 0 : localX;
			localX = localX >= slider_back_width - handle_width ? slider_back_width - handle_width : localX; 
			handle.css('left', localX + "px");
			last_stop = me.getSliderCompartment(passed_element, stops, stop_values);
		});
		$(document).bind('touchend', function(){
			$(this).unbind('touchmove');
			$(this).unbind('touchend');
			last_stop = me.getSliderCompartment(passed_element, stops, stop_values);
			handle.animate({left:stops[last_stop]}, 50);
			if(callback && typeof callback === "function") {
				//No callback here use click event instead?
			}
		});
	});
	
	element.bind('click', function(e){
		e.preventDefault();
		var localX = parseInt(e.pageX - element.offset().left) - (parseInt(handle.css('width')) / 2)
		localX = localX <= 0 ? 0 : localX;
		localX = localX >= slider_back_width - handle_width ? slider_back_width - handle_width : localX; 
		handle.css('left', localX + "px");
		last_stop = me.getSliderCompartment(passed_element, stops, stop_values);
		handle.animate({left:stops[last_stop]}, 0);
		if(callback && typeof callback === "function") {
			callback(e);
		}
	});
		
};

SearchWidget.prototype.getCompartmentSliderValue = function(element) {
	var me = this;	
	var handle = element.find('div.search_widget_slider_compartment_handle');
	for(var css_class in me.compartment_stop_values) {
		if(handle.hasClass(me.compartment_stop_values[css_class])) {
			return me.compartment_stop_values[css_class];
		}
	}
	return '';
};

SearchWidget.prototype.getSliderCompartment = function(element, compartments, cssClasses) {
	
	var me = this;
	
	var handle = element.find('div.search_widget_slider_compartment_handle');
	var handle_x = parseInt(handle.css('left')) + (parseInt(handle.css('width')) / 2);
	
	var max = 0;
	for(var i in compartments) {
		if(handle_x > max) {
			max = compartments[i];
		}
	}
	
	handle.removeClass('all indoor balcony garden greenhouse');
	handle.addClass(cssClasses[compartments.indexOf(max) - 1]);

	return compartments.indexOf(max) - 1;
};


// ==========
// = Slider =
// ==========
SearchWidget.prototype.initSlider = function(element, callback) {
	
	var me = this;
		
	var left_handle = element.find('div.search_widget_slider_left');
	var right_handle = element.find('div.search_widget_slider_right');
	var slider_back_width = parseInt(element.css('width'));
	var passed_element = element;
	var passed_element_id = $(passed_element).attr('id');
	
	//me.debug($(passed_element).attr('id'));
		
	left_handle.bind('mousedown', function(e){
		var slider_handle = $(this);
		e.preventDefault();
		$(document).bind('mousemove', function(e){
			//me.debug('Mouse touch moving ' + e.pageX);
			// me.debug(e.pageX - element.offset().left);
			// me.debug(parseInt(slider_handle.css('width')));
			var slider_width = parseInt(slider_handle.css('width'));
			var right_handle_x = parseInt(right_handle.css('left'));
			var localX = parseInt(e.pageX - element.offset().left - (slider_width / 2));
			localX = localX <= 0 ? 0 : localX;
			localX = localX >= right_handle_x - slider_width ? right_handle_x - slider_width : localX;
			//me.debug(localX);
			slider_handle.css('left', localX + 'px');
			//me.debug(me.getSliderValues(passed_element).left);
			var caluculated_values = me.getSliderCalculatedValues(passed_element);
			me.setSliderLabels(passed_element, caluculated_values['left'], caluculated_values['right'], me.storage_.sliders[$(passed_element).attr('id')]['unit']);
		});
		$(document).bind('mouseup', function(e){
			$(this).unbind('mousemove');
			$(this).unbind('mouseup');
			if(callback && typeof callback === "function") {
				callback(e);
			}
		});
	});
	
	right_handle.bind('mousedown', function(e){
		var slider_handle = $(this);
		e.preventDefault();
		$(document).bind('mousemove', function(e){
			//me.debug('Mouse moving ' + e.pageX);
			// me.debug(e.pageX - element.offset().left);
			// me.debug(parseInt(slider_handle.css('width')));
			var slider_width = parseInt(slider_handle.css('width'));
			var left_handle_x = parseInt(left_handle.css('left'));
			var localX = parseInt(e.pageX - element.offset().left - (slider_width / 2));
			localX = localX >=  slider_back_width - slider_width - 1 ? slider_back_width - slider_width - 1 : localX;
			localX = localX <= left_handle_x + slider_width ? left_handle_x + slider_width : localX;
			//me.debug(localX);
			slider_handle.css('left', localX + 'px');
			//me.debug(me.getSliderValues(passed_element).right);
			var caluculated_values = me.getSliderCalculatedValues(passed_element);
			me.setSliderLabels(passed_element, caluculated_values['left'], caluculated_values['right'], me.storage_.sliders[$(passed_element).attr('id')]['unit']);
		});
		$(document).bind('mouseup', function(e){
			$(this).unbind('mousemove');
			$(this).unbind('mouseup');
			if(callback && typeof callback === "function") {
				callback(e);
			}
		});
	});
				
	left_handle.bind('touchstart', function(e){
		var slider_handle = $(this);
		e.preventDefault();
		$(document).bind('touchmove', function(e){
			//me.debug('Mouse touch moving ' + e.originalEvent.touches[0].pageX);
			// me.debug(e.pageX - element.offset().left);
			// me.debug(parseInt(slider_handle.css('width')));
			var slider_width = parseInt(slider_handle.css('width'));
			var right_handle_x = parseInt(right_handle.css('left'));
			var localX = parseInt(e.originalEvent.touches[0].pageX - element.offset().left - (slider_width / 2));
			localX = localX <= 0 ? 0 : localX;
			localX = localX >= right_handle_x - slider_width ? right_handle_x - slider_width : localX;
			//me.debug(localX);
			slider_handle.css('left', localX + 'px');
			//me.debug(me.getSliderValues(passed_element).left);
			var caluculated_values = me.getSliderCalculatedValues(passed_element);
			me.setSliderLabels(passed_element, caluculated_values['left'], caluculated_values['right'], me.storage_.sliders[$(passed_element).attr('id')]['unit']);
		});
		$(document).bind('touchend', function(e){
			$(this).unbind('touchmove');
			$(this).unbind('touchend');
			if(callback && typeof callback === "function") {
				callback(e);
			}
		});
	});
	
	right_handle.bind('touchstart', function(e){
		var slider_handle = $(this);
		e.preventDefault();
		$(document).bind('touchmove', function(e){
			//me.debug('Mouse moving ' + e.originalEvent.touches[0].pageX);
			// me.debug(e.pageX - element.offset().left);
			// me.debug(parseInt(slider_handle.css('width')));
			var slider_width = parseInt(slider_handle.css('width'));
			var left_handle_x = parseInt(left_handle.css('left'));
			var localX = parseInt(e.originalEvent.touches[0].pageX - element.offset().left - (slider_width / 2));
			localX = localX >=  slider_back_width - slider_width - 1 ? slider_back_width - slider_width - 1 : localX;
			localX = localX <= left_handle_x + slider_width ? left_handle_x + slider_width : localX;
			//me.debug(localX);
			slider_handle.css('left', localX + 'px');
			//me.debug(me.getSliderValues(passed_element).right);
			var caluculated_values = me.getSliderCalculatedValues(passed_element);
			me.setSliderLabels(passed_element, caluculated_values['left'], caluculated_values['right'], me.storage_.sliders[$(passed_element).attr('id')]['unit']);
		});
		$(document).bind('touchend', function(e){
			$(this).unbind('touchmove');
			$(this).unbind('touchend');
			if(callback && typeof callback === "function") {
				callback(e);
			}
		});
	});
	
	me.storage_.sliders[$(passed_element).attr('id')] = typeof me.storage_.sliders[$(passed_element).attr('id')] === "undefined" ? {} : me.storage_.sliders[$(passed_element).attr('id')];
	me.storage_.sliders[$(passed_element).attr('id')] = { element : passed_element };

};

SearchWidget.prototype.setSliderStoredValues = function(id, left, right, unit) {
	var me = this;
	me.storage_.sliders[id] = typeof me.storage_.sliders[id] === "undefined" ? {} : me.storage_.sliders[id];
	if(me.storage_.sliders[id]) {
		//debug('Settings max & min values');
		me.storage_.sliders[id].right = right;
		me.storage_.sliders[id].left = left;
		me.storage_.sliders[id].unit = unit ? unit : '';
	}
	
	var label_group = $('#' + id).parent('div.search_widget_slider_container').find('div.search_widget_label');
	label_group.find('.left').text(me.storage_.sliders[id].left + ' ' + me.storage_.sliders[id].unit);
	label_group.find('.right').text(me.storage_.sliders[id].right + ' ' + me.storage_.sliders[id].unit);
}

SearchWidget.prototype.getSliderValues = function(element) {
	
	var me = this;
	var left_handle = element.find('div.search_widget_slider_left');
	var right_handle = element.find('div.search_widget_slider_right');
	var slider_handles_width = parseInt(left_handle.css('width')) + parseInt(right_handle.css('width'));
	var slider_back_width = parseInt(element.css('width')) - slider_handles_width;
	
	var left_handle_total = (slider_back_width - 1);
	var left_handle_value = parseInt(left_handle.css('left')) / left_handle_total;
	
	var right_handle_total = (slider_back_width - 1);
	var right_handle_value = (parseInt(right_handle.css('left')) - parseInt(left_handle.css('width'))) / right_handle_total;
	
	return {'left' : left_handle_value, 'right' : right_handle_value};
};

SearchWidget.prototype.setSliderLabels = function(element, left, right, unit) {
	var me = this;
	//me.debug("Settings slider labels");
	var label_group = $(element).parent('div.search_widget_slider_container').find('div.search_widget_label');
	//TODO:May use parseInt value for search also
	label_group.find('.left').text(parseInt(left) + ' ' + unit);
	label_group.find('.right').text(parseInt(right) + ' ' + unit);
};

SearchWidget.prototype.getSliderCalculatedValues = function(element) {
	
	var me = this;
	
	var values = me.getSliderValues($(element));
	var stored_values = me.storage_.sliders[$(element).attr('id')];
	
	return {'left' : parseFloat(stored_values['left']) + ((parseFloat(stored_values['right']) - parseFloat(stored_values['left'])) * parseFloat(values['left'])), 'right' : parseFloat(stored_values['left']) + ((parseFloat(stored_values['right']) - parseFloat(stored_values['left'])) * parseFloat(values['right']))};
}


// ============
// = Dropdown =
// ============
SearchWidget.prototype.initDropdown = function(element, callback) {
	
	var me = this;
	
	var select = element.find('select');
	
	select.bind('click', function(e){
		
	});
	
	select.bind('change', function(e){
		if(element.hasClass('large')) {
			element.find('.search_widget_dropdown_image').text(me.stripAndPretty($(this).find(':selected').text(), 78));
		}else{
			element.find('.search_widget_dropdown_image').text(me.stripAndPretty($(this).find(':selected').text()));
		}
		element.find('.search_widget_submenu_alternative_text').text(me.stripAndPretty($(this).find(':selected').text(), 25));
		if(typeof callback === "function") {
			callback(e);
		}
	});
	
};


// =============
// = Functions =
// =============
SearchWidget.prototype.stripAndPretty = function(str, max) {
	var me = this;
	
	var max_ = max ? max : 8;
		
	if(str.length > max_) {
		str = str.substr(0, (max_ - 3)) + "...";
	}
	
	return str;
};

SearchWidget.prototype.debug = function(str) {
	try {
		console.log(str);
	}catch(e){}
};

SearchWidget.prototype.getValues = function(options, only_active) {
	
	var me = this;
	
	var obj = {};
	
	var settings = me.element_;
	
	var only_active_ = only_active ? only_active : true;
	
	if(only_active_) { //Only show the active pane?
		settings = settings.find('div.search_widget_settings.active');
	}
	
	settings.find('select').each(function(){
		obj[$(this).attr('id')] = $(this).val();
	});
	
	settings.find('div.search_widget_slider:not(div.search_widget_slider_compartment)').each(function(){
		
		var values = me.getSliderValues($(this));
		var calculated = me.getSliderCalculatedValues($(this));
		
		obj[$(this).attr('id')] = { 'values' : values, 'calculated' : calculated };
	});
	
	settings.find('div.search_widget_slider.search_widget_slider_compartment').each(function(){
		obj[$(this).attr('id')] = me.getCompartmentSliderValue($(this));
	});
	
	settings.find('div.search_widget_switch').each(function(){
		obj[$(this).attr('id')] = !$(this).find('div.search_widget_switch_image').hasClass('off');
	});
	
	settings.find('input[type="hidden"]').each(function(){
		obj[$(this).attr('id')] = $(this).val();
	});
	
	settings.find('div.search_widget_search_field_container input').each(function(){
		obj[$(this).attr('id')] = $(this).val();
	});
	
	//Get the submenu alternatives (select)
	me.element_.find('div.search_widget_submenu select').each(function(){
		obj[$(this).attr('id')] = $(this).val();
	});
	
	return obj;
};
