/*
       MENU  v1.0
     -------------

     Autor: Karol Wierzchołowski
    mailto: karol@wierzcholowski.net
       www: http://binboy.org
*/



/* -------------------------------------------------------------------------- */
var KatalogIMG         = 'img/';						//katalog z rysunkami
var KolorTlaAktywny    = '#dde6ed';					//kolor tła podświetlanego elementu
var KolorAktywny       = 'orange';					//kolor liter podświetlanego elementu
var KolorTlaNieAktywny = '';							//kolor tła nieaktywnego elementu
var KolorNieAktywny    = 'orange';					//kolor liter nieaktywnego elementu

//jeśli nie używamy przeglądarki Internet Explorer...
if (navigator.userAgent.toLowerCase().indexOf('msie')<0)
{
  var BorderNieAktywny   = '0px';	//obramowanie gdy element jest nieaktywny
  var BorderAktywny      = '0px';			//obramowanie gdy element jest aktywny
} else
{
  var BorderNieAktywny   = '0px';								
  var BorderAktywny      = '0px';   
}
/* -------------------------------------------------------------------------- */
var Rozwiniete=null;					// ostatnio rozwinięte menu
var OstatnioWMenu=null;				// menu z ostatnio wybranym elementem
var OstatnioElement=null;			// ostatnio wybrany element
var timerID=0;							
/* -------------------------------------------------------------------------- */
var GloablID=0;
function NowyID() { return (++GloablID); }
/* -------------------------------------------------------------------------- */

//----------------- pobranie pozycji X elementu --------------------------------
function PozycjaX(o)
{
  var lewa = 0;
  if (o.offsetParent)
  {
    while (o.offsetParent)
    {
      lewa += o.offsetLeft
      o = o.offsetParent;
    }
  } else if (o.x) lewa += o.x;
  return lewa;
}

//------------- pobranie pozycji Y elementu ------------------------------------
function PozycjaY(o)
{
  var gora = 0;
  if (o.offsetParent)
  {
    while (o.offsetParent)
    {
      gora += o.offsetTop
      o = o.offsetParent;
    }
  } else if (o.y) gora += o.y;
  return gora;
}

//******************************************************************************
//******************************************************************************
//******************************************************************************

//-------------------- podświetlenie elementu ----------------------------------
function TElementPodswietl()
{
   //podswietlając coś... odświetlamy wszystko u rodzica
	this.Rodzic.OdznaczWszystko();  
	 
 	//znajdujemy ten element w hierarchii DOM
   var n=document.getElementById('MenuElement_'+this.Id);

   //zmieniamy style wybrane menu
   n.style.backgroundColor=KolorTlaAktywny;				//zmieniamy jego kolor tła
   n.style.color=KolorAktywny;								//zmieniamy jego kolor liter
   n.style.border=BorderAktywny;								//zmieniamy jego ramkę	
}

//------------ odświetlamy element ---------------------------------------------
function TElementOdswietl()
{
 	//znajdujemy ten element w hierarchii DOM
   var n=document.getElementById('MenuElement_'+this.Id);		//pobieramy "uchwyt" do tego elementu w hierarchii DOM
 
   //zmieniamy style
   n.style.backgroundColor=KolorTlaNieAktywny;		//przywracamy kolor tla
   n.style.color=KolorNieAktywny;						//przywracamy kolor liter
   n.style.border=BorderNieAktywny;						//przywracamy obramowanie
}

