function slider(slidein, width, sh, masfunc, funcshag){
	this.slidein = $p(slidein);
	this.masShag = Array();
	this.width = width;
	this.sh = sh;
	if(funcshag){
		this.shag = function(){	return window[funcshag].apply(window, arguments);}
	}else{
		this.shag = false;
	}
	this.createElement();
	this.masfunc = masfunc;
	this.defineShag();
	this.addEventAll();
 	this.initLeft();
 	this.initRight();
 	this.assignSelected();
}

slider.prototype.createElement = function(){
	this.slidein.style.width = this.width.toString() + "px";
	this.selected = new Elem("DIV", {"id": "selected"});
	this.left = new Elem("DIV", {"id": "scroll_left"});
	this.right = new Elem("DIV", {"id": "scroll_right"});

	this.slidein.appendChild(this.selected);
	this.slidein.appendChild(this.left);
	this.slidein.appendChild(this.right);

	this.bg = new Elem("DIV", {"className": "bg"});
	this.bg_left = new Elem("DIV", {"className": "bg_left"});
	this.bg_center = new Elem("DIV", {"className": "bg_center"});
	this.bg_right = new Elem("DIV", {"className": "bg_right"});
	this.slidein.appendChild(this.bg);
    this.bg.appendChild(this.bg_left);
    this.bg.appendChild(this.bg_center);
    this.bg.appendChild(this.bg_right);
    this.bg.style.width = this.slidein.style.width;
    this.bg_center.style.width = (this.slidein.offsetWidth - this.bg_left.offsetWidth - this.bg_right.offsetWidth - 2).toString() + "px";
}

slider.prototype.setShag = function(shag_left, shag_right){
	this.appointShag(this.left, shag_left);
	this.appointShag(this.right, shag_right);
	this.assignSelected();
}

slider.prototype.init = function(leftShag, rightShag){
	if(leftShag == rightShag) leftShag--;
	if(leftShag > rightShag){
		var t = leftShag;
		leftShag = rightShag;
		rightShag = t;
	}
	this.left.shag = leftShag;
	this.right.shag = rightShag;
	this.appointShag(this.left, leftShag);
	this.appointShag(this.right, rightShag);
	this.assignSelected();
}

slider.prototype.defineShag = function(){
	this.masShag = null;
	this.masShag = Array();
	if(!this.shag){
		me = this;
		this.shag = function(i){ return i*me.sh;}
	}else{
		this.determineShag();
	}
	var i = 0;
	this.masShag[0] = parseInt(this.shag(0));
	while(true){
		if(this.slidein.offsetWidth - this.right.offsetWidth < this.masShag[i]){
			return true;
		}
		i++;
		this.masShag[i] = parseInt(this.shag(i));
	}
}

slider.prototype.determineShag = function(left){
	for(var i = 0; i < this.masShag.length; i++){
		if(this.masShag[i] >= left) return i - 1;
	}
	return this.masShag.length - 2;
}

slider.prototype.addEventAll = function(){
	addEvent(window.document, "mouseup", createMethodReference(this, "pasiveMove"));
}

slider.prototype.initLeft = function(){
	this.left.shag = this.determineShag(this.left.offsetLeft);
	this.appointShag(this.left, this.left.shag);
	addEvent(this.left, "mousedown", createMethodReference(this, "activeMove"));
	addEvent(window.document, "mousemove", createMethodReference(this, "leftMove"));
}

slider.prototype.initRight = function(){
    this.right.shag = this.determineShag(this.right.offsetLeft);
	this.appointShag(this.right, this.right.shag);
	addEvent(this.right, "mousedown", createMethodReference(this, "activeMove"));
	addEvent(window.document, "mousemove", createMethodReference(this, "rightMove"));
}

slider.prototype.activeMove = function(e){
	var elem = element(e);
	elem.move = true;
	elem.offset_begin = parseInt(elem.offsetLeft);
	elem.posx_begin = parseInt(defPosition(e).x);
	elem.draggable = true;
}

slider.prototype.pasiveMove = function(e){
	this.left.move = false;
	this.right.move = false;
}

slider.prototype.leftMove = function(e){
	if(this.left.move){
		var pos_x = parseInt(defPosition(e).x) + this.left.offset_begin - this.left.posx_begin;
		if((pos_x > 0) && (pos_x < this.right.offsetLeft)){
			this.assignShag(this.left, pos_x);
		}
	}
}

slider.prototype.rightMove = function(e){
	if(this.right.move){
		var pos_x = parseInt(defPosition(e).x) + this.right.offset_begin - this.right.posx_begin;
		if((pos_x <= this.slidein.offsetWidth) && (pos_x > this.left.offsetLeft)){
			this.assignShag(this.right, pos_x);
		}
	}
}


slider.prototype.appointShag = function(el, shag){
	if(this.masShag.length - 2 < shag){
	   shag = this.masShag.length - 2;
	}
	el.shag = shag;
	var sh0 = parseInt(this.shag(shag));
	el.style.left = sh0.toString() + "px";
	if(this.masfunc){
		if(el == this.left){
			if(this.masfunc.onSlideLeft) this.masfunc.onSlideLeft.call(this, shag, sh0);
		}
		if(el == this.right){
			if(this.masfunc.onSlideRight) this.masfunc.onSlideRight.call(this, shag, sh0);
		}
	}
}

slider.prototype.assignShag = function(el, pos_x){
	var newShag = this.determineShag(pos_x);
	if(el.shag != newShag){
		var oldShag = el.shag;
		el.shag = newShag;
		if(this.left.shag != this.right.shag){
			this.appointShag(el, el.shag);
		}else{
			el.shag = oldShag;
		}
		this.assignSelected();
	}
}

slider.prototype.assignSelected = function(){
	this.selected.style.left = (this.left.offsetLeft + this.left.offsetWidth/2).toString() + "px";
	this.selected.style.width = (this.right.offsetLeft - this.left.offsetLeft).toString() + "px";
}

function addEvent(elem, e, func){
	if(document.addEventListener){
		elem.addEventListener(e, eval(func), false);
	}else{
		elem.attachEvent("on"+e, eval(func));
	}
}

function createMethodReference(object, methodName){
	return function(){
        return object[methodName].apply(object, arguments);
    };
}

function element(e){
	return window.event?window.event.srcElement: e.target;
}

function Elem(elem, masvalue, masstyle){
	var element = document.createElement(elem);
	for(var i in masvalue){
		element[i] = masvalue[i];
	}

	for(var i in masstyle){
		element.style[i] = masstyle[i];
	}

	return element;
}

function $p(elem){
	var result;
	switch(typeof(elem)){
		case "object": result = elem; break
		case "string": result = document.getElementById(elem); break;
	}
	return result;
}

function defPosition(event) {
    var x = y = 0;
    if (document.attachEvent != null) {
        x = window.event.clientX + (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);
        y = window.event.clientY + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);
    } else if (!document.attachEvent && document.addEventListener) {
        x = event.clientX + window.scrollX;
        y = event.clientY + window.scrollY;
    }
    return {x:x, y:y};
}
