﻿// JavaScript Document

//-----------Public var------------------
//-----------Тип Браузера - всегда пригодится ---------
var is_ie, is_khtml, is_opera; //Boolean

//-----------Public const------------------
//-------статус элемента-------------------------
var stateNormal=0, stateSelected=1, stateHighlighted=2, statePressed=3, stateDisabled=4;

//------------------Функции------------------------------
//function StringToArray(s,separator) - преобразует строку s с разделителем separator в массив сток
//                                      separator по умолчанию равен ','
//function DisableSelectAndDrag(element) - запрет на выделение и перетаскивание элемента (IE и Mozilla)
//                                         возвращает true если успешно

//---------------------MenuBarObj-------------------------------
//конструктор:
//MenuBarObj(items)        - items - Array - массив идентификаторов кнопок (HTML свойство "id")
//                                   или String - идентификаторы кнопок, разделенные запятой

//свойства:
//States                   - Integer = 2,3,4 - количество состояний кнопок (по умолчанию 4)
//ButtonMode               - Boolean - кнопка не выбирается а возвращается поле отпускания в нормальное состояние
//MouseOverSwitch          - Boolean - срабвтывание по наведению мышы (по умолчанию False)
//MouseOverSwitchTimeout   - Integer - задержка в ms при срабатыванию по наведению мышы (по умолчанию 500)
//MouseOverPressTimeout    - Integer - длительность в ms состояния нажатой кнопки при срабатыванию по наведению мышы (по умолчанию 100)
//DownRepeat               - Boolean - повтор события OnDown пока кнопка нажата
//DownRepeatDelay          - Integer - задержка в ms второго события OnDown при повторе (по умолчанию 500)
//DownRepeatInterval       - Integer - интервал в ms между последующими событиями OnDown при повторе (по умолчанию 100)

//события:
//OnHighlight              - function(element,state)
//                              element - Object - элемент HTLM (кнопка) 
//                              state - Integer = stateNormal, stateSelected, stateHighlighted, statePressed, //OnHighlightIndex         - function(index,state)
//                              index - Integer - индекс кнопки
//                              state - Integer = stateNormal, stateSelected, stateHighlighted, statePressed, stateDisabled
//OnSelect                 - function(index)
//OnDown                   - function(index)
//OnUp                     - function(index)
//                              index - Integer - индекс кнопки 
//OnSelectElement          - funciton(element)
//                              element - Object - элемент HTLM (кнопка)

//методы:
//SetCurrent(index)        - index - Integer - индекс кнопки (-1 - аналогично Reset)
//GetCurrent()             - return Integer - возвращает индекс выбранной на данный момент кнопки или -1 если не выбрано
//SetEnabled(index,enabled)- index - Integer
//                           enabled - Boolean  
//GetEnabled(index)        - index - Integer     
//                           return Boolean
//GetCurrent()             - return Integer - возвращает индекс выбранной на данный момент кнопки или -1 если не выбрано
//Reset()                  - сброс кнопок в исходное состояние

//DisableUntilLeave(index)

//---------------------ExpandObj-------------------------------- 

//конструктор
//ExpandObj(MenuObj,items,height)  - items - Array - массив идентификаторов раздвигаемых областей (HTML свойство "id")
//                                   или String - идентификаторы раздвигаемых областей, разделенные запятой
//                                 - MenuObj - Object - 
//                                 - height - Integer - высота в пикселях раскрытой области 

//свойства:
//Interval               - Integer - ms = 5
//IntervalStep           - Integer - px = 25 - если 0 то мгновенно
//VisibleDisplayValue    - String  - свойство CSS.Display видимого элемента = ''

//методы:
//Select(index)

//события:
//OnStartExpand(oldindex,newindex) - oldindex,newindex - Integer
//OnEndExpand(oldindex,newindex)   - oldindex,newindex - Integer

//---------------------ScrollObj-----------------------------------------------
//-----конструктор----------------------
//buttons - [btnup,btndn]
//thumb  - [thumbarea,thumb,thumbminheight]
//scrollarea - 
//----------поля------------------------
//ScrollStep                       - Integer - кол. пикселей при единичном сдвиге
//                                   если SmoothScroll то ....
//----------методы----------------------
//UpdateScrollArea()
//Set(Get)SmoothScroll             - Boolean
//Set(Get)DisableButtons           - Boolean
//Set(Get)DownRepeat               - Boolean - повтор нажатий
//Set(Get)DownRepeatDelay          - Integer - задержка в ms второго нажатия при повторе (по умолчанию 500) 
//                                   если SmoothScroll то время которое идет проктутка при коротком нажатии
//Set(Get)DownRepeatInterval       - Integer - интервал в ms между последующими нажатии при повторе (по умолчанию 100)
//																	 если SmoothScroll то ....
//ScrollInView(element)
//IsInView(element)                - Boolean
//ScrollRangeInView(y1,y2)
//IsRangeInView(y1,y2)             - Boolean
//Scrolling()                      - Boolean
//---------события-----------------------
//OnSetThumbHeight(thumbheight)
//OnHighlight(index,state)


