/*
* Раскрывающийся DIV
* Автор: Alekson, Togliatti
*/
function Expander(){
	//global_expander=null;												//глобальная переменная в которой хранится текущий див
	this.class_id=Math.random().toString();
	this.class_id=this.class_id.substr(this.class_id.length-6,6);		//идентификатор класса, был нужен при отладке
	
	this.offset_height=0; 												//конечная высота div с контентом
	this.height=0;														//текущая высота div
	this.timer_id=0;													//идентификатор для отключения setInterval
	this.expander_status="open";										//состояние экспандера: open - раскрыт, close - закрыт
	this.in_process=0;													//состояние экспандера: 1 - просиходит изменение размера, на события не реагирует, 0 - ресайз завершен
	this.object_id=0;													//часть id div'a
	
	this.class_conteiner="ex_container";								//класс дива контейнера
	this.class_header_open="ex_header_open";							//класс дива заголовка открытого экспандера
	this.class_header_close="ex_header_close";							//класс дива заголовка закрытого экспандера
	this.class_content="ex_content";									//класс дива с контентом
	
	this.obj_content="";												//объект див заголовок
	this.obj_header="";													//объект див контент
	this.obj_self="";
	
	this.init=init;
	this.resize=resize;
	this.draw=draw;
	this.getClassId=getClassId;
	this.savePosition=savePosition;
	this.loadPosition=loadPosition;
	this.setCookie=setCookie;
	this.getCookie=getCookie;
	
	/*
	*	Отрисовка структуры экспандера
	*	_title - текст заголовка
	*	_content - контент экспандера
	*	_status - состояние экспандера (open,close)
	*	_step - шаг отрисовки за один период, px
	*	_time_interval - период изменения высоты, ms
	* 	_self - имя созданного экземпляра класса
	*/

	function draw(_title,_content,_status,_step,_time_interval,_self){
		this.obj_self=_self;
		this.step=_step;	//шаг прироста высоты в px
		this.time_interval=_time_interval; //интервал времени через котрое происходит увеличение высоты
		
		//ищем состояние в куках, если нет, то принимаем переданное
		if (this.loadPosition()==0) _status="close";
		if (this.loadPosition()==1) _status="open";
		
		document.write('<div id="expander_container_'+this.class_id+'" class="'+this.class_conteiner+'">');
		if (_status=="open"){
	  		document.write('	<div id="expander_header_'+this.class_id+'" onclick="'+this.obj_self+'.init();" class="'+this.class_header_open+'">'+_title+'</div>');			
		}
		else{
	  		document.write('	<div id="expander_header_'+this.class_id+'" onclick="'+this.obj_self+'.init();" class="'+this.class_header_close+'">'+_title+'</div>');			
		}
  		document.write('	<div id="expander_content_'+this.class_id+'" class="'+this.class_content+'">');
    	document.write('	</div>');
  		document.write('</div>');
		this.obj_content=document.getElementById("expander_content_"+this.class_id);
		this.obj_header=document.getElementById("expander_header_"+this.class_id);
		this.obj_content.innerHTML=_content;
		
		if (_status!="open" && _status!="close") _status="close";
		
		if (_status=="open"){
			this.expander_status="open";
			this.obj_content.style.display="block";
		}
		else{
			this.expander_status="close";
			this.obj_content.style.display="none";			
		}
	}

	/*
	*	Инициализация параметров и запуск ресайза
	*	id - уникальная часть id div'a на странице
	*/
	
	function init(){
		if (this.in_process==0){
			this.loadPosition();
			this.obj_content.style.visibility="hidden";
			this.obj_content.style.display="block";	
			
			if (this.offset_height==0){
				this.offset_height=this.obj_content.offsetHeight;
			}
			
			if (this.expander_status=="close"){
				this.step=Math.abs(this.step);
				this.height=0;
			}
			
			if (this.expander_status=="open"){
				this.step=this.step*(-1);
				this.height=this.offset_height;
			}

			this.obj_content.style.height=this.height+"px";
			this.obj_content.style.visibility="visible";
			this.in_process=1;
			if (this.expander_status=="close"){
				this.obj_header.className="ex_header_open";
			}

			eval("global_expander"+this.class_id+"=this");
			
			eval("this.timer_id=setInterval(function(){global_expander"+this.class_id+".resize();},this.time_interval);");
		}
	}
	
	
	function getClassId(){
		return this.class_id;
	}

	/*
	*	Изменение размера за один заданный интервал времени
	*/
	
	function resize(){
		this.height+=this.step;
		if (this.height>this.offset_height) this.height=this.offset_height;
		
		if (this.height<=0){
			this.height=0;
			this.obj_content.style.display="none";
			this.obj_content.style.height="1px";
		}
		else{
			this.obj_content.style.display="block";
			this.obj_content.style.height=this.height+"px";
		}

		if (this.expander_status=="open"){
			if (this.height<=0){
				clearInterval(this.timer_id);
				this.expander_status="close";
				this.obj_header.className="ex_header_close";
				this.in_process=0;
				this.savePosition(0);
			}
		}
		
		if (this.expander_status=="close"){
			if (this.height>=this.offset_height){
				clearInterval(this.timer_id);
				this.expander_status="open";
				this.obj_header.className="ex_header_open";
				this.in_process=0;
				this.savePosition(1);
			}
		}
	}
	
	function savePosition(value){
			this.setCookie(this.obj_self,value);
	}
	
	function loadPosition(){
			return this.getCookie(this.obj_self);
	}
	
	function setCookie (name, value, expires, path, domain, secure) {
    	document.cookie = name + "=" + escape(value) +
        	((expires) ? "; expires=" + expires : "") +
        	((path) ? "; path=" + path : "") +
        	((domain) ? "; domain=" + domain : "") +
        	((secure) ? "; secure" : "");
	}	
	
	function getCookie(name) {
		var cookie = " " + document.cookie;
		var search = " " + name + "=";
		var setStr = null;
		var offset = 0;
		var end = 0;
		if (cookie.length > 0) {
			offset = cookie.indexOf(search);
			if (offset != -1) {
				offset += search.length;
				end = cookie.indexOf(";", offset)
				if (end == -1) {
					end = cookie.length;
				}
				setStr = unescape(cookie.substring(offset, end));
			}
		}
		return(setStr);
	}
	
}	//end Expander


/* ПРИМЕР
*
*  	<script language="javascript">
*		ex1=new Expander();
*		ex1.draw("Заголовок1","Контент","close",20,20,"ex1");
*	</script>
*  
*/
