// korekce zobrazeni popup menu // 050825 - http://marek.fiser.cz, mfiser@kabinet.cz // rekurzivni zjisteni polohy elementu na strance function topof(obj) { var y=0; if (obj.offsetParent) { y += obj.offsetTop + topof(obj.offsetParent); } return y; } function leftof(obj) { var x=0; if (obj.offsetParent) { x += obj.offsetLeft + leftof(obj.offsetLeft); } return x; } // funkce, ktera posune vetev menu nahoru, pokud zaliza za okraj obrazovky function corrector(menuid) { var bds, vph, mm, mmh, mmt, mmvt, mmnt; bds = scroff() - 30; // odrolovani stranky vph = qmvp(); // rozmer okna mm = document.getElementById(menuid); // toto je opravovana vetev menu mmt = topof(mm); // pozice vetve mmnt = mmt; // nova pozice vetve mmh = mm.clientHeight; //offsetHeight; // vyska vetve, lze zjistit az po zobrazeni! if (mmh > 0) { // jen pokud mam alespon nejaky udaj tak muzu pracovat mmvt = mmt - bds; // vyska menu vuci viewportu if ((mmvt + mmh) > vph) { // kontrola presahu viewportu mmnt = vph - mmh + bds; // vypocet pozice vetve tak, aby nezalizala za spodek viewportu mmnt = mmnt<0?0:mmnt; // osetreni prelezeni vrchem mimo okno, pak holt nebude viden ani spodek // Podminka pro uplne spravnou cinnost by musela byt mnohem slozitejsi. // Vetve si "pamatuji" upravenou pozici do reloadu! Musela by se nekde ukladat pozice puvodni a pripadne vracet. // Kdyby se odkazy vetve menu floatovaly, tak by se dala zmenit sirka vetve a odkazy by se presypalu! // MSIE nefunguje spolehlive, vysku vetve bere jen z clientHeight a obcas ji bere brzo; } mm.style.top = mmnt; // nova pozice menu } } // funkce podle http://www.quirksmode.org/viewport/ // Inner width // The inner dimensions of the window or frame. function qmvp() { var y; if (self.innerHeight) // all except Explorer { y = self.innerHeight; } else if (document.documentElement && document.documentElement.clientHeight) // Explorer 6 Strict Mode { y = document.documentElement.clientHeight; } else if (document.body) // other Explorers { y = document.body.clientHeight; } return y; // potrebuju jen y } // Scrolling offset // How much the page has scrolled. function scroff() { var y; if (self.pageYOffset) // all except Explorer { y = self.pageYOffset; } else if (document.documentElement && document.documentElement.scrollTop) // Explorer 6 Strict { y = document.documentElement.scrollTop; } else if (document.body) // all other Explorers { y = document.body.scrollTop; } return y; // potrebuju jen y }