/*
*	Track вЂ” id of parent elenemt
*	Tracker вЂ” id of tracked element
*	OnUpdate вЂ” function whitch calls on each value change
*	OnComplete вЂ” function whitch calls on end of the drag
*	FingerOffset вЂ” distance between mouse pointer and corner tracker's edge
*	FormatNumbers вЂ” lead numders in hairlines with spaces
*	Min & Max вЂ” range of vaues
*	MinSpace вЂ” minimum difference between Min & Max
*	RoundTo вЂ” values will be rounded to this value
*	Margins вЂ” indent between Track & Tracker
*	AllowedValues вЂ” force Tracker to stick to the values
*
*	OnUpdate вЂ” function whitch called each time, when Tracker moved
*	OnComplete вЂ” function whitch called when user stop draging
*/
String.prototype.reverse = function(){
splitext = this.split("");
revertext = splitext.reverse();
reversed = revertext.join("");
return reversed;
}


function trace(str) {
	/*document.getElementById("debug").innerHTML += str+"<br/>"; */
}

function ThouthandTrim(size, max) {
	ret = size;
	if(size >= max) ret = "∞";
	else if ((size / 1000000) >= 1)
		ret = ( Math.round(size / 100000) / 10 ) + " млн."
	else if ((size / 1000) > 1)
		ret =  Math.round(size / 1000) + ' т.';
	
	return ret;
}

function classFilter(r,m,not){m = " " + m + " ";var tmp = [];for (var i=0;r[i];i++){var pass=(" "+r[i].className+" ").indexOf(m)>=0;if(not ^ pass)tmp.push(r[i]);}return tmp;}

function PriceFormat(price) {
    var rmptxt = new String(price).reverse();
    var rettxt = "";
    var p=0;
    for(var i=1;i<=rmptxt.length;i++) {
        if(p==3) rettxt+=" ";
        rettxt+=rmptxt.substring((i - 1), i);
        p = p==3?1:p+1;
    }
    return rettxt.reverse();
}


