/*	Изменение прозрачности элементов (тестовый вариант).
 *
 *	Автор : AKS (aksus-69@yandex.ru). 
 *	Сценарий тестировался в IE6, Opera7+, Gecko/20040113+ (Windows XP). 
 *
 *	Функция opacityChanger позволяет создавать объекты, имеющие  
 *	набор свойств и методов, необходимый для управления прозрачностью  
 *	элементов страницы.
 */

var compatBrowser = new function() { 
  var agent = navigator.userAgent; 
  var opr = new RegExp("opera\/*\\s*(\\d+\\.?\\d*)", "i");
  var ie = new RegExp("msie\\s*(\\d+\\.?\\d*)", "i"); 
  this.moz = /gecko/i.test(agent) && /netscape/i.test(navigator.appName) && navigator.productSub >= 20040113; 
  this.op9 = opr.test(agent) && Number(RegExp["$1"]) >= 9;  
  this.ie6 = !opr.test(agent) && ie.test(agent) && Number(RegExp["$1"]) >= 6; 
  this.only = this.moz || this.op9 || this.ie6; 
} 

function opacityChanger(elem, stop, step, speed) { 
  var c = this.constructor;  

  if(typeof(c.protoSet) == "undefined") { 

    c.prototype.makeTrans = function(o, b, s) { 
      if(b && this.opacity + s < this.stop || !b && this.opacity + s > this.start) { 
	this.opacity += s; 
        if(compatBrowser.ie6) { 
          this.style[this.prop] = "alpha(opacity=" + this.opacity + ");" 
        } 
        else { this.style[this.prop] = this.opacity/100; } 
        this.timer = setTimeout(function() { o.makeTrans(o, b, s); }, this.speed); 
      } 
      else { 
        if(this.single) { this.phase = !this.phase; } 
        (this.single && !this.phase) ? this.makeTrans(o, !b, -s) : this.stopTrans(b); 
      } 
    } 
  
    c.prototype.stopTrans = function(b) { 
      var stop = (b) ? this.stop : this.start, fix = (compatBrowser.moz && !this.mode && b) ? 0.01 : 0;
      this.style[this.prop] = (compatBrowser.ie6) ? "alpha(opacity=" + stop + ")" : (stop - fix)/100; 
    } 

    c.prototype.setOn = function(b) { 
      if(this.timer) { clearTimeout(this.timer); } 
      var bool, step; 
      if(b) {
        this.step = (this.step ? this.step : 2);
        this.speed = (this.speed ? this.speed : 1);
        if(this.single) this.phase = true; 
        bool = !this.mode;  
        step = (this.mode) ? -this.step : this.step; 
        this.makeTrans(this, bool, step); 
      } 
      else {
        bool = this.mode;  
        step = (this.mode) ? this.step : -this.step; 
        this.makeTrans(this, bool, step); 
      } 
    } 
    
    c.prototype.getStyle = function() { 
      if(compatBrowser.ie6) { 
        var re = new RegExp("opacity\\s*=\\s*(\\d+)", "i");  
        var prop = this.elem.currentStyle["filter"]; 
        return (re.test(prop)) ? Number(RegExp["$1"]) : 100;  
      } 
      else { 
        var prop = (compatBrowser.moz) ? ((!this.style.opacity) ? "-moz-opacity" : "opacity") : "opacity"; 
        var value = document.defaultView.getComputedStyle(this.elem, null).getPropertyValue(prop); 
        return value*100; 
      } 
    } 
    
    c.prototype.setParams = function(elem, stop, step, speed) { 
      this.elem = elem; 
      this.style = elem.style; 
      this.timer = null; 
      this.phase = false; 
      this.step = step;
      this.speed = speed;
      this.opacity = this.getStyle(); 
      this.mode = (this.opacity > stop) ? true : false; 
      this.start = Math.min(this.opacity, stop); 
      this.stop = Math.max(this.opacity, stop); 
      this.prop = (compatBrowser.ie6) ? "filter" : (compatBrowser.moz) ? 
        ((!this.style.opacity) ? "MozOpacity" : "opacity") : "opacity"; 
    } 
  } 	
  c.protoSet = true; 
  this.setParams(elem, stop, step, speed); 
}

var changers = new Array();
var opacityIsSet = false;

opacityChanger.options = {stop : 100, 
								step : 1,
								speed : 20};

opacityChanger.indexPageLoader=function()
{
	navigationElement = document.getElementById ? document.getElementById("navigation") : document.all.navigation;
	liElements = navigationElement.getElementsByTagName("li");
	if(compatBrowser.only)
	{ 
		for(var i = 0; i < liElements.length; i++)
		{
    		changers[i] = new opacityChanger(liElements[i], opacityChanger.options.stop, opacityChanger.options.step, opacityChanger.options.speed);
		}
	}
	else
	{
		for(var i = 0; i < liElements.length; i++)
			liElements[i].style.display = 'block';
	}
}

opacityChanger.catalogPageLoader=function()
{
	trueContainerElement = document.getElementById ? document.getElementById("trueContainer") : document.all.trueContainer;
	if (compatBrowser.ie6)
		aElements = trueContainerElement.getElementsByTagName("img");	
	else
		aElements = trueContainerElement.getElementsByTagName("a");
	
	if(compatBrowser.only)
	{
		for(var i = 0; i < aElements.length; i++)
		{
    		aElements[i].onmouseover = opacityChanger.onMouseOverCatalog;
    		aElements[i].onmouseout = opacityChanger.onMouseOutCatalog;
    		aElements[i].onclick = opacityChanger.onClickCatalog;
		}
	}
}