//------------ element staje się aktywny ---------------------------------------
function TElementAktywne()
{  
   var em=this.Rodzic;								               //menu rodzica
   
   //znajdujemy ten element w hierarchii DOM
   var n=document.getElementById('MenuElement_'+this.Id);	
    
   //jak jakiś element staje się aktywny, to
	//wyłączamy stoper, który zamyka wszystkie menu 
   clearTimeout(timerID);

   //w zmiennej Rozwiniete zapamietujemy zawsze numer ID ostatnio rozwiniętego menu
   //jesli wiec Rozwiniete!=null (coś się rozwinęło) oraz numer ID rozwiniętego menu
	//jest różne od numer ID menu, w którym jesteśmy - zamykamy ostatnio rozwinięte menu  
   if (Rozwiniete && em.Id!=Rozwiniete.Id) 
	{	   
   	Rozwiniete.ZamknijMenu();
   	
      Rozwiniete=em;					//teraz rozwinięte jest menu aktualne
      if (!em.Stan) 					//jeśli to menu główne... zamykamy i odznaczamy wszystko
		{
		   Menu.ZamknijWszystkieMenu();		
		   Menu.OdznaczWszystko();
      }
	}

   //podświetlamy element
   this.Podswietl();
 
   //element jest w innym menu niż poprzednio... trzeba więc
   //w tym poprzednim menu zaznaczyć element aktywny, gdyż sam się odznaczył 
   if (OstatnioWMenu && OstatnioWMenu.Id!=em.Id && em.Stan) 
	{
	   var m=Menu.ZnajdzElement(OstatnioElement);
	   if (m) m.Podswietl();
   }
   OstatnioElement=this.Id;
   OstatnioWMenu=em;



 
   //jeśli element, który jest aktywny, ma przypisane menu - rozwijamy je... 
   if (this.Menu!=null)
   {
     //zapamiętujemy noworozwinięte menu    
     Rozwiniete=this.Menu;
   
     //pobieramy "uchwyt" do tego menu w hierarchii DOM
     var m=document.getElementById('Menu_'+this.Menu.Id);
     
     //pobiramy współrzędne elementu, który jest aktywny
     var x=PozycjaX(n);
     var y=PozycjaY(n);

     //w zależności od tego, jakiego rodzaju jest to menu, zmieniamy trochę współrzędne     
     if (em.Typ==1) //menu pionowe
     {
        x+=n.offsetWidth-15;	//przesuwamy je o szerokość elementu które wybraliśmy
        y+=2;
	  } else  //menu poziome
	  {
        y+=n.offsetHeight;		//przesuwamy je o wysokość elementu, który wybraliśmy	     
	  }

     //zmieniamy style menu, które wyświetlamy
     m.style.left=x+'px';
     m.style.top=y+'px';
     m.style.display="block";
   }     
}


//--------------- element przestaje być aktywny --------------------------------
function TElementNieAktywne()
{
   //odświetlamy element
   this.Odswietl(); 
   
   //uruchamiamy stoper... za 200 ms mamy zamknąć wszystkie menu,
   //chyba, że wybierze się nowy element... wtedy nie
   timerID  = setTimeout("Menu.ZamknijWszystkieMenu()", 200);         
}

//---------------- wyświetlenie elementu menu ----------------------------------
function TElementPokaz(Typ,Klasa)
{
  if (Typ==1) m='V'; else m='H';

  if (this.Ikona!='') ikona='<img border="0" src="'+KatalogIMG+this.Ikona+'" width="10" height="10" align="middle" />'; 
                 else ikona='<img border="0" src="'+KatalogIMG+'p.gif" width="10" height="10" align="middle" />';
		
  if (Typ==1) ikona=ikona+'&nbsp;&nbsp;';

  if (this.Menu!=null && Typ==1) 
    		t='<span style="position: relative;left:140px;"><img border="0" src="'+KatalogIMG+'p.gif" align="right"/></span>'; 
    else t='';

  if (this.Menu!=null && Typ==0) 
    		t='<span style="position: absolute; height: 10px; margin-top: 2px; margin-right: 2px;"><img border="0" src="'+KatalogIMG+'nav.jpg" valign="center" align="right"/></span>'; 
    else t='';
      
  S='<a style="border: '+BorderNieAktywny+';"'+
  ' id="MenuElement_'+this.Id+'" href="'+this.Adres+'"'+
  ' class="'+Klasa+'Element'+m+'"'+
  ' onmouseover="Menu.Aktywny('+this.Id+');" onmouseout="Menu.NieAktywny('+this.Id+');">'+
  t+ikona+this.Tytul+
  '&nbsp;</a>';
		  
  //if (Typ==0) S=S+'&nbsp;';

  document.write(S);    
}

//-------- TElement - obiekty pojedynczych elementów menu --------
function TElement(tytul,adres,ikona,menu)
{
  this.Id=NowyID();							//każdy element ma swój unikalny numer ID
  this.Tytul=tytul;							//każdy element ma też swój tytuł
  this.Adres=adres;							//adres odnośnika
  this.Ikona=ikona;							//ikonę
  this.Menu=menu;   							//może też mieć przypisane menu podrzędne
  this.Rodzic=null;                    //no i menu rodzica
  
  this.Aktywne=TElementAktywne;			//element staje się aktywny
  this.NieAktywne=TElementNieAktywne;  //element staje się nieaktywny
  this.Podswietl=TElementPodswietl;		//podświetlenie menu
  this.Odswietl=TElementOdswietl;		//odświetlenie menu
  this.Pokaz=TElementPokaz;				//wyświetlenie elementu
}
//******************************************************************************
//******************************************************************************
//******************************************************************************

//---------------------- zamykamy menu -----------------------------------------
function TPodMenuZamknijMenu()
{
	//pobieramy "uchwyt" do tego menu w hierarchii DOM 
   var n=document.getElementById('Menu_'+this.Id);

   //ukrywamy
   n.style.display="none";
   
   //odznaczamy wszystko
   this.OdznaczWszystko();
	   
   //kasujemy numer ID rozwiniętego menu
   Rozwiniete=null;
}

