(function($){
	$.fn.slider = function(options){
		var options = $.extend({
			labels: [],
			max: 1000,
			min: 0,
			to: 1000,
			from: 0,
			startLabel: false,
			stopLabel: false,
			startGreen: false,
			stopGreen: false,
			selectOpasity: .5,
			toTime: false,
			showEdge: false,
			change: null
		}, options || {});
		var hide = false;
		if ($("#slider").css('display') == 'none') {
			$("#slider").show();
			hide = true;
		}
		var width = $(this).width() - 50;
		if (options.from > options.to) options.from = options.to;
		if (options.from < options.min) options.from = options.min;
		if (options.to > options.max) options.to = options.max;
		
		var labels = '';
		labels = '<div class="jqs-label jqs-number" style="left: 0">' + (options.startLabel || options.min) + '<div class="jqs-label-line"></div></div>';
		labels += '<div class="jqs-label jqs-number" style="right: -25px">' + (options.stopLabel || options.max) + '<div class="jqs-label-line"></div></div>';
		
		for(i in options.labels)
		{
			if(options.labels[i] < options.min || options.labels[i] > options.max) continue;
			
			var left = (options.labels[i] - options.min) / (options.max - options.min) * width;
			if (options.toTime) {
				hour = options.labels[i] / 60;
				if ((options.labels[i] % 60) == 0) options.labels[i] = parseInt(hour)+':00';
				else options.labels[i] = parseInt(hour) + ':'+ (((options.labels[i] % 60) < 10)? '0'+(options.labels[i] % 60):(options.labels[i] % 60));
			}
			labels += '<div class="jqs-label jqs-number" style="left: ' + left + 'px">' + options.labels[i] + '<div class="jqs-label-line"></div></div>';
		}
		var leftPos = Math.round((options.from - options.min) / (options.max - options.min) * width);
		var rightPos = Math.round((options.max - options.to) / (options.max - options.min) * width);
		$(this).html('<div class="jqs-slider"><div class="jqs-range"></div><div class="jqs-track-le" style="left: '+(leftPos-13)+'px;"></div><div class="jqs-track-ri" style="right: '+(rightPos-13)+'px;"></div><div class="jqs-lshade"></div><div class="jqs-rshade"></div>' + labels + '</div>');

		var range = $('div.jqs-range', this);
		var lshade = $('div.jqs-lshade', this).css('opacity', options.selectOpasity);
		var rshade = $('div.jqs-rshade', this).css('opacity', options.selectOpasity);
		var ltrack = $('div.jqs-track-le', this);
		var rtrack = $('div.jqs-track-ri', this);

		rshade.css('width', rightPos);
		lshade.css('width', leftPos);
		
		if(options.startGreen != false)
			range.css( 'marginLeft', (options.startGreen - options.min) / options.max * width);
		
		if(options.stopGreen != false)
			range.css('marginRight', (options.max - options.stopGreen) / options.max * width);
		
		var offset;
		var mltrack = false;
		var mrtrack = false;

		var callback = function(){
			var lvalue = Math.round(options.min + ((ltrack.position().left) + 12) / width * (options.max - options.min));
			var rvalue = Math.round(options.min + rtrack.position().left / width * (options.max - options.min));
			
			if(lvalue == options.min)
				if (options.showEdge)
					lvalue = options.min;
				else
					lvalue = '';
				
			if(rvalue == options.max)
				if (options.showEdge)
					rvalue = options.max;
				else
					rvalue = '';
			
			options.change(lvalue, rvalue);
		}
		
		ltrack.mousedown(function(e){
			offset = e.pageX - $(this).offset().left;
			mltrack = true;
		});
		
		rtrack.mousedown(function(e){
			offset = e.pageX - $(this).offset().left;
			mrtrack = true;
		});

		$(document).mousemove(function(e){
				if(mltrack)
				{
					var left = e.pageX - offset - ltrack.parent().parent().offset().left - 25;
					var maxLeft = rtrack.position().left - 12;

					if(left < -12)
						left = -12;
					else if(left >= maxLeft)
						left = maxLeft;
					else if(left >= width - 12) 
						left = width - 12;
					
					ltrack.css('left', left);
					lshade.css('width', left + 12);
					callback();
				}
				else if(mrtrack)
				{
					var right = width - e.pageX + offset + rtrack.parent().parent().offset().left + 12;
					var maxRight = width - ltrack.position().left - 25;
					
					if(right < -13)
						right = -13;
					else if(right >= maxRight)
						right = maxRight;
					else if(left >= width - 12) 
						right = width - 12;
					
					rtrack.css('right', right);
					rshade.css('width', right + 13);
					callback();
				}
			})
			.mouseup(function(){
				mltrack = false;
				mrtrack = false;
			});
		callback();
		if (hide) {
			$("#slider").hide();
		}
	}
})(jQuery);