//--------------implementation----------------------------------------
function SelectStart(){
	return false;
}

function DisableSelectAndDrag(element){
	var i;
	var r=false;
	if(element.style &&(typeof(element.style.MozUserSelect)!="undefined")) {
		element.style.MozUserSelect='none';
		r=true;
	}
/*	else if(element.style &&(typeof(element.style.WebkitUserSelect)!="undefined")) {
		element.style.WebkitUserSelect='none';
	}*/
/*	else if(element.style &&(typeof(element.style.KhtmlUserSelect)!="undefined")) { 
		element.style.KhtmlUserSelect='none';
		if(element.childNodes &&(element.childNodes.length>0)) {
			for(i=0;i<element.childNodes.length;i++) {
				DisableSelectAndDrag(element.childNodes[i]);
			}
		}
	} */
	else if(element.style &&(typeof(element.style.UserSelect)!="undefined")){
		element.style.UserSelect='none';
		r=true;
	}
	else if(is_ie) {
		element.onselectstart=SelectStart; 
		element.ondragstart=SelectStart; 
		if(element.all.length>0){
			for(i=0;i<element.all.length;i++){ 
				element.all[i].onselectstart=SelectStart;
				element.all[i].ondragstart=SelectStart;
			}
		}
		r=true;
	}
	return r;
}

function StringToArray(s,separator){
	var l=s.length, i, b=0, z=0, c;
	var r=new Array();
	if(separator) c=separator.charAt(0)
	else c=',';
	for(i=0;i<l;i++){
		if(s.charAt(i)==c){
			r[z]=s.substring(b,i)
			b=i+1;
			z++;
		}
	}
	r[z]=s.substr(b);
	return r;
}

//---------------MenuBarObj-----------------
//-----------Internal variable--------------
var _MenuBarObjObjCount=0;
//-----------Internal consts----------------
var evMDown=0, evMUp=1, evMOver=2, evMLeave=3, evDblClick=4, evMMove=5;
var stDisabled=8, stSelected=4, stPressed=2, stOver=1, stTempDisabled=16;

function _MenuBarObjPress(itemindex,fromtimer) {
	var i;
	this._CancelTimeout();
	if ((this.States<4)||(fromtimer>0)) {
		if(!(this._buttonstate[itemindex] & (stDisabled | stTempDisabled))){
			if(this.ButtonMode){
				if(fromtimer<0) this._buttonstate[itemindex] |= stPressed;
				this._Highlight(itemindex,stateHighlighted);
				this._Down(itemindex);
				this._Select(itemindex);
			}
			else{
				for(i=0;i<this._buttons.length;i++) {
					if(i!=itemindex){
						if(this._buttonstate[i] & stSelected) {
							this._buttonstate[i] &= ~stSelected;
							this._Highlight(i,stateNormal);
						}
					}
				}
				if(fromtimer<0) this._buttonstate[itemindex] |= stPressed;
				this._buttonstate[itemindex] |= stSelected;
				this._Highlight(itemindex,stateSelected);
				this._Down(itemindex);
				this._Select(itemindex);
			}
		}
	}
	else {
		if(!(this._buttonstate[itemindex] & (stDisabled | stTempDisabled))){
			if (!(this._buttonstate[itemindex] & stSelected)) { 
				if(fromtimer<0) this._buttonstate[itemindex] |= stPressed;
				this._Highlight(itemindex,statePressed);
				this._Down(itemindex);
				if(fromtimer==0) {
					this._overindex=itemindex;
					this._timermode=1;
					this._timeoutID=window.setTimeout(this.ObjName+"._Timeout()", this.MouseOverPressTimeout);
				}
			}
		}
	}
	if(this._switchKhtmSelection){ //на две секунды выключаем возможность выделения в Safari
		document.body.style.KhtmlUserSelect='none';
		if(this._KhtmSelectionTimeout>=0) clearTimeout(this._KhtmSelectionTimeout);
		this._KhtmSelectionTimeout=setTimeout(this.ObjName+'._KhtmlSelection()',2000);
	}
}

function _MenuBarObjKhtmlSelection() {
	this._KhtmSelectionTimeout=-1;
	document.body.style.KhtmlUserSelect='';
}

function _MenuBarObjRelease(itemindex) {
	var i;
	if(this.States>=4) {
		if(this.ButtonMode){
			this._buttonstate[itemindex] &= ~stPressed;
			this._Highlight(itemindex,stateHighlighted);
			this._Up(itemindex);
			this._Select(itemindex);
		}
		else{
			for(i=0;i<this._buttons.length;i++) {
				if(i!=itemindex){
					if(this._buttonstate[i] & stSelected) {
						this._buttonstate[i] &= ~stSelected;
						this._Highlight(i,stateNormal);
					}
				}
			}
			if(!(this._buttonstate[itemindex] & stSelected)) {
				this._buttonstate[itemindex] |= stSelected;
				this._Highlight(itemindex,stateSelected);
				this._Up(itemindex);
				this._Select(itemindex);
			}
		}
	}
}

