// Mostly based on cross-browser scripts with copyright notices: // Copyright 2001-2005 Michael Foster (Cross-Browser.com) // Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL function xGetElementsByClassName(c, p, t, f) { var found = []; var re = new RegExp('\\b'+c+'\\b', 'i'); var list = document.getElementsByTagName(t); for (var i = 0; i < list.length; ++i) { if (list[i].className && list[i].className.search(re) != -1) { found[found.length] = list[i]; if (f) f(list[i]); } } return found; } function xDef() { for(var i=0; iwindow.innerWidth) h-=16; } return h; } function xClientWidth() { var w=0; if(document.compatMode == 'CSS1Compat' && !window.opera && document.documentElement && document.documentElement.clientWidth) w=document.documentElement.clientWidth; else if(document.body && document.body.clientWidth) w=document.body.clientWidth; else if(xDef(window.innerWidth,window.innerHeight,document.height)) { w=window.innerWidth; if(document.height>window.innerHeight) w-=16; } return w; } function xWidth(e, w) { if(typeof(e) == 'string' && !(e=document.getElementById(e))) { return 0; } if (typeof(w) == "number") { if (w<0) w = 0; else w=Math.round(w); } else w=-1; var css= typeof(e.style) != 'undefined'; if (e == document || e.tagName.toLowerCase() == 'html' || e.tagName.toLowerCase() == 'body') { w = xClientWidth(); } else if(css && xDef(e.offsetWidth) && typeof(e.style.width) == "string") { if(w>=0) { var pl=0,pr=0,bl=0,br=0; if (document.compatMode=='CSS1Compat') { var gcs = xGetComputedStyle; pl=gcs(e,'padding-left',1); if (pl !== null) { pr=gcs(e,'padding-right',1); bl=gcs(e,'border-left-width',1); br=gcs(e,'border-right-width',1); } // Should we try this as a last resort? // At this point getComputedStyle and currentStyle do not exist. else if(xDef(e.offsetWidth,e.style.width)){ e.style.width=w+'px'; pl=e.offsetWidth-w; } } w-=(pl+pr+bl+br); if(isNaN(w)||w<0) { return; } else { e.style.width=w+'px'; } } w=e.offsetWidth; } else if(css && xDef(e.style.pixelWidth)) { if(w>=0) e.style.pixelWidth=w; w=e.style.pixelWidth; } return w; } function xHeight(e, h) { if(typeof(e) == 'string' && !(e=document.getElementById(e))) { return 0; } if (typeof(h) == "number") { if (h<0) h = 0; else h=Math.round(h); } else h=-1; var css=xDef(e.style); if (e == document || e.tagName.toLowerCase() == 'html' || e.tagName.toLowerCase() == 'body') { h = xClientHeight(); } else if(css && xDef(e.offsetHeight) && typeof(e.style.height) == "string") { if(h>=0) { var pt=0,pb=0,bt=0,bb=0; if (document.compatMode=='CSS1Compat') { var gcs = xGetComputedStyle; pt=gcs(e,'padding-top',1); if (pt !== null) { pb=gcs(e,'padding-bottom',1); bt=gcs(e,'border-top-width',1); bb=gcs(e,'border-bottom-width',1); } // Should we try this as a last resort? // At this point getComputedStyle and currentStyle do not exist. else if(xDef(e.offsetHeight,e.style.height)){ e.style.height=h+'px'; pt=e.offsetHeight-h; } } h-=(pt+pb+bt+bb); if(isNaN(h)||h<0) return; else e.style.height=h+'px'; } h=e.offsetHeight; } else if(css && xDef(e.style.pixelHeight)) { if(h>=0) e.style.pixelHeight=h; h=e.style.pixelHeight; } else { } return h; } function xTop(e, iY) { if(!(e=document.getElementById(e))) return 0; var css=xDef(e.style); if(css && typeof(e.style.top) == "string" ) { if(typeof(iY) == 'number') e.style.top= iY + 'px'; else { iY=parseInt(e.style.top); if(isNaN(iY)) iY=0; } } else if(css && xDef(e.style.pixelTop)) { if(xNum(iY)) e.style.pixelTop=iY; else iY=e.style.pixelTop; } return iY; }