opacityChanger.onMouseOverCatalog=function()
{
	trueContainerElement = document.getElementById ? document.getElementById("trueContainer") : document.all.trueContainer;
	
	imgElement = null;
	if (compatBrowser.ie6)
	{
		aElements = trueContainerElement.getElementsByTagName("img");
		if ("A" == this.tagName)
			imgElement = this.getElementsByTagName("img")[0];
	}
	else
		aElements = trueContainerElement.getElementsByTagName("a");
	
	imageScroll = null;
	if (-1 != currentImage)
		imageScroll = document.getElementById ? document.getElementById("imageScroll" + currentImage) : eval("document.all.imageScroll" + currentImage);
		
	if(compatBrowser.only)
	{
		for(var i = 0; i < aElements.length; i++)
		{
			if (compatBrowser.ie6)
				aElements[i].parentNode.onclick = opacityChanger.onClickCatalog;
			else
				aElements[i].onclick = opacityChanger.onClickCatalog;
				
    		if (this == aElements[i] || ((null != imgElement) && (this == imgElement.parentNode) && (imgElement == aElements[i])))
    		{
    			if (this.getElementsByTagName("img")[0] != imageScroll)
				{
					if (!changers[i])
					{
						changers[i] = new opacityChanger(aElements[i], opacityChanger.options.stop, opacityChanger.options.step, opacityChanger.options.speed);
					}
					else if (changers[i].elem != aElements[i])
					{
						delete changers;
						changers = new Array();
						changers[i] = new opacityChanger(aElements[i], opacityChanger.options.stop, opacityChanger.options.step, opacityChanger.options.speed);
					}
					changers[i].setOn(true);
				}
    		}
		}
	}
}

opacityChanger.onMouseOutCatalog=function()
{
	trueContainerElement = document.getElementById ? document.getElementById("trueContainer") : document.all.trueContainer;
	imgElement = null;
	if (compatBrowser.ie6)
	{
		aElements = trueContainerElement.getElementsByTagName("img");
		if ("A" == this.tagName)
			imgElement = this.getElementsByTagName("img")[0];
	}
	else
		aElements = trueContainerElement.getElementsByTagName("a");
	
	imageScroll = null;
	if (-1 != currentImage)
		imageScroll = document.getElementById ? document.getElementById("imageScroll" + currentImage) : eval("document.all.imageScroll" + currentImage);
		
	if(compatBrowser.only)
	{
		for(var i = 0; i < aElements.length; i++)
		{
    		if (this == aElements[i] || ((null != imgElement) && (this == imgElement.parentNode) && (imgElement == aElements[i])))
    		{
    			if ((this.getElementsByTagName("img")[0] != imageScroll && !compatBrowser.ie6) || (compatBrowser.ie6 && (this != imageScroll)))
    			{
					if (!changers[i])
    					changers[i] = new opacityChanger(aElements[i], opacityChanger.options.stop, opacityChanger.options.step, opacityChanger.options.speed);
    				
					if (aElements[i] != imageScroll)
						changers[i].setOn(false);
				}
    		}
		}
	}
}

opacityChanger.onClickCatalog=function()
{
	attrClass = document.createAttribute("class");
	attrClass.value = "";
	
	imageScroll = null;
	if (-1 != currentImage)
		imageScroll = document.getElementById ? document.getElementById("imageScroll" + currentImage) : eval("document.all.imageScroll" + currentImage);
	imageScroll.setAttributeNode(attrClass);
	
	trueContainerElement = document.getElementById ? document.getElementById("trueContainer") : document.all.trueContainer;
	imgElement = null;
	if (compatBrowser.ie6)
	{
		aElements = trueContainerElement.getElementsByTagName("img");
		if ("A" == this.tagName)
			imgElement = this.getElementsByTagName("img")[0];
		else
			imgElement = this;
	}
	else
		aElements = trueContainerElement.getElementsByTagName("a");
		
	if(compatBrowser.only)
	{
		for(var i = 0; i < aElements.length; i++)
		{
			if (this == aElements[i] || ((null != imgElement) && (this == imgElement.parentNode) && (imgElement == aElements[i])))
    		{
    			if (!changers[i])
				{
					delete changers[i];
					changers[i] = new opacityChanger(aElements[i], opacityChanger.options.stop, opacityChanger.options.step, opacityChanger.options.speed);
					changers[i].setOn(true);
				}
				else if (changers[i].elem != aElements[i])
				{
					delete changers[i];
					changers[i] = new opacityChanger(aElements[i], opacityChanger.options.stop, opacityChanger.options.step, opacityChanger.options.speed);
					changers[i].setOn(true);
				}
    			else
    			{
    				changers[i].setOn(true);
    			}
    		}
    		else
    		{
    			if (!changers[i])
				{
					changers[i] = new opacityChanger(aElements[i], opacityChanger.options.stop, opacityChanger.options.step, opacityChanger.options.speed);
					if (99 < changers[i].getStyle())
					{
						changers[i] = new opacityChanger(aElements[i], 30, opacityChanger.options.step, opacityChanger.options.speed);
						changers[i].setOn(true);
						delete changers[i];
					}
					else
						changers[i].setOn(false);
				}
				else if (changers[i].elem != aElements[i])
				{
					delete changers[i];
					changers[i] = new opacityChanger(aElements[i], opacityChanger.options.stop, opacityChanger.options.step, opacityChanger.options.speed);
					changers[i].setOn(false);
				}
    			else
    			{
    				changers[i].setOn(false);
    			}
    		}
		}
	}
}