function _MenuBarObjEnter(itemindex) {
	this._buttonstate[itemindex] |= stOver;
	if ((this.States>2)&& !(this._buttonstate[itemindex] & stSelected)) this._Highlight(itemindex,stateHighlighted);
	if ((this.MouseOverSwitch)&&(itemindex!=this._overindex)) {
	  if(this._overindex>=0) this.CancelTimeout();
		if(!(this._buttonstate[itemindex] & stSelected)) {
			this._overindex=itemindex;
			this._timermode=0;
		  this._timeoutID=window.setTimeout(this.ObjName+"._Timeout()", this.MouseOverSwitchTimeout);
		}
	}
}

function _MenuBarObjLeave(itemindex) {
	var p=this._buttonstate[itemindex] & stPressed;
	this._buttonstate[itemindex] &= ~(stOver + stPressed);
	if(p) this._Up(itemindex);
	if ((this.States>2)&& !(this._buttonstate[itemindex] & stSelected)) this._Highlight(itemindex,stateNormal);
	if ((this.MouseOverSwitch)&&(itemindex==this._overindex)) {
	  if(this._overindex>=0) this._CancelTimeout(); 
	}
}

function _MenuBarObjMouseEvent (eventindex, itemindex) { 
  if((this._buttonstate[itemindex] & stDisabled)==0) {
		switch (eventindex) {
			case evMDown: if (!(this._buttonstate[itemindex] & stPressed)) this._Press(itemindex,-1); break; 
			case evMUp: if (this._buttonstate[itemindex] & stPressed) this._Release(itemindex); break;
			case evMOver: if (!(this._buttonstate[itemindex] & stOver)) this._Enter(itemindex); break;
			case evMLeave: {
				this._buttonstate[itemindex] &= ~stTempDisabled;
				if (this._buttonstate[itemindex] & stOver) this._Leave(itemindex); break;
			}
			case evDblClick: {
				if (!(this._buttonstate[itemindex] & stPressed)) this._Press(itemindex,-1);
				if (this._buttonstate[itemindex] & stPressed) this._Release(itemindex);
			}
		}
	}
}

function _MenuBarObjHighlight(itemindex,state) {
	if(this.OnHighlight) {
		this.OnHighlight(this._buttons[itemindex],state);
	}
	if(this.OnHighlightIndex) {
		this.OnHighlightIndex(itemindex,state);
	}
}

function _MenuBarObjSelect(itemindex) {
	if(this.OnSelect) this.OnSelect(itemindex);
	if(this.OnSelectElement) this.OnSelectElement(this._buttons[itemindex]);
} 

function _MenuBarObjDown(itemindex) {
	if(this.OnDown) this.OnDown(itemindex);
	if(this.DownRepeat) {
	  this._repeatTimeoutMode=0;
		this._repeatTimeoutIndex=itemindex;
		this._repeatTimeoutID=window.setTimeout(this.ObjName+"._RepeatTimeout()", this.DownRepeatDelay);
	}
} 

function _MenuBarObjUp(itemindex) {
	if(this._repeatTimeoutID>=0){
		if(this._repeatTimeoutMode==0) window.clearTimeout(this._repeatTimeoutID);
		else window.clearInterval(this._repeatTimeoutID);
		this._repeatTimeoutID=-1;
	}
	if(this.OnUp) this.OnUp(itemindex);
}

function _MenuBarObjRepeatTimeout() {
  if(this._repeatTimeoutMode==0) {
	  this._repeatTimeoutMode=1;
		this._repeatTimeoutID=window.setInterval(this.ObjName+"._RepeatTimeout()", this.DownRepeatInterval);
	}
	if(this.OnDown) this.OnDown(this._repeatTimeoutIndex);
}

function _MenuBarObjCancelTimeout() {
  this._overindex=-1;
	if(this._timeoutID>=0) {
		window.clearTimeout(this._timeoutID);
		this._timeoutID=-1;
	}
}

function _MenuBarObjTimeout() {
	this._timeoutID=-1;
	if(this._overindex>=0) this._Press(this._overindex,this._timermode);
}

function _MenuBarGetCurrent() {
	var r=-1;
	if(this._buttons.length>0){
		var i=0;
		while((i<this._buttons.length)&&(r<0)){
			if(this._buttonstate[i] & stSelected) r=i;
			i++;
		}
	}
	return r;
}

function _MenuBarSetCurrent(index) {
	if((index<0)||(index>=this._buttons.length)) this.Reset();
	else {
		if((this._buttonstate[index]& stDisabled)==0)	this._Press(index,1);
	}
}

function _MenuBarReset() {
	var i;
	for(i=0;i<this._buttons.length;i++) {
		if(this._buttonstate[i]) {
			this._buttonstate[i] = 0;
			this._Highlight(i,stateNormal);
		}
	}
}

