vb2dvy7n=xppr('2dvy7_0.png');vb2dvy7o=xppr('2dvy7_1.png');vb2dvy7c=xppr('2dvy7_2.png');vbtdvy7n=xppr('tdvy7_0.png');vbtdvy7o=xppr('tdvy7_1.png');vbtdvy7c=xppr('tdvy7_2.png');vbpdvy7n=xppr('pdvy7_0.png');vbpdvy7o=xppr('pdvy7_1.png');vbpdvy7c=xppr('pdvy7_2.png');vbodvy7n=xppr('odvy7_0.png');vbodvy7o=xppr('odvy7_1.png');vbodvy7c=xppr('odvy7_2.png');/* *============================================================================== * * Copyright (c) 2007-2009, by Vista-buttons.com * Version 2.1.2i * http://vista-buttons.com * *============================================================================== * * todo: * - item move into anchor * - item over using css * - item base on li structure * * variables: * @btIdPref * @pItem * @ulIdPref * @frameSubmenu * */ var btIdPref='vb'; function xppr(im) { var i=new Image(); i.src=vbImgPath+'bt'+im; return i; }; function xpe(id) { x=id.substring(0,id.length-1); if(document[btIdPref+x])document[btIdPref+x].src=eval(btIdPref+id+'.src'); }; /* * Vista buttons engine functions */ function vistaButtons(params){ // init global vars var xobtn = null; // curent element text identifier curent var menuContId = 'xpMenuCont'; var ulIdPref='vbUL_'; //Detect browser var isDOM=document.getElementById; //DOM1 browser (MSIE 5+, Netscape 6, Opera 5+) var isOp=isO5=window.opera && isDOM; //Opera 5+ var isOp7=isOp && document.readyState; //Opera 7+ var isIE=document.all && document.all.item && !isOp; //Microsoft Internet Explorer 4+ var isMz=isDOM && navigator.appName=="Netscape"; //Mozilla or Netscape 6.* /* * vistabuttons engine and global object */ /* create new menu and insert it to page */ document.write(''); var menuCont = document.getElementById(menuContId); var ULs = document.getElementsByTagName('UL'); for (var i=0, cnt=ULs.length; i * * * * * * * ... *
* * @ulParent - main parent of menu UL * @iParent - parent item * @level - level */ function createMenu(ulParent, iParent, level, params, owner){ // create menu obj var oMenu = document.createElement((params.subFrame?'table':'div')); owner.appendChild(oMenu); if (oMenu.tagName == 'TABLE') oMenu.cellSpacing = 0; // set even if don't need in concert // assign menu content and crate a frame if need var oMenuCont; if (params.subFrame) for (var i=0; i<3; i++){ var row = oMenu.insertRow(-1); for (var j=0; j<3; j++){ var cell = row.insertCell(-1); if (i==1 && j==1) oMenuCont = cell else cell.className = 'imgFrame'+i+j; } } else oMenuCont = (oMenu.tagName == 'DIV')? oMenu: oMenu.insertRow(-1).insertCell(-1); oMenuCont.className = 'subContent'; var oTable = document.createElement('table'); oMenuCont.appendChild(oTable); oMenu.id = ulParent.id + 'tbl'; oMenu.className = ulParent.className; // inherite style from menu definition with ul //oTable.style.visibility = 'hidden'; oMenu.style.position = 'absolute'; // set here without fail oMenu.xpItems = []; /* submenu items list */ oMenu.iParent = iParent; oMenu.level = level; oMenu.style.zIndex = 9 + oMenu.level; oTable.cellSpacing = 0; // set menu events and metods oMenu.onmouseover = function (){ xpStopTimeOut(this); }; oMenu.onmouseout = function (){ xpStartTimeOut(xpShownMenu) }; oMenu.xpClearMenuMark = function(){ for (var j = 0; j < this.xpItems.length; j++){ var p = this.xpItems[j]; if (p.tagName == 'TR') { p.className = p.className.replace('over',''); if (p.className.indexOf('popup')<0) p.clrOverImg(); } }; }; oMenu.smShown = 0; /* create items - organizing circle for LI */ for (var i=0, cntLI=ulParent.childNodes.length; i Item Label var InnerAnchor = 0; oItem.Img = null; oItem.ImgOver = null; var InnerUl = 0; oItem.ImgArrow = null; oItem.ImgArrowOver = null; // parse LI content for (var j=0; j < oLI.childNodes.length; j++) if (oLI.childNodes[j].tagName == 'A') InnerAnchor = oLI.childNodes[j]; else if (oLI.childNodes[j].tagName == 'IMG'){ if (!InnerAnchor){ if (!oItem.Img) oItem.Img = oLI.childNodes[j]; else oItem.ImgOver = oLI.childNodes[j] } else { if(!oItem.ImgArrow) oItem.ImgArrow = oLI.childNodes[j]; else oItem.ImgArrowOver = oLI.childNodes[j] } } else if (oLI.childNodes[j].tagName == 'UL') InnerUl = oLI.childNodes[j]; else if (oLI.childNodes[j].tagName == 'DIV'){ for (var k=0; k=0 && document.all) oTDLabel.appendChild(newText) else{ oTDLabel.appendChild(InnerAnchor); // off standart click InnerAnchor.onclick = function(){ return false; }; }; oItem.linkHref = InnerAnchor.href; oItem.linkTarget = InnerAnchor.target; /* add item to menu info */ with(oMenu) xpItems[xpItems.length] = oItem; // define my click handle event oItem.onclick = function(){ if (this.linkHref) open(this.linkHref, (this.linkTarget? this.linkTarget :"_self")); } } else oTDLabel.innerHTML = ' '; // set item events oItem.onmouseover = function (){ // clear other mark this.menu.xpClearMenuMark(); this.className += ' over';// mark this item if (this.ImgOver){ this.Img.style.display = 'none'; this.ImgOver.style.display = 'inline'; }; if (this.ImgArrowOver){ this.ImgArrow.style.display = 'none'; this.ImgArrowOver.style.display = 'inline'; }; if (this.smPopup) xpshowmenu(this.smPopup, 1, this); // show new menu else xpStartTimeOut(this.menu.smShown); // hide bug }; oItem.onmouseout = function (){ this.menu.xpClearMenuMark(); }; // define submenu if (InnerUl){ // set event for over oTDArrow.className = 'arrow'; if (oItem.ImgArrow){ oTDArrow.appendChild(oItem.ImgArrow); if (oItem.ImgArrowOver){ oItem.ImgArrowOver.style.display = 'none'; oTDArrow.appendChild(oItem.ImgArrowOver) } } else { if (typeof(arrowChar)!='undefined' && arrowChar){ oTDArrow.appendChild(document.createElement('a')); oTDArrow.lastChild.innerHTML = arrowChar; } else oTDArrow.innerHTML = ' '; }; oItem.smPopup = createMenu(InnerUl, oItem, level + 1, params, owner); } else oTDArrow.innerHTML = ' '; } else{ // add a separator oItem.className = 'separator'; var oTD = oItem.insertCell(-1); oTD.colSpan = 3; oTD.innerHTML = '
'; } } return oMenu; }; function xpDef(){ for(var i=0; iwin.innerWidth) h-=16; }; //width if(cond && doc.documentElement.clientWidth) w=doc.documentElement.clientWidth; else if(doc.body && doc.body.clientWidth) w=doc.body.clientWidth; else if(xDef(win.innerWidth,win.innerHeight,doc.height)) { w=win.innerWidth; if(doc.height>win.innerHeight) w-=16; } if(doc.documentElement && doc.documentElement.scrollLeft) x=doc.documentElement.scrollLeft; else if(doc.body && xpDef(doc.body.scrollLeft)) x=doc.body.scrollLeft; if(doc.documentElement && doc.documentElement.scrollTop) y=doc.documentElement.scrollTop; else if(doc.body && xpDef(doc.body.scrollTop)) y=doc.body.scrollTop; return {x:x,y:y,w:w,h:h}; }; function xpObjectSize(o){ var w = (isOp&&!isOp7) ? o.style.pixelWidth : document.layers ? o.clip.width /* Netscape 4.*/ : o.offsetWidth; var h = (isOp&&!isOp7) ? o.style.pixelHeight : document.layers ? o.clip.height/* Netscape 4.*/ : o.offsetHeight; return {x:w, y:h}; }; /* * calc absolute coordinates of specified object */ function xppos(obj){ var l=0, t=0; while (obj) // && obj.tagName!='BODY' { l += obj.offsetLeft; t += obj.offsetTop; // some browser not right set offsetParent // if (obj.style && obj.style.position=='absolute') break;// this is a fix but not constant obj = obj.offsetParent; }; // fix special for opera if (document.body) with (document){ if (body.leftMargin) l -= body.leftMargin; if (body.topMargin) t -= body.topMargin } return {x: l, y: t}; }; /* show menu item * ind - part of object identifier * @isVertical - previous menu is vertical * @iParent - object created events identifier - this is about a anchor or previous menu item */ var xpshow = window.xpshow = function(ind, isVertical, iParent){ xpshowmenu(ulIdPref+ind+'tbl', isVertical, iParent); } function xpshowmenu(menu, isVertical, iParent) { menu = get(menu); if (!menu) return; // already showing? if (menu.style.visibility == 'visible'){ xpStopTimeOut(menu); return; }; // hide previous menu in this level if (iParent && iParent.menu) xphide(iParent.menu.smShown); if (!menu.level && (xpShownMenu != menu)) xphide(xpShownMenu); // it saves button main menu if (!menu.level) xobtn = menu.id.replace(ulIdPref,'').replace('tbl',''); // Parent - parent menu item var parentObj = (iParent.tagName == 'A')? iParent.parentNode: iParent; var pos = xppos(parentObj); // parent coordinate if (iParent && iParent.menu){ pos.x -= iParent.menu['scrollLeft'] || 0; pos.y -= iParent.menu['scrollTop'] || 0; }; var size = xpObjectSize(parentObj); menu.xpMenuX = 1; // menu open direction menu.xpMenuDx = 1; // menu open offset if (menu.level > 0){ // inherit direction from previous level menu.xpMenuX = menu.iParent.menu.xpMenuX; menu.xpMenuDx = menu.iParent.menu.xpMenuDx; }; // initialize property menu.style.overflow = 'visible'; menu.style.height = 'auto'; menu.style.width = 'auto'; // fix bug position for some document structure menu.style.left = '0px'; menu.style.top = '0px'; var parentAbs = xppos(menu); // detect window size var WinSize = xpClientSize(); var menuSize = xpObjectSize(menu); // calc and init Y coordinate var CalcedPos = xpCalcMenuPos(WinSize.y, WinSize.h, pos.y, size.y, menuSize.y, menu.xpMenuDx, isVertical); menu.xpMenuDx = CalcedPos.align; // fix scrollbar bug for opera if (isOp && !menu.OrigWidth) menu.OrigWidth = menu.clientWidth;//menu.clientWidth; // size was changed - resize height, open scroll, correct width for scrollbar if (CalcedPos.size < menuSize.y){ //xpsm.style.overflowY = 'auto'; menu.style.overflow = 'auto'; //menu.style.overflow = 'visible'; if (isIE) menu.style.overflowX = 'visible'; if (isIE) menu.style.width = menu.offsetWidth + 17 + 'px'; else if (isMz) menu.style.magrinRight = 20; menu.style.height = CalcedPos.size + 'px'; menu.scrollTop = 0; menu.scrollLeft = 0; // fix scrollbar bug for opera if (isOp) menu.style.width = menu.OrigWidth + 'px'; }; menu.style.top = CalcedPos.xy - parentAbs.y + 'px'; // calc and init X coorinate menuSize = xpObjectSize(menu); CalcedPos = xpCalcMenuPos(WinSize.x, WinSize.w, pos.x, size.x, menuSize.x, menu.xpMenuX, !isVertical); menu.xpMenuX = CalcedPos.align; if (CalcedPos.size < menuSize.x)// size was changed if (menu.xpMenuX > 0) CalcedPos.xy -= (menuSize.x - CalcedPos.size); // covered menu.style.left = CalcedPos.xy - parentAbs.x + 'px'; menu.style.visibility = 'visible'; if (!menu.level) xpShownMenu = menu else { iParent.menu.smShown = menu; iParent.setPopup(); } }; /* calc menu pos for one coordinate use size of menu, parent object and screen, menu direction and parent menu orientation screenSize - size of screen parentXY, parentSize - position and size of parent menu size - size of selected menu align = +1(right, bottom), 0(center), -1(left, top) - direction of menu oHoriz = 0(vertical), 1(horizontal) - orientation of parent menu */ function xpCalcMenuPos(screenXY, screenSize, parentXY, parentSize, size, align, oHoriz){ var xy = parentXY; var newSize = size; var newAlign = align; var space = 5; // space to document borders if ((align == 0) && (!oHoriz)) align = 1; //center may be only for horizontal orientation if (!oHoriz) {// VERTICAL // |------<--------->)<---parent--->(<---------->---------| // check the place for the future menu and correct orientation if (((newAlign >= 0) && (parentXY + parentSize + size > screenSize + screenXY - space)) // don't go in screen from the algin || ((newAlign < 0) && (parentXY - size < space))){ // correct direction about most of place if (parentXY - screenXY > screenSize + screenXY - (parentXY + parentSize)) newAlign = -1; else newAlign = 1; }; // set coordinate and size if (newAlign >= 0){ xy = parentXY + parentSize; if (screenSize + screenXY - space - xy < newSize) newSize = screenSize + screenXY - space - xy; } else { xy = parentXY - newSize; if (xy - screenXY < space){ xy = space + screenXY; newSize = parentXY - space - screenXY; } } } else { // --------------- <---parent---> ------------------- // (<------------------------>--------| // |-----<--------------------->) // if menu not go in screen if (newSize > screenSize - 2*space) { xy = space + screenXY; newSize = screenSize - 2*space; } else{ // calc xy = parentXY + parentSize/2 - newSize/2 + newAlign * (newSize/2 - parentSize/2); // correct if (xy < space + screenXY){ newAlign = 1; xy = space + screenXY; } if (xy + size > screenSize + screenXY - space){ newAlign = -1; xy -= xy + newSize - (screenSize + screenXY - space); } } }; return {xy: xy, size: newSize, align: newAlign}; }; function get(o){ return (typeof o == 'string')? document.getElementById(o): o } /* * hide submenu * @menu */ function xphide(menu){ menu = get(menu); if (!menu || menu.style.visibility != 'visible') return; // hide child xphide(menu.smShown); // off cursor selection menu.xpClearMenuMark(); // hide the menu menu.style.visibility = 'hidden'; // if all submenu close, then change button icon if (menu.level == 0){ xpe(xobtn + 'n');//??????????? } menu.smShown = 0; if (menu.iParent) menu.iParent.clrPopup(); // clear to hide timeout if (menu.hideTimer){ clearTimeout(menu.hideTimer); menu.hideTimer = null; } }; window.xphide = xphide; // on mouse out from menu window.xpsmout = function(sender){ if (!sender) return; // set time out xpStartTimeOut(xpShownMenu) }; // on mouse over menu window.xpsmover = function(menu) { xpStopTimeOut(menu); }; /* * clear Time out for all parent and this menu * run in submenu engine context */ function xpStopTimeOut(menu){ for( var o = menu; o; o = o.iParent? o.iParent.menu: 0) if (o.hideTimer) o.hideTimer = clearTimeout(o.hideTimer); }; /* * start hide timer for this menu and all its submenu */ function xpStartTimeOut(menu){ if (menu) { if (!menu.hideTimer) menu.hideTimer = setTimeout( function (){ xphide(menu) } , 300); xpStartTimeOut(menu.smShown) } } };// end of menu component var xpShownMenu = 0; // curent open menu tread new vistaButtons({ subFrame: 0||1 });