var azercellTariff_slider_init_data = [
	{
		'id': 'aztc_sliderClsAmt',
		'interval': {
			'start': 0,
			'end': 70
		},
		'valid': {
			'from': 1,
			'to': 59
		},
		'default_value': 10,
		'infinity': 60,
		'target_id': 'inputCallsAmount'
	},
	{
		'id': 'aztc_sliderAvgDur',
		'interval': {
			'start': 1,
			'end': 8
		},
		'valid': {
			'from': 1,
			'to': 7
		},
		'default_value': 1,
		'infinity': 7,
		'target_id': 'inputAvgCallDuration'
	},
	{
		'id': 'aztc_sliderSMSAmt',
		'interval': {
			'start': 1,
			'end': 6
		},
		'valid': {
			'from': 1,
			'to': 5
		},
		'default_value': 1,
		'infinity': 5,
		'target_id': 'inputSMSAmount'
	}
];

function azercellTariff_slider(div) {
	this.ns = 'aztc_';

	this.tools = azercellTariff_ui;
	this.error_on = azercellTariff_ui.notify;
	this.error_off = azercellTariff_ui.hideNotice;

	this.container = div;
	this.starter = 'aCalculateButton';
	this.node = document.getElementById(this.container.id);
	this.elements = {}; // after construct() contains fill, hood, elapse, arrow elements
	this.properties = {
		width: 158,
		height: 22,
		arrow: {
			width: 14,
			height: 29
		},
		slider: {
			start: 5,
			end: -5
		}
	};
	this.ie = /*@cc_on ! @*/ false;

	this.construct = function() {
		this.properties['offset'] = this.getOffset(this.node);

		var clc_left = 740;
		var pgw = document.body.clientWidth;
		var ctw = document.body.getElementsByTagName('table')[0].width;
		this.properties['offset'].left+=(this.ie? (((ctw>=pgw)? 0: ((pgw-ctw)/2))+clc_left): 0);

		var elements = this.node.getElementsByTagName('div');
		for (i in elements) {
			if (isNaN(i)) {continue;}
			this.elements[elements[i].className.replace(this.ns+'slider_', '')] = elements[i];
		}

		this.arrowPos(this.arrowValToPos(this.container.default_value));
		var target = document.getElementById(this.ns+this.container.target_id);
		target.value = this.container.default_value;
		var slider = this;

		var events = {
			valChange: function() {
				slider.tools[target.id+'_true_val'] = undefined;
				if (isNaN(target.value)) {
					slider.error('NAN', slider.error_on); return;
				}
				var value = parseInt(target.value);
				if (value<slider.container.valid.from) {
					slider.error('EXC', slider.error_on); return;
					//value = slider.container.end;
					//target.value = '>'+slider.container.infinity;
				}
				if (value>slider.container.infinity) {
					//slider.error('EXC', slider.error_on); return;
					value = slider.container.interval.end;
					target.value = '>'+slider.container.infinity;
				}
				slider.error_off(slider.node);
				slider.arrowPos(slider.arrowValToPos(value));
			},
			mouseClick: function(e) {
				var e = e || window.event;
				slider.tools[target.id+'_true_val'] = undefined; // clear cashed values for target input
				//var elm_offset = slider.getOffset(slider.node);
				var mouse_offset = slider.getMouseOffset(e);
				var click_coords = {
					x: (mouse_offset.x-slider.properties.offset.left)/*,
					y: (mouse_offset.y-slider.properties.offset.top)*/
				};

				if (click_coords.x<0) {
					if (document.getElementById(slider.node.id+'_errorNotificator')!=null) {return;}
				} else {
					slider.error_off(slider.node); // clear previously existed errors
				}

				var arrow_pos = Math.round(slider.adjustPosToRange(click_coords.x)-(slider.properties.arrow.width/2));
				slider.arrowPos(arrow_pos);
				target.value = slider.adjustValToFixed(slider.arrowPosToVal(arrow_pos));
			},
			stopevent: function(e) {
				if (e==null) {e = document.parentWindow.event;}
                if (e.stopPropagation) {
					e.stopPropagation();
					e.preventDefault();
				}
				/*@cc_on@*/
				/*@if(@_win32)
				e.cancelBubble = true;
				e.returnValue = false;
				/*@end@*/
				return false;
			},
			mouseMove: function(e) {
				var e = e || window.event;
				//var x = e.clientX-slider.properties.offset.left;
				var x = slider.getMouseOffset(e).x-slider.properties.offset.left;
				if ((x>=slider.properties.slider.start)&&(x<(slider.properties.width+slider.properties.slider.end))) {
					slider.elements.arrow.style.left = Math.round(x-(slider.properties.arrow.width/2))+'px';
				}
				slider.elements.elapse.style.left = x+'px';
				var width = Math.abs(slider.properties.width-x);
				width = ((width<=1)? 1: width);
				slider.elements.elapse.style.width = width+'px';
				//return events.stopevent(e);
			},
			mouseUp: function(e) {
				var e = e || window.event;
				events.mouseClick(e);
				slider.delEvent('mousemove', slider.node, events.mouseMove);
				slider.delEvent('mouseup', slider.elements.arrow, events.mouseUp);
				slider.delEvent('mouseout', slider.node, events.mouseOut);
				return events.stopevent(e);
			},
			mouseOut: function(e) {
				var e = e || window.event;
				var target = e.relatedTarget || e.toElement;
				if (target.parentNode.id!=slider.node.id) {events.mouseUp(e);}
				//return events.stopevent(e);
			},
			mouseDown: function(e) {
				var e = e || window.event;
				slider.error_off(slider.node);
				slider.followCursor(e);
				slider.addEvent('mousemove', slider.node, events.mouseMove);
				slider.addEvent('mouseup', slider.elements.arrow, events.mouseUp);
				slider.addEvent('mouseout', slider.node, events.mouseOut);
				return events.stopevent(e);
			}
		};

		this.addEvent('change', target, events.valChange);
		this.addEvent('click', document.getElementById(this.ns+this.starter), function() { // pre-process error checking
			var value = parseInt(target.value);
			if (value<slider.container.valid.from) {
				slider.error('EXC', slider.error_on); return;
			}
		});

		this.addEvent('click', this.node, events.mouseClick);

		this.addEvent('mousedown', this.elements.arrow, events.mouseDown);
	};

	this.followCursor = function(e) {
		var e = e || window.event;
		var mouse_offset = this.getMouseOffset(e);
		var click_coords = {
			x: (mouse_offset.x-this.properties.offset.left),
			y: 0/*(mouse_offset.y-this.properties.offset.top)*/
		};
		var arrow_pos = Math.round(this.adjustPosToRange(click_coords.x)-(this.properties.arrow.width/2));
		this.arrowPos(arrow_pos);
	};

	this.getMouseOffset = function(e) {
		if (e.pageX == null && e.clientX != null ) {
			var html = document.documentElement;
			var body = document.body;
			e.pageX = e.clientX+(html && html.scrollLeft || body && body.scrollLeft || 0)-(html.clientLeft || 0);
			//e.pageY = e.clientY+(html && html.scrollTop || body && body.scrollTop || 0)-(html.clientTop || 0);
		}
		//alert(e.pageX+((this.ie)? 1210: 0));
		return {x: e.pageX+((this.ie)? 1210: 0), y: 0/*e.pageY*/};
	};

	this.getOffset = function(elem) {
		var getOffsetSum = function(div) {
			var top=0, left=0;
			while (div) {
				top = top+parseInt(div.offsetTop);
				left = left+parseInt(div.offsetLeft);
				div = div.offsetParent;
			}
			return {top: top, left: left};
		};

		var getOffsetRect = function(div) {
			var box = div.getBoundingClientRect();
			var body = document.body;
			var docElem = document.documentElement;
			var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop;
			var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft;
			var clientTop = docElem.clientTop || body.clientTop || 0;
			var clientLeft = docElem.clientLeft || body.clientLeft || 0;
			var top  = box.top+scrollTop-clientTop;
			var left = box.left+scrollLeft-clientLeft;
			return {top: Math.round(top), left: Math.round(left)};
		}

		if (elem.getBoundingClientRect) {
			return getOffsetRect(elem);
		} else {
			return getOffsetSum(elem);
		}
	};

	this.addEvent = function(type, node, callback) {
		if (this.ie) {
			node.attachEvent('on'+type, callback);
		} else {
			node.addEventListener(type, callback, true);
		}
	};

	this.delEvent = function(type, node, callback) {
		if (this.ie) {
			try {
				node.detachEvent('on'+type, callback);
            } catch (err) {};
		} else {
			node.removeEventListener(type, callback, true);
		}
	};

	this.arrowValToPos = function(val) {
		var range = this.container.interval.end-this.container.interval.start;
		var filled = (val-this.container.interval.start)/range;
		var field_length = this.properties.width-this.properties.slider.start+this.properties.slider.end;
		var val_pos = field_length*filled;
		var arrow_pos = Math.round(val_pos-(this.properties.arrow.width/2))+this.properties.slider.start;
		return arrow_pos;
	};

	this.arrowPosToVal = function(pos) {
		var true_pos = Math.round(pos+(this.properties.arrow.width/2))-this.properties.slider.start;
		var field_length = this.properties.width-this.properties.slider.start+this.properties.slider.end;
		var filled = true_pos/field_length;
		return (((this.container.interval.end-this.container.interval.start)*filled)+this.container.interval.start);
	};

	this.adjustPosToRange = function(pos) {
		if (pos<this.properties.slider.start) {
			pos = this.properties.slider.start;
		}
		var max_pos = this.properties.width+this.properties.slider.end;
		if (pos>max_pos) {
			pos = max_pos;
		}
		return pos;
	};

	this.adjustValToFixed = function(val) {
		if (val>this.container.infinity) {
			//this.tools[this.container.target_id+'_true_val'] = val;
			this.tools[this.ns+this.container.target_id+'_true_val'] = this.container.infinity;
			return ('>'+this.container.infinity);
		}
		var rounded = Math.round(val);
		/*if (Math.abs(val-rounded)>0.1) {
			return val.toFixed(1);
		} else {*/
			return rounded;
		//}
	};

	this.arrowPos = function(set) {
		if (set===undefined) {
			return this.elements.arrow.style.left.replace('px', '');
		} else {
			this.elements.arrow.style.left = set+'px';

			var elapse_left = Math.round(set+(this.properties.arrow.width/2));
			this.elements.elapse.style.left = elapse_left+'px';
			this.elements.elapse.style.width = (this.properties.width-elapse_left-this.properties.slider.start)+'px';
		}
	};

	this.error = function(err, callback) {
		if (callback==undefined) {
			alert(azercellTariff_errors[err]);
		} else {
			callback(azercellTariff_errors[err], this.node);
		}
	};

	this.construct();
}

var azercellTariff_slider_init = function(list) {
	for (i in list) {
		if (!list.hasOwnProperty(i)) {continue;}
		new azercellTariff_slider(list[i]);
	}
}