function _MenuBarObjSetEnabled(index,enabled){
	var en=(this._buttonstate[index]& stDisabled)==0;
	if(enabled != en) {
		if(enabled){
			this._buttonstate[index]=0;
			this._Highlight(index,stateNormal);
		}
		else {
			if (this._buttonstate[index] & stPressed) window.setTimeout(this.ObjName+"._TimeoutDisable("+index+")", 1);
			else {
				this._buttonstate[index]=stDisabled;
				this._Highlight(index,stateDisabled);
			}
		}
	}
}

function _MenuBarObjGetEnabled(index){
	return (this._buttonstate[index]& stDisabled)==0;
}

function _MenuBarObjTimeoutDisable(index){
  if (this._buttonstate[index] & stPressed) this._Release(index);
	this._buttonstate[index]=stDisabled;
	this._Highlight(index,stateDisabled);
}

function _MenuBarObjDisableUntilLeave(index){
	if (this._buttonstate[index] & stOver) this._buttonstate[index] |= stTempDisabled;
}

function MenuBarObj(items) {
  //приведение параметра к типу Array
  var _items;
	if(items.constructor==String)	_items=StringToArray(items)
	else _items=items;
	//инициализация имени объекта
	this.ObjName="___MenuBarObj"+(_MenuBarObjObjCount++);
	eval(this.ObjName+"=this;")		
  //инициализация методов
	this._MouseEvent=_MenuBarObjMouseEvent;
	this._Highlight=_MenuBarObjHighlight;
	this._Select=_MenuBarObjSelect;
	this._CancelTimeout=_MenuBarObjCancelTimeout;
	this._Timeout=_MenuBarObjTimeout;
	this._Press=_MenuBarObjPress;
	this._Release=_MenuBarObjRelease;
	this._Enter=_MenuBarObjEnter;
	this._Leave=_MenuBarObjLeave;
	this._Down=_MenuBarObjDown;
	this._Up=_MenuBarObjUp;
	this._RepeatTimeout=_MenuBarObjRepeatTimeout;
	this._TimeoutDisable=_MenuBarObjTimeoutDisable;
	this.GetCurrent=_MenuBarGetCurrent;
	this.SetCurrent=_MenuBarSetCurrent;
	this.Reset=_MenuBarReset;
	this.SetEnabled=_MenuBarObjSetEnabled;
	this.GetEnabled=_MenuBarObjGetEnabled;
	this._KhtmlSelection=_MenuBarObjKhtmlSelection;
	this.DisableUntilLeave=_MenuBarObjDisableUntilLeave;
	//инициализация полей
	this.States=4;
	this.MouseOverSwitch=false;
	this.MouseOverSwitchTimeout=500;
	this.MouseOverPressTimeout=100;
	this.ButtonMode=false;
	this.DownRepeat=false;
	this.DownRepeatDelay=500;
	this.DownRepeatInterval=100;
	this._timeoutID=-1;
	this._repeatTimeoutID=-1;
	this._buttons=new Array();
	this._buttonstate=new Array();
	this._switchKhtmSelection=false;
	this._KhtmSelectionTimeout=-1;
	var c=_items.length, e, k, i;
	if(c){
		var trykhtmlseldrag=false;
		for(i=0;i<c;i++){
			e=document.getElementById(_items[i]);
			if(e){
				k=this._buttons.length;
				this._buttons[k]=e;
				this._buttonstate[k]=0;
				e.onmousedown=new Function(this.ObjName+'._MouseEvent(evMDown,'+k+')');
				e.onmouseup=new Function(this.ObjName+'._MouseEvent(evMUp,'+k+')');
				e.onmouseover=new Function(this.ObjName+'._MouseEvent(evMOver,'+k+')');
				e.onmouseleave=new Function(this.ObjName+'._MouseEvent(evMLeave,'+k+')');
				e.onmouseout=new Function(this.ObjName+'._MouseEvent(evMLeave,'+k+')');
				//Double Click обрабатываем только для IE потому что этот долбаный IE съедает второй быстрый onmousedown
				if(is_ie) e.ondblclick=new Function(this.ObjName+'._MouseEvent(evDblClick,'+k+')');
				//------------------------------------------------------------------------------------------------------
				if(!DisableSelectAndDrag(e)) trykhtmlseldrag=true;
			}
		}
		if(trykhtmlseldrag) {
			if(document.body.style &&(typeof(document.body.style.KhtmlUserSelect)!="undefined")) { 
				this._switchKhtmSelection=true;
			}
		}
	}
}

//---------------------ExpandObj-------------------------------- 

var _ExpandObjObjCount=0;

function _ExpandObjSelect(index){
	if((index>=0)&&(index<this._items.length)/*&&(index!=this._selected)*/){
		this._StartExpand(index);
	}
}

function _ExpandObjSelect2(index){
	if((index>=0)&&(index<this._items.length)/*&&(index!=this._selected)*/){
		this.MenuObj.SetCurrent(index);
	}
}

