///////С////////
var selects=new Array(); //Массив всех с
//Создание с
function createSelect(scrollerName)
{
	if(!selects[scrollerName]) selects[scrollerName]=new customSelect(scrollerName);
}
customSelect=function(objName)
{
	//Переменные DOM
	this.defaultObject; //Селест по умолчанию
	this.customObj; // Новый селект
	this.selectButton; // Кнопка 
	this.selectList; // Список
	this.selectItems=new Array; // Элементы списка
	this.selectedPlace; // Выбранный элемент
	this.overDis; // Выбранный элемент
	//Общие переменные
	this.isShown=false;
	this.inFocus=false;
	this.keyFocus=false;
	this.nowWeMove=false;
	this.readyStat=false;
	this.selIndex=0;
	//Переменные для колёсика мыши
	this.scrollWheel=true; // Применение колёсика мыши
	this.wheelStep=1; // количество шагов скроллинга на шаг колёсика мыши
	//Переменные ошибок
	this.errors=new Array(); // массив ошибок
	this.errorHandler="alert"; // обработчик ошибок
	
	//Инициализация скроллера
	this.init=function(selectObject)
	{
		try
		{
			var i=0,j=0;
			this.defaultObject=selectObject;
			if(document.getElementById("custom_select_object_"+objName) || !this.defaultObject) return false;
			this.customObj=document.createElement('div');
			this.customObj.className="customSelect";
			if(this.defaultObject.className)
			{
				this.customObj.className+=" "+this.defaultObject.className;
			}
			this.customObj.id="custom_select_object_"+objName;
			if(this.defaultObject.className) this.customObj.className+=" "+this.defaultObject.className;
						
			if(this.defaultObject.style.width) this.customObj.style.width=this.defaultObject.style.width;
			else this.customObj.style.width=(this.defaultObject.offsetWidth-22)+'px';
			//this.customObj.style.height=(this.defaultObject.offsetHeight-2)+'px';
			
			this.overDis=document.createElement('div');
			this.overDis.className="overDis";
			//if(this.defaultObject.disabled)
			this.customObj.onmousemove=function()
			{
				selects[objName].inFocus=true;
			}
			this.customObj.onmouseout=function()
			{
				selects[objName].inFocus=false;
			}
			this.selectButton=document.createElement('div');
			this.selectButton.className="selectButton";
			this.selectButton.onmousedown=function()
			{
				this.className=this.className.replace(/\s?pressed/gi,'')+' pressed';
				selects[objName].showHideList(!selects[objName].isShown);
				selects[objName].keyFocus=true;
				selects[objName].selectedPlace.className=selects[objName].selectedPlace.className.replace(/\s?focus/gi,'')+' focus';
				return false;
			}
			this.selectButton.onmouseup=function()
			{
				this.className=this.className.replace(/\s?pressed/gi,'');
			}			
			this.selectedPlace=document.createElement('input');
			this.selectedPlace.setAttribute('autocomplete', 'off');
			this.selectedPlace.className='selectedItem';
			this.selectedPlace.name="custInp_"+objName;
			this.selectedPlace.defaultValue=this.defaultObject.options[this.defaultObject.selectedIndex].value;
			this.selectedPlace.onfocus=function()
			{
				if(this.value=='---') this.value='';
				selects[objName].idFocus=true;
				selects[objName].keyFocus=true;
			}
			this.selectedPlace.onblur=function()
			{
				if(this.value=='') this.value='---';
				selects[objName].idFocus=false;
				selects[objName].keyFocus=false;
			}
			this.selectedPlace.onkeydown=function(event)
			{
				this._dVal=this.value;
				if (!event) event = window.event;
				if(event.keyCode==13) selects[objName].showHideList(false,true);
				return (event.keyCode!=13);
			}
			this.selectedPlace.onkeyup=function(event)
			{
				if (!event) event = window.event;
				if(this._dVal!=this.value && !this.nowWeMove && event.keyCode!=38 && event.keyCode!=40)
				{
					selects[objName].selectItem(0,true,true);
					selects[objName].searchVal();
				}
			}
			this.selectedPlace.onmousedown=function()
			{
				selects[objName].showHideList(!selects[objName].isShown);
				selects[objName].keyFocus=true;
				this.className=this.className.replace(/\s?focus/gi,'')+' focus';
			}
			
			this.selectList=document.createElement('div');
			this.selectList.className='itemsList';
			this.selectList.onmousemove=function()
			{
				selects[objName].inFocus=true;
			}
			this.selectList.onmouseout=function()
			{
				selects[objName].inFocus=false;
			}
			//alert(this.selectList);
			for(i=0;i<this.defaultObject.options.length;i++)
			{
				this.selectItems[i]=document.createElement('div');
				this.selectItems[i].className="selectItem";
				this.selectItems[i].innerHTML=this.defaultObject.options[i].innerHTML;
				this.selectItems[i].opIndex=i;
				this.selectItems[i].onmouseover=function()
				{
					for(j in selects[objName].selectItems) selects[objName].selectItems[j].className=selects[objName].selectItems[j].className.replace(/\s?focus/gi,'');
					this.className+=" focus";
				}
				this.selectItems[i].onmousemove=function()
				{
					for(j in selects[objName].selectItems) selects[objName].selectItems[j].className=selects[objName].selectItems[j].className.replace(/\s?focus/gi,'');
					this.className+=" focus";
				}
				this.selectItems[i].onclick=function()
				{
					selects[objName].selectItem(this.opIndex,false);
				}
				this.selectList.appendChild(this.selectItems[i]);
			}
			
			for(j=0;j<this.selectItems.length;j++) this.selectItems[j].className=this.selectItems[j].className.replace(/\s?focus/gi,'');
			if(this.defaultObject.options.selectedIndex!=-1)
			{
				this.selectItems[this.defaultObject.options.selectedIndex].className+=" focus";
				this.selectedPlace.value=this.defaultObject.options[this.defaultObject.options.selectedIndex].innerHTML;
				this.selectedPlace.title=this.selectedPlace.value;
				this.selIndex=this.defaultObject.options.selectedIndex;
			}
			document.body.onmousedown=function()
			{
				//bodyOnClick();
				for(i in selects)
				{
					//alert(selects[i].inFocus);
					if(selects[i].isShown && !selects[i].inFocus)
					{
						selects[i].showHideList(false,true);
					}
					else
					{
						//alert();
						if(!selects[i].isShown && !selects[i].inFocus)
						{
							selects[i].keyFocus=false;
							selects[i].selectedPlace.className=selects[i].selectedPlace.className.replace(/\s?focus/gi,'')
						}
					}
				}
			}
			document.onkeydown=function(event)
			{
				var maxnd;
				if (!event) event = window.event;
				for(i in selects)
				{
					if(selects[i].keyFocus)
					{
						code=event.keyCode;
						if(code==38 || code==40)
						{
							dest=(code==37 || code==38)?-1:1;
							selects[i].moveSelect(dest);
							return false;
						}
					}
				}
			}			
			if (this.selectedPlace.addEventListener)
			{
				this.selectedPlace.addEventListener('DOMMouseScroll',selects[objName].wheel, false);
			}
			this.selectedPlace.onmousewheel =function(event){selects[objName].wheel(event)};
 			
			
			this.customObj.appendChild(this.selectButton);
			this.customObj.appendChild(this.selectedPlace);
			this.customObj.appendChild(this.selectList);
			this.defaultObject.parentNode.insertBefore(this.customObj,this.defaultObject);
			this.defaultObject.style.display="none";
			this.readyStat=true;
		}
		catch(e){ this.setError(prepareException(e));}
	}
	this.moveSelect=function(dest)
	{
		var maxnd=(dest==1)?this.selectItems.length-1:0;
		nd=this.selIndex+dest;
		if(dest*(nd)>dest*maxnd)
		{
			nd=(dest==1)?0:this.selectItems.length-1;
			maxnd=this.selIndex;
		}
		for(;dest*nd<=dest*maxnd;nd+=dest)
		{
			if(this.selectItems[nd].parentNode)
			{
				//this.selectItem(nd,false);
				this.selectItem(nd,true);
				this.selectItems[nd].scrollIntoView(false);
				break;
			}
		}
	}
	this.searchVal=function(val,noList)
	{
		var sFor=this.selectedPlace.value;;
		if(val!=null) sFor=val;
		sFor=sFor.replace('---','');
		sForExpr=new RegExp(sFor,'gi');
		for(i in this.selectItems)
		{
			if(!isNaN(i))
			{
				ind=this.selectItems[i].innerHTML.search(sForExpr);
				if(this.selectItems[i].parentNode) this.selectItems[i].parentNode.removeChild(this.selectItems[i]);
				if(ind!=-1) this.selectList.appendChild(this.selectItems[i]);
				if(sFor.toLowerCase()==this.selectItems[i].innerHTML.toLowerCase()) this.selectItem(i,true);
			}
		}
		if(!noList)this.showHideList(true,true);
	}
	this.showHideList=function(mode,noSelItem)
	{
		try
		{
			this.isShown=mode;
			if(!mode) this.selectList.style.height="";
			zInd=parseInt(this.customObj.parentNode.style.zIndex);
			this.customObj.parentNode.style.zIndex=(mode)?zInd+1000:zInd-1000;
			this.selectList.style.display=(mode)?"block":"none";
			this.selectList.style.visibility="hidden";
			pos=getAbsolutePos(this.selectList);
			//pos.y=pos.y-document.getElementById('contWrapper').scrollTop;
			cName=this.selectList.className.replace(/(norm|revert)/gi,'');
			wPad=10;
			winMax=document.documentElement.offsetHeight+document.documentElement.scrollTop-wPad-pos.y;
			winMaxUp=pos.y-this.customObj.clientHeight-document.documentElement.scrollTop-wPad;
			//alert(winMaxUp);
			cName=cName.replace(/\s?(rev|norm)/gi,"");
			if(winMaxUp/winMax>2 && this.selectList.scrollHeight>winMax)
			{
				winMax=winMaxUp;
				cName+=' rev';
			}
			else cName+=' norm';
			this.selectList.className=cName;
			if(winMax<60) winMax=60;
			if(this.selectList.scrollHeight>winMax)
			{
				this.selectList.style.height=winMax+'px';
			}
			else
			{
				this.selectList.style.height="auto";
			}
			this.selectList.style.visibility="visible";
			for(j=0;j<this.selectItems.length;j++) this.selectItems[j].className=this.selectItems[j].className.replace(/\s?focus/gi,'');
			if(this.defaultObject.options.selectedIndex!=-1)
			{
				this.selectItems[this.defaultObject.options.selectedIndex].className+=" focus";
				//if(!noSelItem) this.selectedPlace.value=this.defaultObject.options[this.defaultObject.options.selectedIndex].innerHTML;
			}
			if(!mode) this.searchVal('',true);
			this.inFocus=mode;
		}
		catch(e){ this.setError(prepareException(e));}
	}
	this.timeoutSlide=function(mode)
	{
		try
		{
			if((mode && this.selectList.scrollHeight>this.selectList.clientHeight) || (!mode && this.selectList.clientHeight>0))
			{
				this.showHideList(true);
			}
			else
			{
				this.isShown=mode;
				this.selectList.style.display=(mode)?"block":"none";
				for(j=0;j<this.selectItems.length;j++) this.selectItems[j].className=this.selectItems[j].className.replace(/\s?focus/gi,'');
				if(this.defaultObject.options.selectedIndex!=-1)
				{
					this.selectItems[this.defaultObject.options.selectedIndex].className+=" focus";
					this.selectedPlace.value=this.defaultObject.options[this.defaultObject.options.selectedIndex].innerHTML;
					this.selectedPlace.title=this.selectedPlace.value;
				}
			}
		}
		catch(e){ this.setError(prepareException(e));}
	}
	this.selectItem=function(ind,hide,shadowMode)
	{
		try
		{
			if(!hide) hide=false;
			if(ind>=0 && this.defaultObject.options[ind])
			{
				this.defaultObject.options[ind].selected=true;
				this.selectedPlace.values=this.selectItems[ind].innerHTML;
				this.selIndex=ind;
				for(j=0;j<this.selectItems.length;j++) this.selectItems[j].className=this.selectItems[j].className.replace(/\s?focus/gi,'');
				this.selectItems[ind].className+=" focus";
				if(!shadowMode)
				{
					this.selectedPlace.value=this.defaultObject.options[this.defaultObject.options.selectedIndex].innerHTML;
					this.selectedPlace.title=this.selectedPlace.value;
				}
				this.showHideList(hide);
				if(this.defaultObject.onchange) this.defaultObject.onchange();
			}
		}
		catch(e){ this.setError(prepareException(e));}
	}
	//Обработка колёсика мыши
	this.wheel=function(event)
	{
		try
		{
			if(selects[objName].keyFocus)
			{
				var wheelDelta;
				var dest='';
				if (!event) event = window.event;
				if (event.wheelDelta) wheelDelta = -event.wheelDelta/120;
				else if (event.detail) wheelDelta = event.detail/3;
				dest=(wheelDelta>0)?1:-1;
				//alert(dest);
				selects[objName].selectItem(selects[objName].selIndex+dest,false);
					event.returnValue = false;
			}
		}
		catch(e){ selects[objName].setError(prepareException(e));}
	}
	//Обработка ошибок
	function prepareException(e)
	{
		filename=(e.fileName)?e.fileName.substring(7,e.fileName.length):'';
		return filename+': '+e.name+' at line '+e.lineNumber+': '+e.message;
	}
	this.printErrors=function()
	{
		if(this.errors.length!=0){for(i=0;i<this.errors.length;i++){eval(this.errorHandler+"('"+this.errors[i]+"')");}}
	}
	this.setError = function(eType)
	{
		switch(eType)
		{
			default:this.errors.push("Object: "+objName+". Error "+eType);break;
		}
		this.printErrors();
	}
	//Уничтожение объекта
	this.recheck=function()
	{
		try
		{
			this.readyStat=false;
			var i=0,j=0;
			if(this.defaultObject.className) this.customObj.className+=" "+this.defaultObject.className;
			if(this.defaultObject.style.width) this.customObj.style.width=this.defaultObject.style.width;
			else this.customObj.style.width=(this.defaultObject.offsetWidth-22)+'px';
			for(i=this.selectItems.length-1;i>=0;i--)
			{
				this.selectList.removeChild(this.selectItems[i]);
				this.selectItems.splice(i,1);
			}
			
			for(i=0;i<this.defaultObject.options.length;i++)
			{
				this.selectItems[i]=document.createElement('div');
				this.selectItems[i].className="selectItem";
				this.selectItems[i].innerHTML=this.defaultObject.options[i].innerHTML;
				this.selectItems[i].opIndex=i;
				this.selectItems[i].onmouseover=function()
				{
					for(j in selects[objName].selectItems) selects[objName].selectItems[j].className=selects[objName].selectItems[j].className.replace(/\s?focus/gi,'');
					this.className+=" focus";
				}
				this.selectItems[i].onmousemove=function()
				{
					for(j in selects[objName].selectItems) selects[objName].selectItems[j].className=selects[objName].selectItems[j].className.replace(/\s?focus/gi,'');
					this.className+=" focus";
				}
				this.selectItems[i].onclick=function()
				{
					selects[objName].selectItem(this.opIndex,false);
				}
				this.selectList.appendChild(this.selectItems[i]);
			}
			
			for(j=0;j<this.selectItems.length;j++) this.selectItems[j].className=this.selectItems[j].className.replace(/\s?focus/gi,'');
			if(this.defaultObject.options.selectedIndex!=-1)
			{
				this.selectItems[this.defaultObject.options.selectedIndex].className+=" focus";
				this.selectedPlace.value=this.defaultObject.options[this.defaultObject.options.selectedIndex].innerHTML;
				this.selectedPlace.title=this.selectedPlace.value;
				this.selIndex=this.defaultObject.options.selectedIndex;
			}
			this.readyStat=true;
		
		}
		catch(e){ this.setError(prepareException(e));}
	}
}
