// flyout.javascript $Revision: 1.9 $ /****************************************************************************** * Flyout menus for the University of Washington Home Page * University of Washington / Computing and Communications * May, 2003 * Documentation can be found at * http://www.washington.edu/webinfo/case/flyout/ * $Id: flyout.javascript,v 1.9 2003/06/26 16:01:08 wayne Exp $ * * You are free to copy and/or use these flyout menus (or * derivative works) but please make sure this comment block * remains intact and in its entirety at the top of the file. * * member functions of FltLyr -- Brewed up per browser type. * doHide * doShow * delayCallback * setdelay * stopdelay * positionLayer * realHide * realShow * getObjMetrics * normalizeVars * moveTo * noCpos * noOpos * ******************************************************************************/ var d = document; var doDHTML = 0; d.versIE = 0; var wgtext = ""; // running text. /***************************************************************************** * function makeLayer args[2]... are the lines in the menu. # the name of the layer is l_; *****************************************************************************/ function makeLayer (id, title, bgcolor) { if (!doDHTML) return; var a = arguments; var numsp = new Array; numsp.max = new Array; var pos = 0; numsp.max[0] = 0; switch(bgcolor) { case 'Cancelled' : titlebg = 'orangered'; // Default colors break; case 'Pending' : titlebg = 'yellow'; break; case 'Confirmed' : titlebg = 'lightgreen'; break; case 'Full' : titlebg = 'darkgray'; break; default: titlebg = 'orangered'; break; } for (var j = 2; j < a.length; ++j) // skip id and title in args { numsp[j] = a[j].length; if (numsp[j]) { a[j] = a[j].replace ("/^+/", ''); numsp[j] -= a[j].length; numsp.max[pos] = Math.max (numsp[j], numsp.max[pos]); } else numsp.max[++pos] = 0; } /****************************************************************** * Start the div with the table... ******************************************************************/ var fd = FlyLyr.defs; d.write ('
' + ''); if (title) { var titleargs = 'align="center"'; if (fd.titlebackground) titleargs += ' bgcolor="' + titlebg + '"'; d.write ('' + buildCell (title, fd.titleclass ? fd.titleclass : fd.useclass, titleargs) + '<\/tr>'); } var divstart = '
' + "\n"; d.write (divstart); pos = 0; for (j = 2; j < a.length; ++j) { if (!a[j]) { d.write ('<\/table><\/td><\/tr>' + divstart); ++pos; continue; } var args = null; var i = numsp[j]; if (i < numsp.max[pos]) args = 'colspan="' + (numsp.max[pos] - i + 1) + '"'; if (fd.alignright) args += ' align="right"'; d.write (''); while (i-- > 0) d.write ('
  <\/td>'); d.write (buildCell (a[j], fd.useclass, args) + '<\/tr>' + "\n"); } d.write ('<\/table><\/td><\/tr><\/table><\/div>' + "\n"); new FlyLyr (id, 1); } // function makeLayer /***************************************************************************** * function buildCell - Build a * Adds a based on str contents. *****************************************************************************/ function buildCell (str, fc, args) { var retstr = ' 0) { if (atpos > eqpos) retstr += ''; else retstr += ''; retstr += str.substr (0, eqpos) + '<\/a>'; } else retstr += str; return retstr + '<\/td>'; } // function buildCell /***************************************************************************** * function positionLayer *****************************************************************************/ function positionLayer () { var img = this.image; this.getObjMetrics (img); this.normalizeVars (); var xpos = img.width + this.hpad; if (this.positionleft) xpos = -this.lyr.offsetWidth - this.hpad; xpos += img.flyX; var ypos = img.flyY + this.vpad; if (this.position) { var strs = this.position.split (';'); for (var i = 0; i < strs.length; ++i) { var str = strs[i]; if ((pos = str.search ("/[-|] /")) <= 0) continue; var direct = str.substr (pos, 1); var obj = img; if (str.substr (0, pos) != 'IMG') { if (!(obj = findObj (str.substr (0, pos), d))) continue; this.getObjMetrics (obj); } var posstr = str.substr (pos + 1); var cmp = posstr.search ("/[<=>] /"); if (cmp <= 0) continue; var opos, mpos; if (direct == '-') { opos = targetPos (posstr.substr (0, cmp), obj.flyX, obj.width); mpos = targetPos (posstr.substr (cmp + 1), xpos, this.lyr.offsetWidth); } else { opos = targetPos (posstr.substr (0, cmp), obj.flyY, obj.height); mpos = targetPos (posstr.substr (cmp + 1), ypos, this.lyr.offsetHeight); } var rel = posstr.substr (cmp, 1); if ((rel == '<' && mpos < opos) || (rel == '>' && mpos > opos) || rel == '=') { if (direct == '-') xpos += opos - mpos; else ypos += opos - mpos; } } } xpos = posInWindow (xpos, this.lyr.offsetWidth, window.pageXOffset, window.innerWidth); ypos = posInWindow (ypos, this.lyr.offsetHeight, window.pageYOffset, window.innerHeight); this.moveTo (xpos, ypos); if (this.tbl) this.lyr.style.clip = 'rect ( 0px ' + this.tbl.offsetWidth + 'px ' + this.tbl.offsetHeight + 'px 0px )'; } // function positionLayer /***************************************************************************** * function getObjMetricsIE *****************************************************************************/ function getObjMetricsIE (obj) { var oObj = obj; oObj.width = obj.offsetWidth || obj.width; oObj.height = obj.offsetHeight || obj.height; oObj.flyX = oObj.flyY = 0; var seenTable = 0; if (FlyLyr.isMac && oObj.offsetParent.tagName == 'BODY') { if (getInt (oObj.clientLeft) + getInt (oObj.clientTop)) { oObj.flyX = oObj.clientLeft; oObj.flyY = oObj.clientTop; } else { oObj.flyX = oObj.offsetLeft; oObj.flyY = oObj.offsetTop; } return; } for (; obj; obj = obj.offsetParent) { var tag = obj.tagName; if (!FlyLyr.noCpos[tag] && (!FlyLyr.isMac || obj != oObj) && !FlyLyr.isOpera) { oObj.flyX += getInt (obj.clientLeft); oObj.flyY += getInt (obj.clientTop); } var noOent = FlyLyr.noOpos[tag]; if (!noOent || (noOent < 0 && obj.currentStyle && obj.currentStyle.display != 'block')) { oObj.flyX += getInt (obj.offsetLeft); oObj.flyY += getInt (obj.offsetTop); } if (FlyLyr.isMac && tag == 'TABLE') if (seenTable++) oObj.flyY += getInt (obj.cellSpacing); } } // function getObjMetricsIE /***************************************************************************** * function getObjMetricsDOM *****************************************************************************/ function getObjMetricsDOM (obj) { var oObj = obj; obj.width = obj.width || obj.offsetWidth; obj.height = obj.height || obj.offsetHeight; oObj.flyX = oObj.flyY = 0; for (; obj; obj = obj.offsetParent) { if (obj.tagName == 'TABLE') { var bord = parseInt (obj.border); if (isNaN (bord)) { if (obj.getAttribute ('frame')) { ++oObj.flyX; ++oObj.flyY; } } else if (bord > 0) { oObj.flyX += bord; oObj.flyY += bord; } } oObj.flyX += obj.offsetLeft; oObj.flyY += obj.offsetTop; } } // function getObjMetricsDOM /***************************************************************************** * function getInt - Make usre we get an integer or a zero. *****************************************************************************/ function getInt (n) { n = parseInt (n); if (isNaN (n)) return 0; return n; } // function getInt /***************************************************************************** * function targetPos *****************************************************************************/ function targetPos (wherestr, start, len) { var where = wherestr.substr (0, 1); var adj = getInt (wherestr.substr (1)); if (where == 'l' || where == 't') return start + adj; if (where == 'r' || where == 'b') return start + len + adj; return start + len / 2 + adj; } // function targetPos /***************************************************************************** * function posInWindow *****************************************************************************/ function posInWindow (loc, objSize, scroll, winSize) { var move = loc + objSize - scroll - winSize; move += FlyLyr.nsOffset; if (move > 0) loc -= move; if (loc < scroll) loc = scroll; return loc; } // function posInWindow /***************************************************************************** * function FlyLyr - makeLayer has made a
