function slider(args){

    var min = args.min;
    var max = args.max;
    var value = args.value;
    var id = args.id;
    var onslide = args.onslide;
    var onchange = args.onchange;
    var track = document.getElementById(id);
    var handle = track.firstChild;
    var trackLeft;
    var halfHandle;
    var trackLength;
    var handleLeft;
    var handleOffSet;
    var maxSlide;
    var range = max - min;
    
    this.init = function(){
        trackLeft = findPos(track)[0];
        handle.style.position = 'absolute';
        handle.style.left= '0px';
        handleLeft = findPos(handle)[0];
        trackLength = track.clientWidth - handle.clientWidth; 
        halfHandle = handle.clientWidth/2;
        maxSlide = track.clientWidth - halfHandle;
        
        handleOffSet = trackLeft - handleLeft;
        handle.style.left = handleOffSet+'px';
        
        if(value != null)
            this.setValue(value);
    }
    
    function trackClicked(e){
        e = e || window.event;
        setHandle(e.clientX-trackLeft);
        onchange(value);
        attachMouseUp();
        document.onmousemove = mouseMove;
    }
    
    function mouseMove(e){
        e = e || window.event;
        setHandle(e.clientX-trackLeft);
        onslide(value);
    }
    
    function setHandle(pos){
        if(pos >= halfHandle && pos <= maxSlide){
            handle.style.left = pos - halfHandle + handleOffSet;
            value = (range*(pos-halfHandle)/trackLength) + min;
        }else if(pos < halfHandle){
            handle.style.left = handleOffSet;
            value = min;
        }else if(pos > trackLength){
            handle.style.left = trackLength + handleOffSet;
            value = max; 
        }
    }
    
    this.setValue = function(val){
        if(val >= min && val <= max) 
            value = val;
        else if(val < min)
            value = min;
        else if(val > max)
            value = max;        
        
        handle.style.left = handleOffSet+(((value-min)/range)*trackLength);
    }
    
    this.getValue = function(){
        return value;
    }
    
    function attachMouseUp(){
        attachEvent(document, "mouseup", function(){onchange(value);document.onmousemove = null;});
    }

    function findPos(obj){
        var curleft = curtop = 0;
        if (obj.offsetParent) {
            curleft = obj.offsetLeft
            curtop = obj.offsetTop
            while (obj = obj.offsetParent) {
                curleft += obj.offsetLeft
                curtop += obj.offsetTop
            }
        }
        return [curleft,curtop];
    }

    function attachEvent(element, type, event){
        if(element.attachEvent){
            element.attachEvent('on' + type, event);
        }
        else{
            element.addEventListener(type, event, false);
        }
    }

    this.init();
    
    attachEvent(handle,"mousedown",function(e){attachMouseUp();document.onmousemove = mouseMove;}); 
    attachEvent(handle,"mouseup",function(e){onchange(value);}); 
    attachEvent(track,"mousedown",function(e){trackClicked(e);});
}