//------------------- dodanie nowego elementu ----------------------------------
function TPodMenuDodajElement(e)
{
  e.Rodzic=this;					//zanim dodamy, zapamietujemy w nim rodzica
  this.Elementy.push(e);
}

//------------- wyswietlenie pojedynczego menu ---------------------------------
function TPodMenuPokaz(x,y,z,disp)
{  
   document.write('<span id="Menu_'+this.Id+'" class="'+this.Klasa+'" style="top: '+y+'px; left: '+x+'px; z-index: '+z+';display: '+disp+'">');  
   for (var i=0;i<this.Elementy.length;i++)
   {
      var e=this.Elementy[i];   
      e.Pokaz(this.Typ,this.Klasa);      
	}
   document.write('</span>');
}

//------------- szukanie elementu w menu - po numerze id -----------------------
function TPodMenuZnajdzElement(id)
{
  for (var i=0;i<this.Elementy.length;i++)
     if (this.Elementy[i].Id==id) return this.Elementy[i];
  return null;
}

//------------- odznaczenie wszystkich elementów w tym menu --------------------
function TPodMenuOdznaczWszystko()
{
  for (var i=0;i<this.Elementy.length;i++)
     this.Elementy[i].Odswietl();
}

//------------- obiekt TPodMenu - to pojedyncze menu ---------------------------
function TPodMenu(typ,klasa,stan)
{
   this.Id=NowyID();								      //każde menu ma swój numer ID
   this.Typ=typ;											//typ menu - poziome/pionowe
   this.Stan=stan;										//stan menu
   this.Klasa=klasa;										//klasa menu (style CSS)
   this.Elementy=new Array();					      //lista elementów menu
   
   this.DodajElement=TPodMenuDodajElement;      //dodanie nowego elementu do menu
   this.ZnajdzElement=TPodMenuZnajdzElement;    //szukanie elementu w menu (po numerze ID)
   this.OdznaczWszystko=TPodMenuOdznaczWszystko;//odznaczenie wszystkich elementów w tym menu
   this.ZamknijMenu=TPodMenuZamknijMenu;        //zamknięcie tego menu
   this.Pokaz=TPodMenuPokaz;						   //wyswietlenie menu
}
//******************************************************************************
//******************************************************************************
//******************************************************************************

//------------- odznaczenie wszystkich elementów -------------------------------
function TMenuOdznaczWszystko()
{
  for (var i=0;i<Menu.Lista.length;i++)
     Menu.Lista[i].OdznaczWszystko();
}


//--------- rejestrowanie nowego menu ------------------------------------------
function TMenuRejestruj(e)
{   
  this.Lista.push(e);
}

//---------- szukanie elementu w zarejestrowanych menu -------------------------
function TMenuZnajdzElement(id)
{
  for (var i=0;i<this.Lista.length;i++)
  {
     var el=this.Lista[i].ZnajdzElement(id);
     if (el!=null) return el;  
  }   
  return null; 
}

//--------------- element przestaje być aktywny --------------------------------
function TMenuNieAktywny(id)
{
   //parametr ID - to numer ID elementu, który przestaje być aktywny
   this.ZnajdzElement(id).NieAktywne();								    
}


//--------------- menu staje się aktywne ---------------------------------------
function TMenuAktywny(id)
{
   //parametr ID - to numer ID elementu, który staje się aktywny
   this.ZnajdzElement(id).Aktywne();								    
}

//---------- funkcja uruchamiana z opóźnieniem - ukrywa wszystkie menu ---------
function TMenuZamknijWszystkieMenu()
{
  for (var i=0;i<this.Lista.length;i++)
  {
     if (this.Lista[i].Stan) 
	    this.Lista[i].ZamknijMenu();      
  }  
  this.OdznaczWszystko();
}

//----------- klasa TMenu - zarządzanie menu -----------------------------------
function TMenu()
{
   this.Lista=new Array();							  // lista wszystkich menu
   
   this.Rejestruj=TMenuRejestruj; 				  //rejestracja nowego menu
   
	this.ZnajdzElement=TMenuZnajdzElement;		  //znajdowanie elementu w menu (po numerze ID)												   
	this.OdznaczWszystko=TMenuOdznaczWszystko;  //odznaczeniew szystkich opcji

	this.ZamknijWszystkieMenu=TMenuZamknijWszystkieMenu;  //zamknięcie wszystkich menu
	
	this.Aktywny=TMenuAktywny;						  //element staje się aktywny												   
	this.NieAktywny=TMenuNieAktywny;				  //element przestaje być aktywny												   											   
}

//---------- tworzymy egzemplarz Menu ------------------------------------------
Menu = new TMenu();

