(function(){
	var instance = 0;
		
	$.dragMe = function(el, id, options){
		var drag = this; 
		$drag = $(el);
		$body = $(document); 
		
		drag.settings = $.extend({}, $.dragMe.defaults, options); 
		
		drag.setup = function(){
			
			drag.$minhandle = $('<div tabindex="1000" id="dragMe_min_'+id+'" class="dragMe_handle"></div>').appendTo($drag);
			drag.$minhandle.html('<input type="hidden" name="dragMe_min_'+id+'" value="'+drag.settings.min+'" />');
			drag.$minnum = $('<div id="dragMe_minnum_'+id+'" class="number">'+drag.settings.prefix+drag.settings.min+'</div>').insertBefore($drag);
			
			if(drag.settings.range){
				drag.$maxhandle = $('<div tabindex="1000" id="dragMe_max_'+id+'" class="dragMe_handle"></div>').appendTo($drag);	
				drag.$maxhandle.html('<input type="hidden" name="dragMe_max_'+id+'" value="'+drag.settings.max+'" />');
				drag.$maxnum = $('<div id="dragMe_maxnum_'+id+'" class="number">'+drag.settings.prefix+drag.settings.max+'</div>').insertBefore($drag);
			}
			
			$handles = $('div.dragMe_handle', $drag);
			$number = $('div.number', $drag).insertAfter($drag); 
			
			drag.dragWidth = $drag.innerWidth();
			drag.span = drag.settings.max - drag.settings.min; 
			drag.center = drag.$minhandle.outerWidth(true) / 2; 
			drag.end = drag.dragWidth - drag.center;
			drag.$minhandle.css('left',-drag.center); 
			if(drag.settings.range) drag.$maxhandle.css('left',drag.end); 
	
			$handles.mousedown(function(e){
					
				e.preventDefault();
				$grip = $(this);
				$inp = $grip.children('input[type="hidden"]');
				drag.click = e.pageX; 
				drag.pos = $grip.position().left;
				drag.newpos = 0;
				
				drag.calc(e);
				
				$body.bind({
					mousemove: drag.dragging, 
					mouseup: drag.unmove
				});
				
				$grip.focus().unbind('keydown', drag.keying).bind('keydown', drag.keying); 

			});
			
		}
		
		drag.dragging = function(e){ 
			drag.calc(e);			
			drag.moveIt();
		}
		
		drag.unmove = function(){ 
			$body.unbind('mousemove', drag.dragging);
		}
		
		drag.calc = function(e){ 
			drag.newpos = drag.pos + (e.pageX - drag.click);
			if(drag.newpos <= -drag.center ) drag.newpos = -drag.center;
			if(drag.newpos >= drag.end) drag.newpos = drag.end;
			
			if(drag.settings.range && drag.preventOverlap()) drag.num = drag.othernum;
			else {
				drag.perc = (drag.newpos + drag.center) / drag.dragWidth;
				drag.num = ((Math.ceil((drag.span / drag.settings.interval) * drag.perc)) * drag.settings.interval) + drag.settings.min;
			}
			if(drag.num >= drag.settings.max) drag.num = drag.settings.max;
		}
		
		drag.preventOverlap = function(){ 
			if(($grip.attr('id').match('dragMe_min') && drag.num > drag.othernum) || ($grip.attr('id').match('dragMe_max') && drag.num < drag.othernum)){
				drag.newpos = drag.otherpos;
				drag.num = drag.othernum;
				return true;
			}
			return false;
		}
		
		drag.keying = function(e){ 
			if(e.which != 37 && e.which != 38 && e.which != 39 && e.which != 40) return true;
			drag.dir = (e.which == 37 || e.which == 40) ? -drag.settings.interval : drag.settings.interval;
			drag.num += drag.dir;
			if(drag.num <= drag.settings.min) drag.num = drag.settings.min;
			if(drag.num >= drag.settings.max) drag.num = drag.settings.max;
			drag.perc = (drag.num - drag.settings.min) / drag.span;
			drag.newpos = (drag.perc * drag.dragWidth) - drag.center;
			drag.moveIt();			
		}
		
		drag.moveIt = function(){ 
			
			if(drag.settings.range){
				drag.otherpos = $grip.siblings('div.dragMe_handle').position().left;
				drag.othernum = parseFloat($grip.siblings('div.dragMe_handle').children('input').val());
				drag.preventOverlap();
			}
			
			$grip.css('left', drag.newpos);
			if($grip.attr('id').match('dragMe_min')) drag.$minnum.html(drag.settings.prefix+drag.num);			
			else drag.$maxnum.html(drag.settings.prefix+drag.num);			
			$inp.val(drag.num);
			
		}
		
		drag.setup();
		
	}
	
	$.dragMe.defaults = {
		range: false,		
		min: 0,
		max: 1000,
		interval: 10,
		decimal: 0,
		prefix: ''
	}
	
	$.fn.dragMe = function(opt){
		return this.each(function(){ 
			instance = 1;
			new $.dragMe(this, instance, opt);
		});
	}

	$.extend($.fn.disableTextSelect = function() {
		return this.each(function(){
			if($.browser.mozilla){
				$(this).css('MozUserSelect','none');
			}else if($.browser.msie){
				$(this).bind('selectstart',function(){return false;});
			}else{
				$(this).mousedown(function(){return false;});
			}
		});
	});
	
})(jQuery);

