/*
 * smartfade v1.0, плагин к jQuery
 *
 * 1. Позволяет переключать fade-эффекты, не дожидаясь завершения предыдущего вызова
 * 2. позволяет использовать флаг permanent, что удобно при использовании событий
 *    mouseover/mouseout в сочетании с focus/blur
 *
 * Copyright © 2009 FTK (http://ftk.edu.ru)
 * All rights reserved.
*/

;(function($) {

	//массив для хранения доп.информации
	var smartfadeinfo = new Array();
	
	/*
	основная функция плагина 
		effect 		- эффект, который нужно преминить, возможные значения "in" и "out"
		permanent 	- флаг перманентности, возможные значения true и false (если ранее был вызов 
					$.fn.smartfade("in", true), то $.fn.smartfade("in", false) не даст никакого эффекта)
	*/
	
	$.fn.smartfade = function(effect, permanent) {
		function _initialize(object, effect, permanent) {
			//если у объекта не был задан id, присваиваем ему уникальное значение
			//if (object.id==undefined) object.id = currentTime.getSeconds()+""+currentTime.getMinutes()+""+currentTime.getHours();

			//определяем начальное значение прозрачности
			startValue = (smartfadeinfo[object.id+'-opacity']!==undefined) ? smartfadeinfo[object.id+'-opacity'] : 0;			
			
			//определяем конечное значение прозрачности с учетом выбранного эффекта
			endValue = (effect=="in")? 100 : 0;

			
			//определяем, нужно ли программировать эффект
			if (
					//если это первый вызов эффекта
					(smartfadeinfo[object.id+'-opacity']==undefined)||
					//или если текущий вызов является перманентным
					(permanent==true) ||
					//или если предыдущий вызов не был перманентным
					(smartfadeinfo[object.id+'-permanent']!==true)
				)
			{
				//программируем fade-эффект для объекта
				$.fn.smartfade.dofade(object.id, startValue, endValue, 5000, -1);
				
				//меняем статус флажка
				smartfadeinfo[object.id+'-permanent'] = ((effect=="in")&&(permanent==true));
			};
		};
		
		return this.each(function(e){_initialize(this, effect, permanent)});
	};

	//функция программирует fade-эффект
	$.fn.smartfade.dofade = function (id, opacStart, opacEnd, millisec, executeid) {
		//функция быстро меняет значение прозрачности
		function _setOpacity(opacity, id) {
			if (objectStyle = document.getElementById(id).style){
				//изменяем opacity с учетом различных браузеров
				objectStyle.opacity = (opacity / 100);
				objectStyle.MozOpacity = (opacity / 100);
				objectStyle.KhtmlOpacity = (opacity / 100);			
				objectStyle.filter = "alpha(opacity=" + opacity + ")";
				
			
				//если opacity>0, делаем объект видимым, иначе скрываем его
				objectStyle.visibility = (opacity>0) ? "visible" : "hidden";
				objectStyle.display = (opacity>0) ? "block" : "none";
			
			}
		
		};	
		
		//если это вызов функции "извне"
		if (executeid==-1) {
			executeid = Math.random();
			smartfadeinfo[id+'-executeid'] = executeid;
		}

		//если не было повторного вызова эффекта
		if (executeid == smartfadeinfo[id+'-executeid']){
			step = 15;
			direction = ((opacStart < opacEnd)? 1 : -1);
			
			//рассчитываем текущее значение с учетом того, 
			//что оно не должно быть больше конечного
			opacValue = opacStart + step * direction;
			if (opacValue*direction > opacEnd*direction) opacValue = opacEnd;
			
			//изменяем прозрачность
			_setOpacity(opacValue, id);
			//сохраняем значение в массиве
			smartfadeinfo[id + '-opacity'] = opacValue;
			
			//программируем повторный вызов функции
			if (opacStart!==opacEnd)
				setTimeout("$.fn.smartfade.dofade('" + id + "', " + opacValue + ", " + opacEnd + ", " + millisec + ", " + executeid + ")", Math.round(millisec / 100));
		}
	
	};	
})(jQuery);