0 && parent.frames.length) { od = parent.frames[n.substring (p + 1)].document; n = n.substring (0, p); } if (!(x = od[n]) && d.all) x = od.all[n]; if (!x && d.getElementById) x = d.getElementById (n); for (i = 0; !x && i < od.forms.length; i++) x = od.forms[i][n]; for (i = 0; !x && od.layers && i < od.layers.length; i++) x = findObj (n, od.layers[i].document); return x; } // function findObj /***************************************************************************** * function useLayer *****************************************************************************/ function useLayer (id) { if (!doDHTML || !d.body.appendChild) return; var elem = findObj ('l_' + id); if (!elem) return; if (FlyLyr.defs.preDetach) FlyLyr.defs.preDetach (elem); if (elem.parentNode.tagName != 'BODY') d.body.appendChild (elem.parentNode.removeChild (elem)); new FlyLyr (id, 0); } // function useLayer /***************************************************************************** * function mIn - Routine called by onmouseover for desired menu elements. *****************************************************************************/ function mIn (id) { if (!doDHTML) return; var lyr = FlyLyr.lyrs[id]; if (!lyr) { if (findObj ('l_' + id)) useLayer (id); lyr = FlyLyr.lyrs[id]; if (!lyr) return; } if (lyr == FlyLyr.showing) lyr.stopdelay (); else new ToShow (lyr); } // function mIn /***************************************************************************** * function mOut - Routine called by onmouseout for currently displayed menu *****************************************************************************/ function mOut () { if (!doDHTML) return; var lyr = FlyLyr.showing; if (!ToShow.stopdelay () && lyr) lyr.setdelay (); } // function mOut /***************************************************************************** * Global code -- here to allow definitions to be made prior to getting * here. * *****************************************************************************/ if ((!d.cssonly && d.layers) || d.all || d.getElementById) { var vers = navigator.appVersion.split ('MSIE '); vers = vers[vers.length - 1]; d.versIE = parseInt (vers); FlyLyr.isMac = navigator.platform.indexOf ('Mac') >= 0; if (navigator.appVersion.indexOf ('MSIE') < 0 || !FlyLyr.isMac || d.versIE >= 5) { doDHTML = 1; FlyLyr.isOpera = navigator.userAgent.indexOf (' Opera ') >= 0; FlyLyr.isKonq = navigator.userAgent.indexOf (' Konqueror') >= 0; initFlyLyr (); initToShow (); initDelay (); } } // Guard text block global scope.