function lists(vars)
{//скрипт выпадающих списков (прикручивает их к меню и определяет их поведение)
 var openers=[];//массив объектов-пунктов меню
 var lists=[];
 var startOpacity;
 
 function openClose(num,flag)
 {//собственно анимация
  if(lists[num].anim&&lists[num].anim!=flag)
   return;
  
  lists[num].currentHeight+=flag*15;
  if((flag==1&&lists[num].currentHeight+15<=lists[num].maxHeight)||(flag==-1&&lists[num].currentHeight-15>=0))
  {
   lists[num].obj.style.height=lists[num].currentHeight+'px';
   lists[num].obj.style.opacity=startOpacity+(1-startOpacity)*lists[num].currentHeight/lists[num].maxHeight;
   lists[num].obj.style.filter='alpha(opacity='+(100*startOpacity+100*(1-startOpacity)*lists[num].currentHeight/lists[num].maxHeight)+')';
   lists[num].timer=setTimeout(function(){openClose(num,flag);},20);
  }else
  {
   if(flag==1)
   {
    lists[num].obj.style.height=lists[num].maxHeight+'px';
	lists[num].obj.style.opacity=1;
	lists[num].obj.style.filter='alpha(opacity=100)';
   }else
	{
	 lists[num].obj.style.height='0px';
	 lists[num].obj.style.display='none';
	}
   lists[num].anim=0;
  }
 }
 
 var ar={ar1:[],ar2:[]};
 
 function overOut(e,anim,vis,color)
 {//вызывается при наведении/выведении мыши на области, где скрипт должен как-то среагировать
    var fromTarget=evt(e).relatedTarget.to;
	var toTarget=evt(e).relatedTarget.from;
    if(!vis)
	{
	 fromTarget=(browser.ie7||browser.ie8)?evt(e).relatedTarget.from:evt(e).relatedTarget.to;
	 toTarget=(browser.ie7||browser.ie8)?evt(e).relatedTarget.to:evt(e).relatedTarget.from;
	}
    var fromTo={
	 toItem:index(fromTarget,vars.cls),
	 toList:index(fromTarget,vars.list_cls),
	 fromItem:index(toTarget,vars.cls),
	 fromList:index(toTarget,vars.list_cls)
	};
    var x;
    var onTheItem=(fromTo.toItem!=-1&&fromTo.toItem==ar.ar1[fromTo.toItem]);
	var fromNowhere=(fromTo.fromItem==-1&&fromTo.fromList==-1);
	var fromNotTheItem=(fromTo.fromItem!=-1&&fromTo.fromItem!=fromTo.toItem);
	var fromNotTheList=(fromTo.fromList!=-1&&fromTo.fromList!=ar.ar2[fromTo.toItem]);
	
	var toItem=(onTheItem&&(fromNowhere||fromNotTheItem||fromNotTheList));
	
	var onTheList=(fromTo.toList!=-1);
	var fromNotTheItem=(fromTo.fromItem!=-1&&ar.ar2[fromTo.fromItem]!=fromTo.toList);
	var fromNotTheList=(fromTo.fromList!=-1&&fromTo.fromList!=fromTo.toList);
	
	var toList=(onTheList&&(fromNowhere||fromNotTheItem||fromNotTheList));
	if(toItem||toList)//если навели на один из пунктов меню и если у пункта есть список, или если навели на список
    {
     if(fromTo.toItem!=-1)//определение индекса списка, который надо показать
	  x=ar.ar2[fromTo.toItem];else
	  x=fromTo.toList;
	 if(vis) 
	  lists[x].obj.style.display='block';
	 if(lists[x].anim!=anim)
	 {
	  lists[x].anim=anim;
	  clearTimeout(lists[x].timer);
	  openClose(x,anim);
	 }
    }
	if(fromTo.toItem!=-1&&((vars.active)?openers[fromTo.toItem].id!=vars.active:true))//если навели (или увели) с элемента и его id не равен указанному
	 openers[fromTo.toItem].style.borderColor=color;
 }
 
 function events()
 {
  //ar1:измененный массив флагов для меню - вместо флагов-единиц стоят цифры, соответствующие позициям флагов; вместо нулей - -1
  //ar2:измененный массив флагов для меню - вместо флагов-единиц стоит числовой ряд, начинающийся с 0 с шагом +1; вместо нулей - -1
  for(var i=0,j=0;i<hasLists.length;i++)
   if(hasLists[i])
   {
    ar.ar1[i]=i;
	ar.ar2[i]=j;
	j++;
   }else
   {
	ar.ar1[i]=-1;
	ar.ar2[i]=-1;
   }
  document.onmouseover=function(e)
  {//наведение мыши на пункт/список
	if(browser.ie7||browser.ie8)
	 e=null;
	overOut(e,1,1,'#a7a8a8');
  };
  document.onmouseout=function(e)
  {//выведение мыши с пункта/списока
	if(browser.ie7||browser.ie8)
	 e=null;
	overOut(e,-1,0,'#d4d5d6');
  };
 }
 
 function collect()
 {//массив пунктов меню и выпадающих списков
  var t=de(vars.cont).getElementsByTagName('span');
  var j=0;
  for(var i=0;i<t.length;i++)
   if(t[i].className==vars.cls)
   {
    openers[j]=t[i];
	j++;
   }
   
  var t=de(vars.lists).getElementsByTagName('div');
  var j=0;
  for(var i=0;i<t.length;i++)
   if(t[i].className==vars.list_cls)
   {
    lists[j]={obj:t[i],maxHeight:0,anim:0,currentHeight:0,timer:null};
	j++;
   }
 }
 
 function posAndOp()
 {//ставим списки по вертикали в соответствии с левыми краями пунктов меню и присваиваем их свойству height их высоту
  var j=0,style;
  for(var i=0;i<hasLists.length;i++)
   if(hasLists[i])
   {
    var p=lists[j].obj;
    p.style.left=openers[i].getBoundingClientRect().left-de(vars.cont).getBoundingClientRect().left+'px';
	clr(p);
    p.style.height=p.lastChild.getBoundingClientRect().bottom-p.firstChild.getBoundingClientRect().top+'px';
	lists[j].maxHeight=parseInt(lists[j].obj.style.height);
	j++;
	
	p.style.visibility='visible';
	p.style.display='none';
   }
   
  style=lists[0].obj.currentStyle||getComputedStyle(lists[0].obj,null);
  startOpacity=parseFloat(style.opacity);
 }
 
 return {
  init:function()
  {
   vars.init({cont:vars.cont,line_cls:vars.line_cls,lists:vars.lists,list_cls:vars.list_cls});
   collect();
   events();
   posAndOp();
  }
 }
}