function _ExpandObjStartExpand(index) {
	if (index!=this._expanding) {
    if (this._expanding>=0) this._nextexpand=index; //если уже кто-то раскрывается то обождём
    else { // если никто не раскрывается
      if (index!=this._selected) { // есть ли смысл начинать процесс если и так всё ок
			  if(this.OnStartExpand) this.OnStartExpand(this._selected,index);
		    this._expanding=index;
				this._expandstep=0;
				if(this._DoExpandStep(this.Interval==0))
					this._expandintervalId=setInterval(this.ObjName+"._DoExpandStep(false)",this.Interval);
		  } 
		}
  }
}

function _ExpandObjDoExpandStep(onestep) {
  if (this._expanding>=0) {
  	P1=this._items[this._expanding];
		P2=this._items[this._selected];
		if((this.IntervalStep>0)&& !onestep) this._expandstep=this._expandstep+this.IntervalStep;
		else this._expandstep=this._itemsheight;
		if (this._expandstep>this._itemsheight) this._expandstep=this._itemsheight;
		P1.style.height=this._expandstep+"px";
		H=this._itemsheight-this._expandstep-1;
		if(H<=0){ 
			P2.style.display='none';
			H=0;
		}
		P2.style.height=H+"px"; 
		P1.style.display=this.VisibleDisplayValue;
		if (this._expandstep>=this._itemsheight) {
			clearInterval(this._expandintervalId);
		  if(this.OnEndExpand) this.OnEndExpand(this._selected,this._expanding);
			this._expandintervalId=-1;
			this._selected=this._expanding;
			this._expanding=-1;
			if(this._nextexpand>=0) {
				T=this._nextexpand;
				this._nextexpand=-1;
				this._StartExpand(T);
			}
			return false;
		}
		return true
	}
	return false;
}

function ExpandObj(MenuObj,items,height) {
  //приведение параметра к типу Array
  var _items, i;
	if(items.constructor==String)	_items=StringToArray(items)
	else _items=items;
	//инициализация имени объекта
	this.ObjName="___ExpandObj"+(_ExpandObjObjCount++);
	eval(this.ObjName+"=this;");
	//--
	this._Select=_ExpandObjSelect;
	this._StartExpand=_ExpandObjStartExpand;
	this._DoExpandStep=_ExpandObjDoExpandStep;
	this.Select=_ExpandObjSelect2;
	//--
	this.MenuObj=MenuObj;
	MenuObj.OnSelect=new Function('index',this.ObjName+'._Select(index)');
	c=_items.length;
	this._items=new Array();
	this._itemsheight=height;
	this._selected=-1;
	this._expanding=-1;
	this._expandstep=0;
	this._expandintervalId=-1;
	this._nextexpand=-1;
	this.Interval=5;
	this.IntervalStep=25;
	this.VisibleDisplayValue='';
	maxheight=0;
	if(c){
		for(i=0;i<c;i++){
			e=document.getElementById(_items[i]);
			if(e){
				k=this._items.length;
				this._items[k]=e;
				e.style.overflow='hidden';
				if((e.style.display!="none")&&(this._selected<0)) {
					this._selected=k;
				}
			}
		}
	}
}

//---------------ScrollObj------------------------

var _ScrollObjObjCount=0;

function _ScrollObjBtnUp(index){
	if(index==this._NowPressed){
		this._NowPressed=-1;
		if((this._ShortTimeoutId<0)&&(this._IntervalId>=0)) {
			clearInterval(this._IntervalId);
			this._IntervalId=-1;
		}
	}
}

function _ScrollObjBtnDn(index){
	this._DoScroll(index);
	if(this._SmoothScroll){
		this._KillIntervals(); 
		this._NowPressed=index;
		this._ShortTimeoutId=setTimeout(this.ObjName+"._EndTimeout()", this._SmoothDelay);
		this._IntervalId=setInterval(this.ObjName+"._StepInterval("+index+")", this._SmoothInterval);
	}
}

function _ScrollObjUpdateScrollArea(force){
	if(force==undefined) force=false;
	if(this._BtnObj){
		if(this.ScrollElement.scrollHeight<=this.ScrollElement.clientHeight){
			this._BtnObj.SetEnabled(0,false);
			this._BtnObj.SetEnabled(1,false);
			if(this.debugMode) dbg(this.ScrollElement.id+' disabled');
		}
		else {
			if(this._DoDisableButtons) {
				var y=this.ScrollElement.scrollTop;
				this._BtnObj.SetEnabled(0,y>0);
				this._BtnObj.SetEnabled(1,y<this.ScrollElement.scrollHeight-this.ScrollElement.clientHeight);
  			if(this.debugMode) dbg('enabled');
			}
			else {
				this._BtnObj.SetEnabled(0,true);
				this._BtnObj.SetEnabled(1,true);
  			if(this.debugMode) dbg('enabled');
			}
		}
	}
	if(this._Thumb){
		if(this.ScrollElement.scrollHeight<=this.ScrollElement.clientHeight){
			this._Thumb.style.display='none';
		}
		else {
			this._Thumb.style.display='';
		  this._ThumbHeight=Math.round(this._ThumbArea.offsetHeight*this.ScrollElement.clientHeight/this.ScrollElement.scrollHeight);
			if(this._ThumbHeight<this._ThumbMinHeight) this._ThumbHeight=this._ThumbMinHeight;
			this._ThumbRate=(this._ThumbArea.offsetHeight-this._ThumbHeight)/(this.ScrollElement.scrollHeight-this.ScrollElement.clientHeight);
			if(this.OnSetThumbHeight) this.OnSetThumbHeight(this._ThumbHeight);
			this._UpdateThumbPosition();
		}
	}
	if(force){
//		this._Highlight(0,
	}
}