function cDoubleTrackBar(Track, Tracker, Settings){
	if (!Track || !Tracker)	return false;
	
	this.jqTrack = Track;
	this.jqTracker = Tracker;
	
	this.Track = Track[0]
	this.Tracker = Tracker[0];
	
	this.OnUpdate = Settings.OnUpdate;
	this.OnComplete = Settings.OnComplete;
	this.FingerOffset = Settings.FingerOffset || 0;
	this.FormatNumbers = Settings.FormatNumbers || false;
	this.bIsDouble = Settings.bIsDouble || false;
	this.Min = Settings.Min || 0;
	this.Max = Settings.Max || 100;
	this.MinSpace = Settings.MinSpace || 0;
	this.RoundTo = Settings.RoundTo || 1;
	this.Margins = Settings.Margins || 0;
	this.AllowedValues = Settings.AllowedValues || false;
	this.Block = Settings.Block || false;
	this.Disabled = (typeof Settings.Disabled != 'undefined') ? Settings.Disabled : false;
	if (this.Min >= this.Max)this.Max = this.Min +1;
	this.MinPos = this.Min;	this.MaxPos = this.Max;
	if (this.Max - this.Min < this.MinSpace)this.MinSpace =  this.Max - this.Min;
	if (this.Max - this.Min < this.RoundTo)	this.RoundTo =  this.Max - this.Min;
	this.MinSpace = Math.ceil(this.MinSpace/this.RoundTo)*this.RoundTo;
	this.CenterPos = this.Max - this.Min;
	this.CenterPos = this.CenterPos / 2;
	this.W = this.Track.clientWidth || this.Track.offsetWidth;
	this.Track.style.width = (this.Track.clientWidth || this.Track.offsetWidth) + 'px';
	this.OnTrackMouseDown = this.bindAsEventListener(this.TrackMouseDown);
	this.OnDocumentMouseMove = this.bindAsEventListener(this.DocumentMouseMove);
	this.OnDocumentMouseUp = this.bindAsEventListener(this.DocumentMouseUp);
	this.bindEvent(this.Track, 'mousedown', this.OnTrackMouseDown);
	this.TrackerLeft = 0;
	
	if(Settings.defaultVal) {
		this.defaultVal = Settings.defaultVal;
		var _LogicWidth = this.Track.offsetWidth - this.Margins*2 - 1;
		this.defaultPos = this.defaultVal * ( _LogicWidth / (this.Max - this.Min) ) - this.Margins / 2;
		this.UpdateTracker(this.defaultPos, this.defaultVal);
	} else this.UpdateTracker(this.Track.offsetWidth + this.FingerOffset);
	
	if (typeof this.OnUpdate == 'function'){this.OnUpdate.call(this);}}
	cDoubleTrackBar.prototype = {
	TrackMouseDown: function(event){
	    this.TrackerLeft = this.Tracker.offsetLeft - this.Margins;
	    this.TrackerRight = this.TrackerLeft + this.Tracker.offsetWidth;
	    this.TrackerOffsets = this.getOffsets(this.Track);
	    var X = event.clientX + document.documentElement.scrollLeft;
	    X -= this.TrackerOffsets[0];
	    this.Left = Math.abs(this.TrackerLeft-X+this.Margins) <= Math.abs(this.TrackerRight-X+this.Margins);
	    if (typeof this.Disabled == 'function')
	    {
	        if ( this.Disabled.call(this))
	            return true;
	    } 
        else if (this.Disabled)
            return true;
        this.UpdateTracker(X);
        this.bindEvent(document, 'mousemove', this.OnDocumentMouseMove);
        this.bindEvent(document, 'mouseup', this.OnDocumentMouseUp);
        return this.stopEvent(event);
    },
	DocumentMouseMove: function(event){ 
	    this.UpdateTracker(event.clientX + document.documentElement.scrollLeft - this.TrackerOffsets[0]);
	    return this.stopEvent(event);
	},
	DocumentMouseUp: function(event) {
	    this.unbindEvent(document, 'mousemove', this.OnDocumentMouseMove);
	    this.unbindEvent(document, 'mouseup', this.OnDocumentMouseUp);
	    if (typeof this.OnComplete == 'function')
	    {
	        this.OnComplete.call(this);
	    }
	    return this.stopEvent(event);
	},
	UpdateTracker: function(X, def){
	    var _LogicWidth = this.Track.offsetWidth - this.Margins*2 - 1;
	    var _minSpace = Math.floor(_LogicWidth*this.MinSpace/(this.Max-this.Min));
	    var _oldMin = this.MinPos;
	    var _oldMax = this.MaxPos;
	    X -= this.Margins;
	    if(this.Left && this.bIsDouble)
	    {
	        X += this.FingerOffset;
	        this.TrackerLeft = Math.max(0, Math.min(this.TrackerRight - _minSpace - 1, X));
	        this.MinPos = Math.round((this.Min + this.TrackerLeft*(this.Max-this.Min)/_LogicWidth) / this.RoundTo) * this.RoundTo;
	        if (this.MinSpace >= this.MaxPos - this.MinPos)
	        {
	            this.MinPos = this.MaxPos - this.MinSpace;
	        }
	        if(this.AllowedValues)
	        {
	            this.TrackerLeft = Math.round(_LogicWidth*(this.MinPos - this.Min)/(this.Max - this.Min));
	        }
	    }
	    else
	    {
	        X -= this.FingerOffset;
	        this.TrackerRight = Math.max(this.TrackerLeft + _minSpace + 1 , Math.min(_LogicWidth + 1, X));
	        this.MaxPos = Math.round((this.Min + (this.TrackerRight-1)*(this.Max-this.Min)/_LogicWidth) / this.RoundTo) * this.RoundTo;
	        if(def) this.MaxPos = def;
	        if (this.MinSpace >= this.MaxPos - this.MinPos)
	        {
	            this.MaxPos = this.MinPos + this.MinSpace;
	        }
	        if (this.AllowedValues)
	        {
	            this.TrackerRight = Math.round(_LogicWidth*(this.MaxPos - this.Min)/(this.Max - this.Min))+1;
	        }
	    }
	    this.R = this.TrackerRight - this.TrackerLeft;
	    this.L = this.Margins + this.TrackerLeft;
	    //alert(this.Tracker + " | " + this.Tracker.style);
	    this.Tracker.style.width = this.R + 'px';
	    this.Tracker.style.left = this.L + 'px';
	    if (typeof this.OnUpdate == 'function')
	        if (!this.AllowedValues || (this.AllowedValues && (_oldMax!=this.MaxPos || _oldMin!=this.MinPos)))
	            this.OnUpdate.call(this);
	},
	AddHairline: function(pos){
	    var _Touch = this.Track.appendChild( document.createElement('div') );
	    var _LogicWidth = this.Track.offsetWidth - this.Margins*2 - 1;
	    _Touch.style.left = this.Margins + _LogicWidth/(this.Max-this.Min)*(pos-this.Min) + 'px';
	    _Touch.className = 'touch';
	    var t = ThouthandTrim(this.FormatNumbers ? this.leadSpaces(pos) : pos, this.Max).toString();
	    if(pos == this.Min) _Touch.innerHTML = "<span style='left: -9px;'>" + t + "</span>";
	    else _Touch.innerHTML = "<span style='left: -"+((t.length > 1) ? t.length*3 : 9)+"px;'>" + t + "</span>";
	},
	AutoHairline: function(num){
	    if(num >= 1)
	        this.AddHairline(this.Min);
        if (num >= 2)
            this.AddHairline(this.Max);
        if(this.Block)
            this.AddHairline(this.CenterPos);
        if (num >= 3)
        {
            num--;
            
            var diff = this.Max - this.Min;
            var roundTo = [10, 20, 50, 100, 250, 500, 1000, 2000, 5000, 10000, 20000, 50000, 100000, 250000, 500000, 1000000, 5000000, 10000000];
			var DoRound = 1;
			for (var i=0; roundTo[i]; i++) {
				DoRound = roundTo[i]/10;
				if (roundTo[i]>diff)
					break;
			}
			for (var i=1; i<num; i++) {
				var val = this.Min + diff/num*i;
				val = Math.round(val/DoRound)*DoRound;
				this.AddHairline(val);
			}
        }
	},
	getOffsets: function(element){
	    var valueT = 0, valueL = 0;
	    do
	    {
	        valueT += element.offsetTop  || 0;
	        valueL += element.offsetLeft || 0;
	        element = element.offsetParent;
	    }
	    while(element);
	    return [valueL, valueT];
	},
	leadSpaces: function(numb){
	    var res = '';
	    numb = numb.toString();
	    var l = numb.length;
	    for (var i=l; i>0; i--)
	    if ((l-i)%3==2) 
	        res = '&nbsp;'+numb.charAt(i-1)+res;
	    else 
	        res = numb.charAt(i-1)+res;
	    return res;
	},
	bindEvent: function(element, event, callBack){
	    if(element.addEventListener) 
	    {
	        element.addEventListener(event, callBack, false);
	    }
	    else
	    {
	        element.attachEvent('on' + event, callBack);
	    }
	},
	unbindEvent:function(element, event, callBack){
	    if (element.removeEventListener)
	    {
	        element.removeEventListener(event, callBack, false);
	    }
	    else if(element.detachEvent)
	    {
	        element.detachEvent('on' + event, callBack);
	    }
	},
    bindAsEventListener:function(callBack){
        var _object = this;
        return function(event){
            return callBack.call(_object, event || window.event);
        }
    },
    stopEvent: function (event){
        if (event.preventDefault)
        {
            event.preventDefault();
            event.stopPropagation();
        }
        else
        {
            event.returnValue = false;
            event.cancelBubble = true;
        }
        return false;
    },
    
    reInitTouch: function(min, max, hl, step, def) {
    	var el = this.Track.firstChild;
    	while(el) {
    		var oldEl = el;
    		el = el.nextSibling;
    		if(oldEl.className == "touch")
    			this.Track.removeChild(oldEl);
    	}
    	this.Min = min;
    	this.Max = max;
    	
    	if (this.Min >= this.Max)this.Max = this.Min +1;
    	this.MinPos = this.Min;	this.MaxPos = this.Max;
    	this.RoundTo = step;
    	this.MinSpace = 0;
    	if (this.Max - this.Min < this.MinSpace)this.MinSpace =  this.Max - this.Min;
    	if (this.Max - this.Min < this.RoundTo)	this.RoundTo =  this.Max - this.Min;
    	this.MinSpace = Math.ceil(this.MinSpace/this.RoundTo)*this.RoundTo;
    	this.CenterPos = this.Max - this.Min;
    	this.CenterPos = this.CenterPos / 2;
    	
    	this.bindEvent(this.Track, 'mousedown', this.OnTrackMouseDown);
    	
    	if(def) {
    		this.defaultVal = def;
    		var _LogicWidth = this.Track.offsetWidth - this.Margins*2 - 1;
    		this.defaultPos = this.defaultVal * ( _LogicWidth / (this.Max - this.Min) ) - this.Margins / 2;
    		this.UpdateTracker(this.defaultPos, this.defaultVal);
    	} else this.UpdateTracker(this.Track.offsetWidth + this.FingerOffset);
    	this.AutoHairline(hl);
    }
}


function dt_start(Track, Tracker, min, max, isDouble, hl, step, def)
{
	def = (def > max) ? max : ((def < min) ? min : def);
	//alert(Tracker.length + " | " + Tracker.get(0));
	step = step ? step : 50;
	Track[0].TB1 = new cDoubleTrackBar(Track, Tracker,{
		OnUpdate: function(){
			var inputs = this.jqTrack.parents(".pricecnt").children("input");
			if(inputs[0]) {
				if(this.bIsDouble && inputs[1]) {
					inputs[0].value = PriceFormat(this.MinPos);
					inputs[1].value = PriceFormat(this.MaxPos);
				} else {
					inputs[0].value = PriceFormat(this.MaxPos);
				}
			}
		},
		OnComplete: function(){},
		Min: min,Max: max,FingerOffset: 0,MinSpace: 0,RoundTo: step,Margins: 5,Block: false, AllowedValues: true, bIsDouble: isDouble, 
		defaultVal: def
	});
	hl = hl ? hl : 6;
	Track[0].TB1.AutoHairline(hl);
	Track[0].TB1.fix = classFilter(Track[0].TB1.Tracker.getElementsByTagName('*'), 'flr');
}