function initMenu(vars)
{
 clr(vars.cont);
 listLinesFix(vars.lists,vars.list_cls);
 if(browser.ie7||browser.ie8||browser.opera)
  ieOperaSpanFix(vars.cont,vars.line_cls);
 if(browser.ie7||browser.ie8)
  mod(vars.lists,vars.list_cls,0);
 if(browser.opera||browser.safari)
  mod(vars.lists,vars.list_cls,1);
}

function listLinesFix(cont,item)
{
 var itemsAr=[];
 fillAr(itemsAr,de(cont).getElementsByTagName('div'),item);
 var t;
 
 for(var j=0;j<itemsAr.length;j++)
 {
  t=itemsAr[j].getElementsByTagName('a');
  for(var i=0;i<t.length;i++)
  {
   t[i].onmouseover=function(i,j)
   {
    return function()
    {
     if(i)
	  itemsAr[j].getElementsByTagName('a')[i-1].getElementsByTagName('span')[1].style.display='none';
    }
   }(i,j);
   t[i].onmouseout=function(i,j)
   {
    return function()
    {
     if(i)
	  itemsAr[j].getElementsByTagName('a')[i-1].getElementsByTagName('span')[1].style.display='block';
    }
   }(i,j);
  }
 }
}

function menuFontSize(menu)
{
 de(menu).style.fontSize='21px';
}

function mod(cont,cls,f)
{
 var t=de(cont).getElementsByTagName('div');
 for(var i=0;i<t.length;i++)
  if(t[i].className==cls)
   switch(f)
   {
    case 0:t[i].style.top='43px';break;
	case 1:t[i].style.top='34px';
   }
}
