var chmouseover=false;
var chDefaultSliderLength=100;
var chSliderDefaultOrientation='horizontal';
var chSliderClassName ='ch_slider';
var chSliderDisplayClassName='ch_slider_display';
var chsliders=[];
var chdisplays=[];
var chslider={};
var chdisplay={};

function chAddLoadEvent(func){
		var oldonload=window.onload;
		if(typeof window.onload!='function'){
			window.onload=func;
		}else{
			window.onload=function(){
				oldonload();
				func();
			};
		}
}
function chGetElementsByClass(className){
	var classElements=new Array();
	var els=document.getElementsByTagName("*");
	var elsLen=els.length;
	var pattern=new RegExp("\\b"+className+"\\b");
	for(var i=0,j=0;i<elsLen;i++){
		if(pattern.test(els[i].className)){
			classElements[j]=els[i];
			j++;
		}
	}
	return classElements;
}
function chLeft(elmnt,pos){
	if(!(elmnt=document.getElementById(elmnt))) return 0;
	if(elmnt.style && (typeof(elmnt.style.left)=='string')){
		if(typeof(pos)=='number') elmnt.style.left=pos+'px';
		else{
			pos=parseInt(elmnt.style.left);
			if(isNaN(pos)) pos=0;
		}
	}
	else if(elmnt.style && elmnt.style.pixelLeft){
		if(typeof(pos)=='number') elmnt.style.pixelLeft=pos;
		else pos=elmnt.style.pixelLeft;
	}
	return pos;
}
function chTop(elmnt,pos){
	if(!(elmnt=document.getElementById(elmnt))) return 0;
	if(elmnt.style && (typeof(elmnt.style.top)=='string')){
		if(typeof(pos)=='number') elmnt.style.top=pos + 'px';
		else{
			pos=parseInt(elmnt.style.top);
			if(isNaN(pos)) pos=0;
		}
	}
	else if(elmnt.style && elmnt.style.pixelTop){
		if(typeof(pos)=='number') elmnt.style.pixelTop=pos;
		else pos=elmnt.style.pixelTop;
	}
	return pos;
}
function moveSlider(evnt){
	var evnt=(!evnt) ? window.event : evnt;
	if(chmouseover){
		chslider.x=chslider.startOffsetX + evnt.screenX;
		chslider.y=chslider.startOffsetY + evnt.screenY;
		if(chslider.x > chslider.xMax) chslider.x=chslider.xMax;
		if(chslider.x < 0) chslider.x=0;
		if(chslider.y > chslider.yMax) chslider.y=chslider.yMax;
		if(chslider.y < 0) chslider.y=0;
		chLeft(chslider.id,chslider.x);
		chTop(chslider.id,chslider.y);
		var sliderVal=chslider.x + chslider.y;
		var sliderPos=(chslider.distance / chdisplay.valuecount) * 
			Math.round(chdisplay.valuecount * sliderVal / chslider.distance);
		var v=Math.round((sliderPos * chslider.scale + chslider.from) *
			Math.pow(10,chdisplay.decimals)) / Math.pow(10,chdisplay.decimals);
		chdisplay.value=v;
		return false;
	}
	return
}
function slide(evnt){
	if(!evnt) evnt=window.event;
	chslider=(evnt.target) ? evnt.target : evnt.srcElement;
	var dist=parseInt(chslider.getAttribute('distance'));
	chslider.distance=dist ? dist : chDefaultSliderLength;
	var ori=chslider.getAttribute('orientation');
	var orientation=((ori=='horizontal') || (ori=='vertical')) ? ori : chSliderDefaultOrientation;
	var displayId=chslider.getAttribute('display');
	chdisplay=document.getElementById(displayId);
	chdisplay.sliderId=chslider.id;
	var dec=parseInt(chdisplay.getAttribute('decimals'));
	chdisplay.decimals=dec ? dec : 0;
	var val=parseInt(chdisplay.getAttribute('valuecount'));
	chdisplay.valuecount=val ? val : chslider.distance + 1;
	var from=parseFloat(chdisplay.getAttribute('from'));
	from=from ? from : 0;
	var to=parseFloat(chdisplay.getAttribute('to'));
	to=to ? to : chslider.distance;
	chslider.scale=(to - from) / chslider.distance;
	if(orientation=='vertical'){
		chslider.from=to;
		chslider.xMax=0;
		chslider.yMax=chslider.distance;
		chslider.scale=-chslider.scale;
	}else{
		chslider.from=from;
		chslider.xMax=chslider.distance;
		chslider.yMax=0;
	}
	chslider.startOffsetX=chLeft(chslider.id) - evnt.screenX;
	chslider.startOffsetY=chTop(chslider.id) - evnt.screenY;
	chmouseover=true;
	document.onmousemove=moveSlider;
	document.onmouseup=sliderMouseUp;
	return false;
}
function sliderMouseUp(){
	if(chmouseover){
		var v=(chdisplay.value) ? chdisplay.value : 0;
		var pos=(v - chslider.from)/(chslider.scale);
		if(chslider.yMax==0){
			pos=(pos > chslider.xMax) ? chslider.xMax : pos;
			pos=(pos < 0) ? 0 : pos;
			chLeft(chslider.id,pos);
		}
		if(chslider.xMax==0){
			pos=(pos > chslider.yMax) ? chslider.yMax : pos;
			pos=(pos < 0) ? 0 : pos;
			chTop(chslider.id,pos);
		}
		if(document.removeEventListener){
			document.removeEventListener('mousemove',moveSlider,false);
			document.removeEventListener('mouseup',sliderMouseUp,false);
		}
		else if(document.detachEvent){
			document.detachEvent('onmousemove',moveSlider);
			document.detachEvent('onmouseup',sliderMouseUp);
			document.releaseCapture();
		}
	}
	chmouseover=false;
}
function focusDisplay(evnt){
	if(!evnt) evnt=window.event;
	var chdisplay=(evnt.target) ? evnt.target : evnt.srcElement;
	var lock=chdisplay.getAttribute('typelock');
	if(lock=='on'){
		chdisplay.blur();
	}
	return;
}
function chInit(){
	chsliders=chGetElementsByClass(chSliderClassName)
	for(var i=0; i < chsliders.length; i++){
		chsliders[i].onmousedown=slide;
	}
	chdisplays=chGetElementsByClass(chSliderDisplayClassName)
	for(var i=0; i < chdisplays.length; i++){
		chdisplays[i].value=chdisplays[i].defaultValue;
		chdisplays[i].onfocus=focusDisplay;
	}
}
chAddLoadEvent(chInit);

