
var _imagePath = "images/searchExtra/";


var Search = {};

Search.Base = Class.create({
  initialize: function(title,name) {
	 this.title = title;
	 this.name = name;
  }
});


Search.SlideRange = Class.create(Search.Base, {
	initialize: function($super,title,name,width,options,pre,post) {  
		$super(title,name);  
		
		this.width = width;
		
		this.height = 17; 
		this.options = options; 

		this.min = this.options[0];
		this.max = this.options[this.options.length-1];
		

		if ( this.options[this.options.length-1] == "_max" )
		{
			this.max = this.options[this.options.length-1];
			this.options[this.options.length-1] = this.options[this.options.length-2] + "+";
		}

		if ( this.options[0] == "_min" )
		{
			this.min = this.options[0];
			this.options[0] = "0";
		}

		 
		this.pre = pre;
		this.post = post;
	},
	
	out: function() {

		var output = this.gui();
		
		
		var range = { "low": this.low, "high": this.high };
		
		 
		
		for ( var i = range.low; i < range.high; i += this.increment )
		{
			output += i + ",";
		}
		
		//alert( output );
		
		document.write( output );
		
		var _this = this;
		Event.observe(window, 'load', function() {  
			Element.clonePosition( $(_this.name + 'sliderLow' ), $(_this.name + 'slideRange' ), { setWidth: false, setHeight: false } );
			Element.clonePosition( $(_this.name + 'sliderHigh' ), $(_this.name + 'slideRange' ), { setWidth: false, setHeight: false } );
			$(_this.name + 'sliderHigh' ).style.left = ( Element.cumulativeOffset($(_this.name + 'slideRange' )).left + _this.width - Element.getWidth( $(_this.name + 'sliderHigh' ) ) ) + "px";

			var snapLowFn = function(x,y) {
				var slideRangeLeft = Element.cumulativeOffset($(_this.name + 'slideRange' )).left;
				var sliderWidth = Element.getWidth( $(_this.name + 'sliderLow' ) );	

				var incrementWidth = ( _this.width - sliderWidth )/(_this.options.length-1);

				var slideX = Math.round( ( x - slideRangeLeft ) / incrementWidth );
				var highSlideX = Math.round( ( Element.cumulativeOffset($(_this.name + 'sliderHigh' )).left - slideRangeLeft ) / incrementWidth );
					
				if ( slideX >= highSlideX )
					slideX = highSlideX - 1;
				
				slideX =  slideRangeLeft + slideX * incrementWidth;
				return [Math.max( slideRangeLeft, Math.min(slideX,( slideRangeLeft + _this.width - sliderWidth ) ) ),y];
			}


			var snapHighFn = function(x,y) {
				var slideRangeLeft = Element.cumulativeOffset($(_this.name + 'slideRange' )).left;
				var sliderWidth = Element.getWidth( $(_this.name + 'sliderHigh' ) );	

				var incrementWidth = ( _this.width - sliderWidth )/(_this.options.length-1);

				var slideX = Math.round( ( x - slideRangeLeft ) / incrementWidth );
				var lowSlideX = Math.round( ( Element.cumulativeOffset($(_this.name + 'sliderLow' )).left - slideRangeLeft ) / incrementWidth );
					
				if ( slideX <= lowSlideX )
					slideX = lowSlideX + 1;
				
				slideX =  slideRangeLeft + slideX * incrementWidth;
				return [Math.max( slideRangeLeft, Math.min(slideX,( slideRangeLeft + _this.width - sliderWidth ) ) ),y];
			}
			//$(this.name + 'sliderHigh' ).style.left = Element.getPo
			
			var updateFn = function() {
				var sliderWidth = Element.getWidth( $(_this.name + 'sliderLow' ) );	
				var incrementWidth = ( _this.width - sliderWidth )/(_this.options.length-1);
				var lowSlideX = Math.round( ( Element.cumulativeOffset($(_this.name + 'sliderLow' )).left - Element.cumulativeOffset($(_this.name + 'slideRange' )).left ) / incrementWidth );
				var highSlideX = Math.round( ( Element.cumulativeOffset($(_this.name + 'sliderHigh' )).left - Element.cumulativeOffset($(_this.name + 'slideRange' )).left ) / incrementWidth );
				
				$(_this.name + 'slideText' ).innerHTML = "Range: " + _this.pre + _this.options[lowSlideX] + _this.post + " - " + _this.pre + _this.options[highSlideX] + _this.post;
				$(_this.name + 'Min' ).value = ( lowSlideX == 0 ) ? _this.min : _this.options[lowSlideX];
				$(_this.name + 'Max' ).value = ( highSlideX == _this.options.length - 1 ) ? _this.max : _this.options[highSlideX];
			}
			
			new Draggable(_this.name + 'sliderHigh', { constraint: "horizontal", onDrag: updateFn, snap: snapHighFn });
			new Draggable(_this.name + 'sliderLow', { constraint: "horizontal", onDrag: updateFn, snap: snapLowFn });
		}); 

	},
	
	gui: function()
	{
		var objMaster = document.createElement("div");
		
		var objSlideText = document.createElement("div");
		objSlideText.setAttribute('id', this.name + 'slideText');
		objSlideText.className = "slideText";
		objSlideText.innerHTML = "Range: " + this.pre + this.options[0] + this.post + " - " + this.pre + this.options[this.options.length-1] + this.post;
		objMaster.appendChild(objSlideText);


		var objHolder = document.createElement("div");
		objHolder.setAttribute('id', this.name + 'slideHolder');
		objHolder.className = "slideHolder";
		objMaster.appendChild(objHolder);

		var objSliderLow = document.createElement("img");
		objSliderLow.setAttribute('id', this.name + 'sliderLow');
		objSliderLow.setAttribute('src', _imagePath + 'slider.gif');
		objSliderLow.className = "slider";
		objHolder.appendChild(objSliderLow);
		
		var objSliderHigh = document.createElement("img");
		objSliderHigh.setAttribute('id', this.name + 'sliderHigh');
		objSliderHigh.setAttribute('src', _imagePath + 'slider.gif');
		objSliderHigh.className = "slider";
		objHolder.appendChild(objSliderHigh);

		var objSlideRange = document.createElement("div");
		objSlideRange.setAttribute('id', this.name + 'slideRange');
		objSlideRange.className = "slideBar";
		objSlideRange.style.width = this.width + "px";
		objSlideRange.innerHTML = " ";
		objHolder.appendChild(objSlideRange);

		var objLowInput = document.createElement("input");
		objLowInput.setAttribute('name', this.name + 'Min');
		objLowInput.setAttribute('id', this.name + 'Min');
		objLowInput.setAttribute('value', this.min);
		objLowInput.setAttribute('type', 'hidden');
		objHolder.appendChild(objLowInput);

		var objHighInput = document.createElement("input");
		objHighInput.setAttribute('name', this.name + 'Max');
		objHighInput.setAttribute('id', this.name + 'Max');
		objHighInput.setAttribute('value', this.max);
		objHighInput.setAttribute('type', 'hidden');
		objHolder.appendChild(objHighInput);

		return objMaster.innerHTML;
	}
});
