/*
values: [{value,name,count}]
dirX: true|false|{min,max}
dirY: true|false|{min,max}
type: single|range
onStop: function
onStopL: function
onStopH: function
*/
Object.extend(dw,{
	slider: function(obj,para){
		
		obj = $(obj)
		
		var paraObj = {
			values: [{name:'label1',value:1,count:20},{name:'label2',value:2,count:20},{name:'label3',value:3,count:20},{name:'label4',value:4,count:20},{name:'label5',value:5,count:20},{name:'label6',value:6,count:20},{name:'label7',value:7,count:20},{name:'label8',value:8,count:20},{name:'label9',value:9,count:20},{name:'label10',value:10,count:20}],
			dir:'X',
			type:'single',
			onStop: false,
			onStopL: false,
			onStopH: false,
			lowValue: 0,
			highValue: 0,
			lowIndex:false,
			highIndex:false,
			prepend:''
		}
		
		Object.extend(paraObj,para)
		
		//public functions
		//get
		this.getElement = function(){
			return obj
		}
		this.getLowValueIndex = function(){
			return paraObj.lowValue
		}
		this.getHighValueIndex = function(){
			return paraObj.highValue
		}
		this.getValues = function(){
			return paraObj.values
		}
		this.getLowMarker = function(){
			return markerL
		}
		this.getHighMarker = function(){
			return markerH
		}
		
		//populate ranges
		$$('div.pre')[0].innerHTML = paraObj.prepend + paraObj.values[0].name
		$$('div.post')[0].innerHTML = paraObj.prepend + paraObj.values[paraObj.values.length - 1].name
		
		//BEGIN range sliders
		if(paraObj.type=='range'){
			var low = 0
			if(paraObj.lowIndex !== false){
				low = paraObj.lowIndex	
			}
			var high = paraObj.values.length - 1
			if(paraObj.highIndex !== false){
				high = paraObj.highIndex	
			}
			

			$$('div.label span')[0].innerHTML = paraObj.prepend + paraObj.values[low].name
			$$('div.label span')[1].innerHTML = paraObj.prepend + paraObj.values[high].name
			
			var markerL = document.createElement('div')
			markerL.className = 'marker_low'
			obj.appendChild(markerL)
			
			var markerH = document.createElement('div')
			markerH.className = 'marker_high'
			obj.appendChild(markerH)
			
			var ranger = document.createElement('div')
			ranger.className = 'ranger'
			obj.appendChild(ranger)
			
			if(paraObj.dir == 'X'){
				if(paraObj.lowIndex !== false){
					var left = Math.floor((parseInt(obj.offsetWidth)*paraObj.lowIndex)/paraObj.values.length) 
					markerL.style.left = left - parseInt(markerL.offsetWidth) + 'px'
					ranger.style.left = left + 'px'
					paraObj.lowValue = paraObj.lowIndex
				}
				
				if(paraObj.highIndex !== false){
					var left = (parseInt(obj.offsetWidth)*paraObj.highIndex)/paraObj.values.length 
					var add = parseInt(obj.offsetWidth)/paraObj.values.length
					markerH.style.left = Math.floor(left + add) + 'px'
					paraObj.highValue = paraObj.highIndex
				}else{
					markerH.style.left = parseInt(obj.offsetWidth) + 'px'
				}
				ranger.style.width = parseInt(Element.getStyle(markerH,'left')) - parseInt(markerL.offsetWidth) - parseInt(Element.getStyle(markerL,'left')) + 'px'
				
				var dirY = false
				var dirX = {min:-1*(parseInt(markerL.offsetWidth)),max: parseInt(obj.offsetWidth) - parseInt(markerH.offsetWidth)}
				
			}else if(paraObj.dir == 'Y'){/*
				markerH.style.top = ranger.style.height = parseInt(obj.offsetHeight) + 'px'
				
				var dirY = {min:-1*(parseInt(markerL.offsetHeight)),max: parseInt(obj.offsetHeight) - parseInt(markerH.offsetHeight)}
				var dirX = false
			*/}
			
			var incL = new Df.Drag(markerL,{dragY:false,dragX:{min:0,max:parseInt(obj.offsetWidth)},
				onDrag:function(event){					
					if(paraObj.dir == 'X'){
						var curPos = incL._curX;
						var maxPos = parseInt(obj.offsetWidth)
						var partMaxPos = incL.pars.dirX.max + parseInt(markerH.offsetWidth)
						var minPos = new Number(0)
					
					}else if(paraObj.dir == 'Y'){
						/*var curPos = parseInt(Event.pointerY(event)) - incL.getOffset()[1]  + parseInt(markerL.offsetHeight)
						var maxPos = parseInt(obj.offsetHeight)
						var partMaxPos = incL.getDirY().max + parseInt(markerH.offsetHeight)
						var minPos = new Number(0)*/
					}
					
					var values = paraObj.values.length
					var curValue = Math.floor((curPos*values)/maxPos)
					
					if(curPos>=minPos  && curPos<=partMaxPos  && curValue<values){
						if(paraObj.dir == 'X'){
							ranger.style.left = curPos  + 'px'
							ranger.style.width = parseInt(Element.getStyle(markerH,'left')) - parseInt(Element.getStyle(markerL,'left')) - parseInt(markerH.offsetWidth) + 13 + 'px'
							//console.log(ranger.style.width);
						}else if(paraObj.dir == 'Y'){
							/*ranger.style.top = curPos + 'px'
							ranger.style.height = parseInt(Element.getStyle(markerH,'top')) - parseInt(Element.getStyle(markerL,'top')) - parseInt(markerH.offsetHeight) + 'px'*/
						}
						
						paraObj.lowValue = curValue
						if(paraObj.values[curValue])
						$$('div.label span')[0].innerHTML = paraObj.prepend + paraObj.values[curValue].name
					}
				},
				onStart:function(event){
					if(paraObj.dir == 'X'){
						incL.pars.dirX.min = (-1*parseInt(markerL.offsetWidth));
						incL.pars.dirX.max = parseInt(Element.getStyle(markerH,'left')) - parseInt(markerH.offsetWidth);
					}else if(paraObj.dir == 'Y'){
						/*incL.setDirY({min:(-1*parseInt(markerL.offsetHeight)),max: parseInt(Element.getStyle(markerH,'top')) - parseInt(markerH.offsetHeight)  })*/
					}
				},
				onStop:function(event){
					if(paraObj.onStop)paraObj.onStop()
					if(paraObj.onStopL)paraObj.onStopL()
				},
				dirY:dirY,
				dirX:dirX
			});
			incL.enable();
			var incH = new Df.Drag(markerH,{dragY:false,dragX:{min:parseInt(markerL.offsetWidth),max:parseInt(obj.offsetWidth)},
				onDrag:function(event){
					//console.log(incH.pars.dirX.min);
					if(paraObj.dir == 'X'){
						var curPos = incH._curX; 
						var maxPos = parseInt(obj.offsetWidth)
						var partMinPos = incH.pars.dirX.min + Math.floor(parseInt(obj.offsetWidth)/paraObj.values.length)
						var minPos = incH.pars.dirX.min;
					}else if(paraObj.dir == 'Y'){
/*						var curPos = parseInt(Event.pointerY(event)) - incH.getOffset()[1]
						var maxPos = parseInt(obj.offsetHeight)
						var partMinPos = incH.getDirY().min
						var minPos = parseInt(markerL.offsetHeight)*/
					}
					
					var values = paraObj.values.length
					var curValue = Math.floor((curPos*values)/maxPos)
					
					if(curPos>=partMinPos && curPos <= maxPos && curValue<values){
						
						if(paraObj.dir == 'X'){
							ranger.style.left = parseInt(Element.getStyle(markerL,'left')) + parseInt(markerL.offsetWidth) + 'px'
							ranger.style.width = parseInt(Element.getStyle(markerH,'left')) - parseInt(Element.getStyle(markerL,'left')) - parseInt(markerH.offsetWidth)+ 'px'
						}else if(paraObj.dir == 'Y'){
							ranger.style.top = parseInt(Element.getStyle(markerL,'top')) + parseInt(markerL.offsetHeight) + 'px'
							ranger.style.height = parseInt(Element.getStyle(markerH,'top')) - parseInt(Element.getStyle(markerL,'top')) - parseInt(markerH.offsetHeight) + 'px'
						}
						paraObj.highValue = curValue
						if(paraObj.values[curValue])
						$$('div.label span')[1].innerHTML = paraObj.prepend + paraObj.values[curValue].name
					}
					
				},
				onStart:function(event){
					incH.pars.dirX.min = new Number( parseInt(Element.getStyle(markerL,'left'))+ parseInt(markerL.offsetWidth));
					incH.pars.dirX.max = parseInt(obj.offsetWidth);
					//incH.pars.dirX.min = incL._curX + parseInt(markerL.offsetWidth);
				},
				onStop:function(event){
					if(paraObj.onStop)paraObj.onStop()
					if(paraObj.onStopH)paraObj.onStopH()
				},
				dirY:dirY,
				dirX:dirX
			});
			incH.enable();
		//END range Sliders
		
		//BEGIN single Sliders
		}else if(paraObj.type == 'single'){
			
			$$('div.label span')[0].innerHTML = paraObj.values[0].name + ' ('+ paraObj.values[0].count +')'
		
			var marker = document.createElement('div')
			marker.className = 'marker'
			obj.appendChild(marker)
			
			if(paraObj.dir == 'X'){
				var dirY = false
				var dirX = {min:new Number(0),max:parseInt(obj.offsetWidth)-parseInt(marker.offsetWidth)}
			}else if(paraObj.dir == 'Y'){
				var dirY = {min:new Number(0),max:parseInt(obj.offsetHeight)-parseInt(marker.offsetHeight)}
				var dirX = false
			}
				
			var inc = new drag(marker,{
				onDrag:function(event){
					
					if(paraObj.dir == 'X'){
						var curPos = parseInt(Event.pointerX(event)) - inc.getOffset()[0]
						var maxPos = parseInt(obj.offsetWidth)- parseInt(marker.offsetWidth)
					}else if(paraObj.dir == 'Y'){
						var curPos = parseInt(Event.pointerY(event)) - inc.getOffset()[1]
						var maxPos = parseInt(obj.offsetHeight)- parseInt(marker.offsetHeight)
					}
					
					var minPos = 0
					var values = paraObj.values.length
					var curValue = Math.floor((curPos*values)/maxPos)
					
					if(curPos>=minPos && curPos <= maxPos && curValue<values){
						
						$$('div.label span')[0].innerHTML = paraObj.values[curValue].name + ' ('+ paraObj.values[curValue].count +')'
					}
					
				},
				onStart:function(event){
					
					marker.style.cursor = 'move'
					
				},
				onStop:function(event){
					
					marker.style.cursor = 'pointer'
					if(paraObj.onStop)paraObj.onStop()
				},
				dirY:dirY,
				dirX:dirX
			});
		
		}
		//END single slider
	}
});