function _ScrollObjScrolling(){
	return this.ScrollElement.scrollHeight>this.ScrollElement.clientHeight;
}

function _ScrollObjThumbScroll(thumbtop){
	this.ScrollElement.scrollTop=Math.round(thumbtop/this._ThumbRate);
	if(this._BtnObj){
		if(this._DoDisableButtons) {
			var y=this.ScrollElement.scrollTop;
			this._BtnObj.SetEnabled(0,y>0);
			this._BtnObj.SetEnabled(1,y<this.ScrollElement.scrollHeight-this.ScrollElement.clientHeight);
		}
	}
}

function _ScrollObjGetDisableButtons(){
	return this._DoDisableButtons;
}

function _ScrollObjSetDisableButtons(db){
	if(db!=this._DoDisableButtons){
		this._DoDisableButtons=db;
		this.UpdateScrollArea();
	}
}

function _ScrollObjSetDownRepeat(dr){
  this._DownRepeat=dr;
	if(this._BtnObj && !this._SmoothScroll) this._BtnObj.DownReapat=dr;
}

function _ScrollObjGetDownRepeat(){
	return this._DownRepeat;
}

function _ScrollObjSetDownRepeatDelay(drd){
	this._SmoothDelay=drd;
	if(this._BtnObj) this._BtnObj.DownReapatDelay=drd;
}

function _ScrollObjGetDownRepeatDelay(){
	return this._SmoothDelay;
}

function _ScrollObjSetDownRepeatInterval(dri){
	this._SmoothInterval=dri;
	if(this._BtnObj) this._BtnObj.DownReapatInterval=dri;
}

function _ScrollObjGetDownRepeatInterval(){
	return this._SmoothInterval;
}

function _ScrollObjSetSmoothScroll(ss){
	if(ss!=this._SmoothScroll){
		this._SmoothScroll=ss;
		this._KillIntervals();
		if(this._BtnObj) {
			if(this._SmoothScroll) this._BtnObj.DownRepeat=false
			else this._BtnObj.DownRepeat=this._DownRepeat;
		}
	}
}

function _ScrollObjGetSmoothScroll(){
  return this._SmoothScroll;
}

function _ScrollObjDoScroll(index){
	if((index>=0)&&(index<=1)){
		var y;
		if(index==0) y=-this.ScrollStep
		else y=this.ScrollStep;
		y=this.ScrollElement.scrollTop+y;
		if(y<=0) {
			y=0;
			if(this._DoDisableButtons) this._BtnObj.SetEnabled(0,false);
		}
		else this._BtnObj.SetEnabled(0,true);
		if(y>=(this.ScrollElement.scrollHeight-this.ScrollElement.clientHeight)) {
			y=this.ScrollElement.scrollHeight-this.ScrollElement.clientHeight;
			if(this._DoDisableButtons) this._BtnObj.SetEnabled(1,false);
		}
		else this._BtnObj.SetEnabled(1,true);
		this.ScrollElement.scrollTop=y; 
		this._UpdateThumbPosition();
	}
}

function _ScrollObjKillIntervals(){
	if(this._IntervalId>=0) {
		clearInterval(this._IntervalId);
		this._IntervalId=-1;
	}
	if(this._ShortTimeoutId>=0) {
		clearTimeout(this._ShortTimeoutId);
		this._ShortTimeoutId=-1;
	}
}

function _ScrollObjEndTimeout(){
	this._ShortTimeoutId=-1;
	if((this._NowPressed<0)&&(this._IntervalId>=0)) {
		clearInterval(this._IntervalId);
		this._IntervalId=-1;
	}
}

function _ScrollObjStepInterval(index){
	this._DoScroll(index);
}

function _ScrollObjMouseEvent(eventindex,e){
  if((this._Thumb)&&(this._State & stDisabled)==0) {
	  if (!e) e = window.event;
		switch (eventindex) {
			case evMDown: if (!(this._State & stPressed)) this._Press(e.screenY); break;
			case evMUp: if (this._State & stPressed) this._Release(); break;
			case evMOver: if (!(this._State & stOver)) this._Enter(); break;
			case evMLeave: if (this._State & stOver) this._Leave(); break;
			case evMMove: if (this._State & stPressed) this._Move(e.screenY); break;
		}
	}
}

