var Slider = {
	bedrooms_slider: false,
	price_slider: false,

	init: function() {
		if ($("slider-bedrooms")) {
			var el = $("slider-bedrooms");
			var track = el.down("div.slide");
			var handle = el.down("div.handle");

			var bedrooms_text = $("bedrooms-text");
			var bedrooms_input = $("bedrooms");

			var cb = function(value) {
				if (value == 0) {
					var text = "0";
				} else var text = String(value) + "+";

				bedrooms_text.value = text;
				var old_value = bedrooms_input.value;
				bedrooms_input.value = value;
			};

			this.bedrooms_slider = new Control.Slider(handle, track, {
				range: $R(0, 5),
				values: [0, 1, 2, 3, 4, 5],
				onSlide: cb,
				onChange: function(value) {
					cb(value);
					Plugin.hook("slider_bedrooms_change", {
						value: value
					});
				}
			});
			this.bedrooms_slider.setValue(0);
			bedrooms_input.onrestore = function() {
				this.bedrooms_slider.setValue($F(bedrooms_input))
			}.bind(this);

			bedrooms_text.observe("change", function() {
				var value = Number($F(bedrooms_text).replace(/[^\d]/, ""));
				if (isNaN(value))
					value = 0;
				this.bedrooms_slider.setValue(value);
			}.bind(this));
			bedrooms_text.observe("keypress", function(event) {
				if (event.keyCode == Event.KEY_RETURN) {
					Event.stop(event);
					bedrooms_text.blur();
				}
			});
			bedrooms_text.observe("focus", function(event) {
				bedrooms_text.select();
			});
		}
		if ($("slider-bedrooms-range")) {
			var el = $("slider-bedrooms-range");

			var range = $R(0, 10);
			var displays = $$("input.slider-bedrooms-text");
			var inputs = $$("input.slider-bedrooms-value");
			var track = el.down("div.slide");
			var handles = el.select("div.handle");

			var cb = function(values) {
				values.each(function(value, i) {
					displays[i].value = value + (value == range.end ? "+" : '');;
					inputs[i].value = value;
				});
			};

			this.bedrooms_slider = new Control.Slider(handles, track, {
				range: range,
				values: range,
				restricted: true,
				onSlide: cb,
				onChange: function(values) {
					cb(values);

					Plugin.hook("slider_bedrooms_range_change", {
						values: values
					});

					if (values[0] == values[1]) {
						if (values[0] == 0)
							values[1] += 1;
						else
							values[0] -= 1;

						this.bedrooms_slider.setValue(values[0], 0);
						this.bedrooms_slider.setValue(values[1], 1);
					}
				}.bind(this)
			});
			this.bedrooms_slider.setValue(range.end, 1);
			inputs.each(function(el, i) {
				el.onrestore = function() {
					this.bedrooms_slider.setValue($F(el), i);
				}.bind(this);
			}.bind(this));

			displays.each(function(input, i) {
				input.stopObserving("keypress");
				input.stopObserving("change");
				input.stopObserving("focus");
				input.observe("keypress", function(event) {
					if (event.keyCode == Event.KEY_RETURN) {
						Event.stop(event);
						input.blur();
					}
				}.bind(this));
				input.observe("change", function() {
					var value = parseInt($F(input));
					this.bedrooms_slider.setValue(value, i);
				}.bind(this));
				input.observe("focus", function() {
					input.select();
				});
			}.bind(this));
		}
	},
	setInstructionType: function(it) {
		this.it_cb({ instruction_type: typeof it != "undefined" ? it.toLowerCase() : "sale" });
	},
	it_cb: function(parameters) {
		var it = parameters.instruction_type;
		try {
			switch (it) {
				case "letting":
					var prices = [0, 50, 100, 150, 200, 250, 300, 350, 400, 450, 500, 550, 600, 650, 700, 750, 800, 950, 1000,
						1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000,
						2200, 2400, 2600, 2800, 3000, 3200, 3400, 3600, 3800, 4000, 4200, 4400, 4600, 4800, 5000 ]
					break;
				default:
					it = "sale";
					var prices = [0, 50000, 100000, 150000, 200000, 250000, 300000, 350000, 400000, 450000, 500000, 550000, 600000, 650000, 700000, 750000, 800000, 950000, 1000000,
						1000000, 1100000, 1200000, 1300000, 1400000, 1500000, 1600000, 1700000, 1800000, 1900000, 2000000,
						2200000, 2400000, 2600000, 2800000, 3000000, 3200000, 3400000, 3600000, 3800000, 4000000, 4200000, 4400000, 4600000, 4800000, 5000000,
						5200000, 5400000, 5600000, 5800000, 6000000, 6200000, 6400000, 6600000, 6800000, 7000000, 7200000, 7400000, 7600000, 7800000, 8000000, 8200000, 8400000, 8600000, 8800000, 9000000, 9200000, 9400000, 9600000, 9800000, 10000000]
					break;
			}
			var range = $R(0, prices.length-1);
			var prices_i = {};
			for (var k in prices)
				prices_i[prices[k]] = k;

			if (this.price_slider) {
				this.price_slider.dispose();
				this.price_slider = null;
			}

			var price_format = function(price) {
				var s = html_entity_decode("&pound;");
				var d = 0;
				var suffix
				if (it == "letting")
					suffix = " P.W.";
				else {
					var ovalue = price;
					if (price >= 1000000) {
						price /= 1000000;
						suffix = "m";
						if (parseInt(price) != price)
							d = 1;
					} else {
						price /= 1000;
						suffix = "k";
					}
					if (ovalue == prices[prices.length-1])
						suffix += "+";
				}
				s += number_format(price, d);
				s += suffix;
				return s;
			}
			var price2index = function(value, i) {
				if (i == undefined)
					i = 1;
				value = value.strip();
				var lastchar = value.substring(value.length-1).toLowerCase();
				value = value.replace(/[^\d.]/, "");
				value = parseFloat(value);
				if (isNaN(value))
					return false;
				if (lastchar == "k")
					value *= 1000;
				if (lastchar == "m")
					value *= 1000000;
				var j;
				var found = false;
				prices.each(function(price, k) {
					j = k;
					if (price >= value) {
						if (i === 0 && price > value)
							k = k-1;
						found = true;
						throw $break;
					}
				});
				if (found) return j;
				return i === 0 ? 0 : j;
			}

			if ($("slider-price")) {
				var el = $("slider-price");

				var price_displays = $$("input.slider-price-text");
				var price_inputs = $$("input.slider-price-value");
				var track = el.down("div.slide");
				var handles = el.select("div.handle");

				var cb = function(values) {
					values.each(function(ivalue, i) {
						value = prices[ivalue];
						price_displays[i].value = price_format(value);
						price_inputs[i].value = ivalue == range.end ? "" : value;
					});
				};
				cb([range.start, range.end]);

				this.price_slider = new Control.Slider(handles, track, {
					range: range,
					values: range,
					restricted: true,
					onSlide: cb,
					onChange: function(values) {
						cb(values);

						Plugin.hook("slider_price_change", {
							values: values
						});

						if (values[0] == values[1]) {
							if (values[0] == 0)
								values[1] += 1;
							else
								values[0] -= 1;

							this.price_slider.setValue(values[0], 0);
							this.price_slider.setValue(values[1], 1);
						}
					}
				});
				this.price_slider.setValue(range.end, 1);
				price_inputs.each(function(el, i) {
					el.onrestore = function() {
						this.price_slider.setValue(price2index($F(el)), i);
					}.bind(this);
				}.bind(this));

				price_displays.each(function(input, i) {
					input.stopObserving("keypress");
					input.stopObserving("change");
					input.stopObserving("focus");
					input.observe("keypress", function(event) {
						if (event.keyCode == Event.KEY_RETURN) {
							Event.stop(event);
							input.blur();
						}
					}.bind(this));
					input.observe("change", function() {
						var value = $F(input)
						n = price2index(value, i);
						if (n === false)
							return;
						this.price_slider.setValue(n, i);
					}.bind(this));
					input.observe("focus", function() {
						input.select();
					});
				}.bind(this));

			}
		} catch (err) {};
	}
}

document.observe("dom:loaded", function() { Slider.init() } );
Plugin.register("select_instruction_type_radio", Slider.it_cb);

