/**
 * jQuery Tools @VERSION Rangeinput - HTML5 <input type="range" /> for humans
 * NO COPYRIGHTS OR LICENSES. DO WHAT YOU LIKE.
 * http://flowplayer.org/tools/rangeinput/
 */
(function($){$.tools=$.tools||{version:'@VERSION'};var tool;tool=$.tools.rangeinput={conf:{min:0,max:100,step:'any',steps:0,value:0,precision:undefined,vertical:0,keyboard:true,progress:false,speed:100,css:{input:'range',slider:'slider',progress:'progress',handle:'handle'}}};var doc,draggable;$.fn.drag=function(conf){document.ondragstart=function(){return false;};conf=$.extend({x:true,y:true,drag:true},conf);doc=doc||$(document).bind("mousedown mouseup",function(e){var el=$(e.target);if(e.type=="mousedown"&&el.data("drag")){var offset=el.position(),x0=e.pageX-offset.left,y0=e.pageY-offset.top,start=true;doc.bind("mousemove.drag",function(e){var x=e.pageX-x0,y=e.pageY-y0,props={};if(conf.x){props.left=x;}
if(conf.y){props.top=y;}
if(start){el.trigger("dragStart");start=false;}
if(conf.drag){el.css(props);}
el.trigger("drag",[y,x]);draggable=el;});e.preventDefault();}else{try{if(draggable){draggable.trigger("dragEnd");}}finally{doc.unbind("mousemove.drag");draggable=null;}}});return this.data("drag",true);};function round(value,precision){var n=Math.pow(10,precision);return Math.round(value*n)/n;}
function dim(el,key){var v=parseInt(el.css(key),10);if(v){return v;}
var s=el[0].currentStyle;return s&&s.width&&parseInt(s.width,10);}
function hasEvent(el){var e=el.data("events");return e&&e.onSlide;}
function RangeInput(input,conf){var self=this,css=conf.css,root=$("<div><div/><a href='#'/></div>").data("rangeinput",self),vertical,value,origo,len,pos;input.before(root);var handle=root.addClass(css.slider).find("a").addClass(css.handle),progress=root.find("div").addClass(css.progress);$.each("min,max,step,value".split(","),function(i,key){var val=input.attr(key);if(parseFloat(val)){conf[key]=parseFloat(val,10);}});var range=conf.max-conf.min,step=conf.step=='any'?0:conf.step,precision=conf.precision;if(precision===undefined){try{precision=step.toString().split(".")[1].length;}catch(err){precision=0;}}
if(input.attr("type")=='range'){var tmp=$("<input/>");$.each("class,disabled,id,maxlength,name,readonly,required,size,style,tabindex,title,value".split(","),function(i,attr){tmp.attr(attr,input.attr(attr));});tmp.val(conf.value);input.replaceWith(tmp);input=tmp;}
input.addClass(css.input);var fire=$(self).add(input),fireOnSlide=true;function slide(evt,x,val,isSetValue){if(val===undefined){val=x/len*range;}else if(isSetValue){val-=conf.min;}
if(step){val=Math.round(val/step)*step;}
if(x===undefined||step){x=val*len/range;}
if(isNaN(val)){return self;}
x=Math.max(0,Math.min(x,len));val=x/len*range;if(isSetValue||!vertical){val+=conf.min;}
if(vertical){if(isSetValue){x=len-x;}else{val=conf.max-val;}}
val=round(val,precision);var isClick=evt.type=="click";if(fireOnSlide&&value!==undefined&&!isClick){evt.type="onSlide";fire.trigger(evt,[val,x]);if(evt.isDefaultPrevented()){return self;}}
var speed=isClick?conf.speed:0,callback=isClick?function(){evt.type="change";fire.trigger(evt,[val]);}:null;if(vertical){handle.animate({top:x},speed,callback);if(conf.progress){progress.animate({height:len-x+handle.width()/2},speed);}}else{handle.animate({left:x},speed,callback);if(conf.progress){progress.animate({width:x+handle.width()/2},speed);}}
value=val;pos=x;input.val(val);return self;}
$.extend(self,{getValue:function(){return value;},setValue:function(val,e){init();return slide(e||$.Event("api"),undefined,val,true);},getConf:function(){return conf;},getProgress:function(){return progress;},getHandle:function(){return handle;},getInput:function(){return input;},step:function(am,e){e=e||$.Event();var step=conf.step=='any'?1:conf.step;self.setValue(value+step*(am||1),e);},stepUp:function(am){return self.step(am||1);},stepDown:function(am){return self.step(-am||-1);},setMin:function(val){conf.min=parseFloat(val,10);range=conf.max-conf.min;self.setValue(value<conf.min?conf.min:value);},setMax:function(val){conf.max=parseFloat(val,10);range=conf.max-conf.min;self.setValue(value>conf.max?conf.max:value);}});$.each("onSlide,change".split(","),function(i,name){if($.isFunction(conf[name])){$(self).bind(name,conf[name]);}
self[name]=function(fn){if(fn){$(self).bind(name,fn);}
return self;};});handle.drag({drag:false}).bind("dragStart",function(){init();fireOnSlide=hasEvent($(self))||hasEvent(input);}).bind("drag",function(e,y,x){if(input.is(":disabled")){return false;}
slide(e,vertical?y:x);}).bind("dragEnd",function(e){if(!e.isDefaultPrevented()){e.type="change";fire.trigger(e,[value]);}}).click(function(e){return e.preventDefault();});root.click(function(e){if(input.is(":disabled")||e.target==handle[0]){return e.preventDefault();}
init();var fix=handle.width()/2;slide(e,vertical?len-origo-fix+e.pageY:e.pageX-origo-fix);});if(conf.keyboard){input.keydown(function(e){if(input.attr("readonly")){return;}
var key=e.keyCode,up=$([75,76,38,33,39]).index(key)!=-1,down=$([74,72,40,34,37]).index(key)!=-1;if((up||down)&&!(e.shiftKey||e.altKey||e.ctrlKey)){if(up){self.step(key==33?10:1,e);}else if(down){self.step(key==34?-10:-1,e);}
return e.preventDefault();}});}
input.blur(function(e){var val=$(this).val();if(val!==value){self.setValue(val,e);}});$.extend(input[0],{stepUp:self.stepUp,stepDown:self.stepDown});function init(){vertical=conf.vertical||dim(root,"height")>dim(root,"width");if(vertical){len=dim(root,"height")-dim(handle,"height");origo=root.offset().top+len;}else{len=dim(root,"width")-dim(handle,"width");origo=root.offset().left;}}
function begin(){init();self.setValue(conf.value!==undefined?conf.value:conf.min);}
begin();if(!len){$(window).load(begin);}}
$.expr[':'].range=function(el){var type=el.getAttribute("type");return type&&type=='range'||!!$(el).filter("input").data("rangeinput");};$.fn.rangeinput=function(conf){if(this.data("rangeinput")){return this;}
conf=$.extend(true,{},tool.conf,conf);var els;this.each(function(){var el=new RangeInput($(this),$.extend(true,{},conf));var input=el.getInput().data("rangeinput",el);els=els?els.add(input):input;});return els?els:this;};})(jQuery);