function _ScrollObjPress(screenY){
	this._State |= stPressed;
	this._Highlight(-1,statePressed);
	this._StartY=screenY;
	this._StartPosY=parseInt(this._Thumb.style.top);
	document.onmousemove = new Function('e',this.ObjName+'._MouseEvent(evMMove,e)');
	document.onmouseup=new Function('e',this.ObjName+'._MouseEvent(evMUp,e)');
	if(this._switchKhtmSelection){
		document.body.style.KhtmlUserSelect='none';
	}
}

function _ScrollObjMove(screenY){
  var h, top=screenY-(this._StartY-this._StartPosY);
	if(top<0) top=0;
	var ah=this._ThumbArea.offsetHeight;
//	var th=this._Thumb.offsetHeight;
	var th=this._ThumbHeight;
	if(top>(ah-th)) top=ah-th;
	this._Thumb.style.top=(top)+'px';
	this._ThumbScroll(top);
}

function _ScrollObjRelease(){
  document.onmousemove = null;
	document.onmouseup = null;
	if(this._switchKhtmSelection){
		document.body.style.KhtmlUserSelect='';
	}
	this._State &= ~stPressed;
	this._State &= ~stOver;
	this._Highlight(-1,stateNormal);
//	if(this._State & stOver) this._Highlight(-1,stateHighlighted);
}

function _ScrollObjEnter(){
	this._State |= stOver;
	if (!(this._State & stPressed)) this._Highlight(-1,stateHighlighted);
}

function _ScrollObjLeave(){
	var p=this._State & stPressed;
	if(p==0) {
		this._State &= ~(stOver + stPressed);
		this._Highlight(-1,stateNormal);
		if(p) this._Release();
	}
}

function _ScrollObjHighlight(index,state){
	if((index>=-1)&&(index<=1)){
		if(index<0) index=2;
		if(this.OnHighlight) {
			this.OnHighlight(index,state);
		}
	}
} 

function _ScrollObjUpdateThumbPosition(){
	if(this._Thumb){
    var top=Math.round(this.ScrollElement.scrollTop*this._ThumbRate);
		var ah=this._ThumbArea.offsetHeight;
	//	var th=this._Thumb.offsetHeight;
		var th=this._ThumbHeight;
		if(top>(ah-th)) top=ah-th;
		this._Thumb.style.top=(top)+'px';
//		this._ThumbScroll(top); 
	}
}

function _ScrollObjScrollRangeInView(y1,y2){
	var st;
	if(y1<this.ScrollElement.scrollTop){
		st=y1;
	}
	else if(y2>(this.ScrollElement.scrollTop+this.ScrollElement.clientHeight)){
		st=y2-this.ScrollElement.clientHeight;
	}
	this.ScrollElement.scrollTop=st;
	this.UpdateScrollArea(); 
}

function _ScrollObjIsRangeInView(y1,y2){
	var r=true;
	if(y1<this.ScrollElement.scrollTop){
		r=false;
	}
	else if(y2>(this.ScrollElement.scrollTop+this.ScrollElement.clientHeight)){
		r=false;
	}
	return r;
}

function _ScrollObjScrollInView(element){
	var pos=OffsetInParent(element,this.ScrollElement);
	if(pos.parentFound) {
		this.ScrollRangeInView(pos.y,pos.y+element.clientHeight);
	}
}

function _ScrollObjIsInView(element){
	var r=false;
	var pos=OffsetInParent(element,this.ScrollElement);
	if(pos.parentFound) {
		r=this.IsRangeInView(pos.y,pos.y+element.clientHeight);
	}
	return r;
}

function ScrollObj(buttons,thumb,scrollarea){
	//инициализация имени объекта
//	if(debugobj) dbg(debugobj.ScrollElement.id);
	this.ObjName="___ScrollObj"+(_ScrollObjObjCount++)+'_'+Math.floor(Math.random()*1024);
	eval(this.ObjName+"=this;");
	//инициализация полей
	this.debugMode=false;
	this.ScrollStep=10;
	this._SmoothDelay=500;
	this._SmoothInterval=100;
	this._SmoothScroll=false;
	this._DoDisableButtons=true;
	this._DownRepeat=true;
	this._NowPressed=-1;
	this._ShortTimeoutId=-1;
	this._IntervalId=-1;
	this.ScrollElement=document.getElementById(scrollarea);
	this._Thumb=null;
	this._ThumbArea=null;
	this._ThumbHeight=0;
	this._ThumbRate=1.0;
	this._switchKhtmSelection=false;
	this.OnSetThumbHeight=null;
	this.OnHighlight=null;
	this.UpdateScrollArea=_ScrollObjUpdateScrollArea;
	this.GetDisableButtons=_ScrollObjGetDisableButtons;
	this.SetDisableButtons=_ScrollObjSetDisableButtons;
	this.SetDownRepeat=_ScrollObjSetDownRepeat;
	this.GetDownRepeat=_ScrollObjGetDownRepeat;
	this.SetDownRepeatDelay=_ScrollObjSetDownRepeatDelay;
	this.GetDownRepeatDelay=_ScrollObjGetDownRepeatDelay;
	this.SetDownRepeatInterval=_ScrollObjSetDownRepeatInterval;
	this.GetDownRepeatInterval=_ScrollObjGetDownRepeatInterval;
	this.SetSmoothScroll=_ScrollObjSetSmoothScroll;
	this.GetSmoothScroll=_ScrollObjGetSmoothScroll;
	this.ScrollInView=_ScrollObjScrollInView;
	this.IsInView=_ScrollObjIsInView;
	this.ScrollRangeInView=_ScrollObjScrollRangeInView;
	this.IsRangeInView=_ScrollObjIsRangeInView;
	this.Scrolling=_ScrollObjScrolling;
	this._DoScroll=_ScrollObjDoScroll;
	this._KillIntervals=_ScrollObjKillIntervals;
	this._EndTimeout=_ScrollObjEndTimeout;
	this._StepInterval=_ScrollObjStepInterval;
	this._MouseEvent=_ScrollObjMouseEvent;
	this._Press=_ScrollObjPress;
	this._Move=_ScrollObjMove;
	this._Release=_ScrollObjRelease;
	this._Enter=_ScrollObjEnter;
	this._Leave=_ScrollObjLeave;
	this._Highlight=_ScrollObjHighlight;
	this._ThumbScroll=_ScrollObjThumbScroll;
	this._UpdateThumbPosition=_ScrollObjUpdateThumbPosition;
	//инициализация кнопок
	if(buttons && this.ScrollElement){
		this._BtnUp=_ScrollObjBtnUp;
 		this._BtnDn=_ScrollObjBtnDn;
		this._BtnObj=new MenuBarObj(buttons);
		this._BtnObj.OnHighlightIndex=new Function('index','state',this.ObjName+'._Highlight(index,state)');
		this._BtnObj.OnUp=new Function('index',this.ObjName+'._BtnUp(index)');
		this._BtnObj.OnDown=new Function('index',this.ObjName+'._BtnDn(index)');
		this._BtnObj.States=4;
		this._BtnObj.ButtonMode=true;
		this._BtnObj.DownRepeat=!this.SmoothScroll;
		this._BtnObj.DownRepeatDelay=this._SmoothDelay;
		this._BtnObj.DownRepeatInterval=this._SmoothInterval;
	}
	//инициализация ползунка
	if(thumb && this.ScrollElement){
	  var _thumb;
		if(thumb.constructor==String) _thumb=StringToArray(thumb)
		else _thumb=thumb;
		if(_thumb.length>1) {
			this._ThumbArea=document.getElementById(_thumb[0]);
			this._Thumb=document.getElementById(_thumb[1]);
			if(this._ThumbArea && this._Thumb){
				if(!this._Thumb.style.top) this._Thumb.style.top='0px';
			  //-------offsetHeight - правильный выбор!!!!----------------------
				this._ThumbHeight=this._Thumb.offsetHeight;
				if(_thumb.length>2) this._ThumbMinHeight=parseInt(_thumb[2])
				else this._ThumbMinHeight=this._Thumb.offsetHeight;
				this._State=0;
				this._Thumb.onmousedown=new Function('e',this.ObjName+'._MouseEvent(evMDown,e)');
//				this._Thumb.onmouseup=new Function('e',this.ObjName+'._MouseEvent(evMUp,e)');
				this._Thumb.onmouseover=new Function('e',this.ObjName+'._MouseEvent(evMOver,e)');
				this._Thumb.onmouseleave=new Function('e',this.ObjName+'._MouseEvent(evMLeave,e)');
				this._Thumb.onmouseout=new Function('e',this.ObjName+'._MouseEvent(evMLeave,e)');
//				this._Thumb.onmousemove=new Function('e',this.ObjName+'._MouseEvent(evMMove,e)');
				if(!DisableSelectAndDrag(this._Thumb)){
					if(document.body.style &&(typeof(document.body.style.KhtmlUserSelect)!="undefined")) { 
						this._switchKhtmSelection=true;
					}
				}
			}
			else this._Thumb=null;
		}
	}
//	if(debugobj) dbg(debugobj.ScrollElement.id);
//	this.UpdateScrollArea();
}
//------------------------------------------------

function DetectBrowser(){
	var agt=navigator.userAgent.toLowerCase();
  is_ie    = ((agt.indexOf("msie")!= -1) && (agt.indexOf("opera") == -1));
  is_khtml = (agt.indexOf('khtml')!= -1);
	is_opera = (agt.indexOf("opera")!= -1);
//	if(is_ie) alert('IE');
//	if(is_khtml) alert('KHTML');
}

DetectBrowser();


