///////////////////////////////////////////////////////////////////////////// // (c) Copyright 2000 - 2001, i2 Technologies, Inc. (formerly Intellection)// // ALL RIGHTS RESERVED. // // // // This UNPUBLISHED PROPRIETARY software is subject to the full copyright // // notice in the COPYRIGHT file in this directory. // ///////////////////////////////////////////////////////////////////////////// /* set i2uitracelevel to >0 to output trace messages */ var i2uitracelevel = 0; var i2uitracetext = ""; var i2uiScrollerWidth= 17; var i2uiResizeWidthVariable = new Array(); var i2uiResizeMasterVariable = new Array(); var i2uiResizeSlaveVariable = new Array(); var i2uiResizeSlave2Variable = new Array(); var i2uiResizeFlagVariable = new Array(); var i2uiResizeKeyword = "TABLERESIZE_"; var i2uiResizeKeywordLength = i2uiResizeKeyword.length; var i2uiResizeSlaveorigX = 0; var i2uiResizeSlavenewX = 0; var i2uiResizeSlavewhichEl = null; var i2uiResizeSlaveOrigonmouseup; var i2uiResizeSlaveOrigonmousemove; var i2uiMenuOrigonmouseup; var i2uiMenuActiveId = null; var i2uiSubMenuActiveId = null; var i2uiMenu_x = null; var i2uiMenu_y = null; var i2uiSubMenu_x = null; var i2uiSubMenu_y = null; var i2uiSubMenuFlag = null; var i2uiManageTreeTableUserFunction = null; var i2uiToggleContentUserFunction = null; var i2uiImageDirectory = "i2grid/"; var i2uiActiveTreeNode = null; var i2uiCurrentTabset = null; var i2uiCurrentTab = null; var i2uiClickedTab = null; /* The i2uitaglib.js methods dynamically change images used by the i2uitaglib components. i2uiSetImageDirectory() defines the directory that i2uitaglib.js will use for those images. This method should be called immediately after i2uitaglib.js is linked to the page. The tag creates both the link to i2uitaglib.js and the call to i2uiSetImageDirectory() using the image directory of the current skin. imageDirectory - path to the component image directory return - none Compatibility: IE, NS6, NS4 */ function i2uiSetImageDirectory(imageDirectory) { i2uiImageDirectory = imageDirectory; } /* This routine toggles the visibility of a body of content. The content must be enclosed within a TBODY tag. item - the element that received the event nest - how many levels nested is the item from the enclosing table return - none Compatibility: IE, NS6 */ function i2uiToggleContent(item, nest, relatedroutine) { // NS4 browser does not reflow document so what is the point anyway? if (document.layers) { return; } // find the owning table for the item which received the event. // in this case the item is the expand/collapse image // note: the table may be several levels above as indicated by 'nest' var owningtable = item; if (item.tagName == "A") { item = item.childNodes[0]; } while (owningtable != null && nest > 0) { if (owningtable.parentElement) { owningtable = owningtable.parentElement; } else { owningtable = owningtable.parentNode; } if (owningtable != null && owningtable.tagName == 'TABLE') { nest--; } } var ownerid = owningtable.id; // for tabbed container, the true owning table is higher. // continue traversal in order to get the container id. if (ownerid == "") { var superowner = owningtable; while (superowner != null && ownerid == "") { if (superowner.parentElement) { superowner = superowner.parentElement; } else { superowner = superowner.parentNode; } if (superowner != null && superowner.tagName == 'TABLE') { ownerid = superowner.id; } } } // if found table, find child TBODY with proper id if (owningtable != null) { var pretogglewidth = owningtable.offsetWidth; // determine how many TBODY tags are within the table var len = owningtable.getElementsByTagName('TBODY').length; // now find proper TBODY that holds the content var contenttbody; for (var i=0; i Compatibility: IE, NS6, NS4 */ function i2uiToggleTabNoop() { } /* Activates a tab in a tabset. tabset_id - the id of the tab's tabset alttext - the tab description tab_element - the name of the tab to activate return - none Compatibility: IE, NS6, NS4 */ function i2uiToggleTab(tabset_id, alttext, tab_element) { i2uiCurrentTabset = tabset_id; // handle Netscape 4.x if (document.layers) { var item; // display new description item = document.layers[tabset_id+"_description"]; if (item != null) { var text = '
'+alttext+'
'; item.document.open(); item.document.write(text); item.document.close(); } } else // handle IE and Netscape 6 { if (tab_element.tagName == 'undefined' || tab_element.tagName == null) { return; } i2uiClickedTab = tab_element; //i2uitrace(1,"activate="+tab_element.tagName); var item = document.getElementById(tabset_id); //i2uitrace(1,"item="+item.tagName+"\n"+"TABLE body\n"+item.innerHTML); item = item.getElementsByTagName('TBODY')[0]; //i2uitrace(1,"TBODY body\n"+item.innerHTML); var len = item.getElementsByTagName('TR').length; //i2uitrace(1,"#TR="+len); if (len > 0) { item = item.getElementsByTagName('TR')[0]; //i2uitrace(1,"TR body\n"+item.innerHTML); len = item.getElementsByTagName('TD').length; //i2uitrace(1,"#TD="+len); var item2; var located = -1; var selectedtabid = "tabSelected"; var unselectedtabid = "tabUnSelected"; var unselectedtabid2 = "tabUnSelected"; if (!document.all) { selectedtabid += "NS6"; unselectedtabid2 += "NS6"; } // turn off selected tab for (var i=0; i 0) { item2 = item2.getElementsByTagName('A')[0]; if (saveCurrent) i2uiCurrentTab = item2; if (item2 == tab_element) { //i2uitrace(1,"found A at "+i+" class="+item2.className+" id="+item2.id); located = i; } else { //i2uitrace(1,"TD #"+i+" other class="+item2.className+" id="+item2.id); if (item2.id == "tabSelected" || item2.id == "tabSelectedNS6" || item2.id == "powerTabSelected" || item2.id == "powerTabSelectedNS6") { item2.id = unselectedtabid2; } } } } //i2uitrace(1,"new tab at "+located); // now turn on the new tab if (located > 0) { for (i=located-1; i'; item.document.open(); item.document.write(text); item.document.close(); } } else // handle IE and Netscape 6 { if (tab_element.tagName == 'undefined' || tab_element.tagName == null) { return; } //i2uitrace(1,"activate="+tab_element.tagName); var item = document.getElementById(tabset_id); //i2uitrace(1,"item="+item.tagName+"\n"+"TABLE body\n"+item.innerHTML); var item3 = item.getElementsByTagName('TBODY')[0]; //i2uitrace(1,"TBODY body\n"+item3.innerHTML); var len; var len2 = item3.getElementsByTagName('TR').length; //i2uitrace(1,"#TR="+len2); if (len2 > 0) { var item2; var located = -1; var selectedtabid = "tabSelected"; var unselectedtabid = "tabUnSelected"; for (var j=0; j 0) { item2 = item2.getElementsByTagName('A')[0]; if (item2 == tab_element) { //i2uitrace(1,"found A at "+i); located = j; } else { //i2uitrace(1,"TD #"+i+" other class="+item2.className+" id="+item2.id); if (item2.id == "tabSelectedVert") { item2.id = "tabUnSelectedVert"; } } } } } //i2uitrace(1,"new tab at "+located); // now turn on the new tab if (located > -1) { item = tab_element.parentElement; if (item != null) { //i2uitrace(1,"located parent="+item.tagName); item = item.parentElement; } if (item != null) { item2 = item.getElementsByTagName('TD')[0]; if (item2 != null) { //i2uitrace(1,"TD 0 fix this. class="+item2.className+" id="+item2.id); item2.id = "tabSelectedVert"; } item2 = item.getElementsByTagName('TD')[1]; if (item2 != null) { //i2uitrace(1,"TD 1 fix this. class="+item2.className+" id="+item2.id); item2.id = "tabSelectedVert2"; if (item2.getElementsByTagName('A').length > 0) { item2 = item2.getElementsByTagName('A')[0]; //i2uitrace(1,"..TD #"+i+" fix this A. class="+item2.className+" id="+item2.id+" newclass="+selectedtabid); item2.id = "tabSelectedVert"; } } } item = item3.getElementsByTagName('TR')[located+1]; if (item != null) { var len = item.getElementsByTagName('TD').length; //i2uitrace(1,"located grandparent="+item.tagName+" with "+len+" TDs"); for (i=0; i 0) { var lastheaderrow = headeritem.rows.length - 1; var len = headeritem.rows[lastheaderrow].cells.length; for (var i=0; i copyheader - slave - headerheight - desired height of last header row in pixels return - none Compatibility: IE, NS6 */ function i2uiResizeColumns(tableid, shrink, copyheader, slave, headerheight) { var width = 0; // NS4 browser does not reflow document so what is the point anyway? if (document.layers) { return width; } var tableitem = document.getElementById(tableid); var headeritem = document.getElementById(tableid+"_header"); var dataitem = document.getElementById(tableid+"_data"); var scrolleritem = document.getElementById(tableid+"_scroller"); var scrolleritem2 = document.getElementById(tableid+"_header_scroller"); if (tableitem != null && headeritem != null && dataitem != null && scrolleritem != null && dataitem.rows.length > 0) { var lastheaderrow = headeritem.rows.length - 1; var len = headeritem.rows[lastheaderrow].cells.length; var len2 = len; //i2uitrace(1,"ResizeColumns entry scroller width="+scrolleritem.offsetWidth); if (headerheight != null && document.all && len > 1) return i2uiResizeColumnsWithFixedHeaderHeight(tableid, headerheight, slave); // check first if resize needed //i2uitrace(1,"check alignment in ResizeColumns"); if (i2uiCheckAlignment(tableid)) { //i2uitrace(1,"skip alignment in ResizeColumns"); return headeritem.clientWidth; } // insert a new row which is the same as the header row // forces very nice alignment whenever scrolling rows alone if (copyheader == null || copyheader == 1) { //i2uitrace(1,"pre copy header into data for "+tableid); //i2uitrace(1,"data: width="+dataitem.width+" style.width="+dataitem.style.width+" client="+dataitem.clientWidth+" scroll="+dataitem.scrollWidth+" offset="+dataitem.offsetWidth); //i2uitrace(1,"header: width="+headeritem.width+" style.width="+headeritem.style.width+" client="+headeritem.clientWidth+" scroll="+headeritem.scrollWidth+" offset="+headeritem.offsetWidth); //i2uitrace(1,"scroller: width="+scrolleritem.width+" style.width="+scrolleritem.style.width+" client="+scrolleritem.clientWidth+" scroll="+scrolleritem.scrollWidth+" offset="+scrolleritem.offsetWidth); //i2uitrace(1,"check for bypass"); for (var i=0; i 0) { //i2uitrace(1,"i2uiResizeMasterColumns id="+tableid+" parent is "+tableitem.parentElement.tagName+" owner height="+tableitem.parentElement.clientHeight); var scrollerWidth = scrolleritem.clientWidth; var headeritemcw = headeritem.clientWidth; var dataitemcw = dataitem.clientWidth; var len, i, w1, w2, w3, adjust, len2; var lastheaderrow = headeritem.rows.length - 1; len = headeritem.rows[lastheaderrow].cells.length; len2 = len; // if horizontal scrolling and scroller needed if (scrolleritem2 != null && scrolleritem2.clientWidth < headeritem.clientWidth) { adjust = 0; len--; } else { adjust = headeritem.cellPadding * 2; // do not alter last column len--; } //i2uitrace(1,"adjust="+adjust); if (headerheight != null && document.all) { i2uiResizeColumnsWithFixedHeaderHeight(tableid, headerheight); } else { dataitem.style.width = 5 * dataitem.rows[0].cells.length; headeritem.style.width = 5 * headeritem.rows[lastheaderrow].cells.length; /* -- start -- */ /* Rauli Don't shrink columns if there is no need. This will prevent one row tables from wrapping. */ if( scrollerWidth >= dataitemcw && scrollerWidth >= headeritemcw ){ for ( i = 0; i < len; ++i ){ w1 = headeritem.rows[ lastheaderrow ].cells[ i ].clientWidth; w2 = dataitem.rows[ 0 ].cells[ i ].clientWidth; w3 = Math.max( w1,w2 ); if( w1 < w3 ) headeritem.rows[ lastheaderrow ].cells[ i ].width = w3; if( w2 < w3 ) dataitem.rows[ 0 ].cells[ i ].width = w3; } } if( scrollerWidth < dataitemcw|| scrollerWidth < headeritemcw ){ // shrink each column first // note: this may cause the contents to wrap // even if nowrap="yes"is specified //i2uitrace(1,"pre shrink"); for (i=0; i 0) { //i2uitrace(1,"i2uiResizeColumnsWithFixedHeaderHeight id="+tableid); if (headeritem.style.tableLayout != "fixed") { var newrow = headeritem.insertRow(); if (newrow != null) { newrow.className = "tableColumnHeadings"; var i; var lastheaderrow = headeritem.rows.length - 2; var len = headeritem.rows[lastheaderrow].cells.length; var newcell; var attempts; var newcellwidth; var widths = new Array(); var overallwidth = len - 1; // initial width is for cell dividers //i2uitrace(1,"pre header width="+headeritem.clientWidth); // shrink cells if slave table present if (slave != null || slave == 1) { dataitem.style.width = 5 * dataitem.rows[0].cells.length; headeritem.style.width = 5 * dataitem.rows[0].cells.length; } // don't shrink last cell for performance reasons /* -- start -- */ /* Ganesh The piece of code below makes the rows to shrink irrespective of long text. Commenting it to avoid unnecessary wrapping of data rows in a scrollable table with fixed height. This wrapping looks bad especially when the table has only one data row. Uncommenting it since it causes the column width to be very high. */ for (i=0; i headeritem.clientWidth) growthfactor = Math.max(125,scrolleritem.offsetWidth-headeritem.clientWidth); else growthfactor = 125; //i2uitrace(1,"scroller="+scrolleritem.offsetWidth+" client="+headeritem.clientWidth+" growthfactor="+growthfactor); headeritem.style.width = headeritem.clientWidth + growthfactor; for (i=0; i"); if (newitem != null) headeritem.appendChild(newitem); newitem = document.createElement(""); if (newitem != null) dataitem.appendChild(newitem); } // now that the table has the necessary data, make it fixed layout headeritem.style.tableLayout = "fixed"; dataitem.style.tableLayout = "fixed"; //apparently not needed //headeritem.style.width = overallwidth; //dataitem.style.width = overallwidth; // make last header row desired height headeritem.rows[lastheaderrow].style.height = headerheight; // set cell width for (i=0; i 1) { var scrollercell = table_obj.rows[0].cells[len-1]; if (scrollercell != null && scrollercell.id=="scrollerspacer") { if (newheight < maxheight) { if (scroller_obj.style.overflow=="hidden") { var cmd = "document.getElementById('"+id+"_data').style.overflow='auto'"; setTimeout(cmd, 50); } scrollercell.style.display = ""; scrollercell.style.visibility = "visible"; } else { scroller_obj.style.overflow="hidden"; scrollercell.style.display = "none"; } } } } } /* Resizes the area for scrollable rows and columns based on smaller of specified value and amount currently used. mastertableid - the id of the table to resize minheight - minimum vertical scroller height minwidth - minimum horizontal scroller width slavetableid - the id of the table that is paired with the master table. If null, then no synchronized scrolling is defined. flag - extra reserved width. usually the space on the sides of the table. slave2width - defines the amount of area taken by the synced table which is normally drawn to the left of the master table column1width - desired width of first column headerheight - desired upper limit for height of last header row in pixels return - none Compatibility: IE, NS6 */ function i2uiResizeScrollableArea(mastertableid, minheight, minwidth, slavetableid, flag, slave2width, column1width, headerheight) { minwidth = minwidth -1; // sudhir for xp /* -- start -- */ /* Ganesh Fixing the header height of all scrollable tables to 25 pixels. Fix for header columns wrapping problem in scrollable tables mainly for users with japanese locale. */ //headerheight = 25; /* -- end -- */ // NS4 browser does not reflow document so what is the point anyway? if (document.layers) { return; } //i2uitrace(1,"RSA height="+minheight+" width="+minwidth+" slave="+slavetableid+" flag="+flag); //NS6 handler if (!document.all) { var scroller_obj = document.getElementById(mastertableid+"_data"); if (scroller_obj != null) { var newheight; var scrollheight = i2uiComputeScrollHeight(mastertableid+"_data"); var rowcount = scroller_obj.rows.length; var maxheight = scrollheight+rowcount; if (minheight == null) newheight = maxheight; else newheight = Math.max(100, Math.min(minheight, maxheight)); //needed to force repaint of area scroller_obj.style.height = newheight + 1; scroller_obj.style.height = newheight; i2uiManageTableScroller(mastertableid,maxheight,newheight); } return; } var slavetableid2 = null; if (slavetableid != null && slavetableid != 'undefined') { slavetableid2 = slavetableid+"2"; } var tableitem = document.getElementById(mastertableid); var headeritem = document.getElementById(mastertableid+"_header"); var dataitem = document.getElementById(mastertableid+"_data"); var scrolleritem = document.getElementById(mastertableid+"_scroller"); if (tableitem != null && headeritem != null && dataitem != null && scrolleritem != null) { var s = scrolleritem.style; s.overflowX = 'auto'; if(mastertableid != 'resizabledualsyncslave2') s.overflowY = 'auto'; // make the slave area as narrow as possible var slavewidth = 0; // this is for the margins of the page if (flag != null && flag != "undefined") { if (slave2width != null && slave2width != 'undefined') { slavewidth = Math.ceil(2 * (flag / 1)); } else { slavewidth = flag / 1; } } if (slavewidth == 0 && slave2width != null && slave2width != 'undefined') { slavewidth += i2uiScrollerWidth; } if (window.document.body != null && (window.document.body.scroll == null || window.document.body.scroll == 'yes' || window.document.body.scroll == 'auto')) { slavewidth += i2uiScrollerWidth; } if (slavetableid != null && slavetableid != 'undefined') { //i2uitrace(1,"pre slavetable1 "+slavetableid+" slavewidth="+slavewidth); var x = i2uiResizeColumns(slavetableid,1,1,1,headerheight); //i2uitrace(1,"post slavetable1 "+slavetableid+" slavewidth="+slavewidth); slavewidth += x; } if (slavetableid2 != null && slavetableid2 != 'undefined' && document.getElementById(slavetableid2) != null) { var x = i2uiResizeColumns(slavetableid2,1,1,1,headerheight); //i2uitrace(1,"slave2width="+x); //i2uitrace(1,"slave2width="+slave2width); //i2uitrace(1,"slave2width="+document.getElementById(slavetableid2+"_header").clientWidth); //i2uitrace(1,"slave2width="+document.getElementById(slavetableid2+"_header").offsetWidth); //i2uitrace(1,"slave2width="+document.getElementById(slavetableid2+"_header").scrollWidth); //i2uitrace(1,"post slavetable2 "+slavetableid2+" slavewidth="+slavewidth); if (slave2width != null && slave2width != 'undefined') { slavewidth += slave2width; } else { slavewidth += x; } //i2uitrace(1,"post buffer "+slavetableid2+" slavewidth="+slavewidth); } if (minwidth != null && minwidth != 'undefined') { var scrolleritem2 = document.getElementById(mastertableid+"_header_scroller"); if (scrolleritem2 != null) { var newwidth; if (slavetableid != null && slavetableid != 'undefined') { newwidth = Math.max(headeritem.clientWidth, dataitem.clientWidth); newwidth = Math.min(newwidth, minwidth); newwidth = Math.max(minwidth, document.body.offsetWidth - slavewidth); } else { newwidth = minwidth; } newwidth = Math.max(1,newwidth); //i2uitrace(1,"smarter - minwidth (desired)="+minwidth); //i2uitrace(1,"smarter pre - client: header="+headeritem.clientWidth+" data="+dataitem.clientWidth+" scroller="+scrolleritem.clientWidth); //i2uitrace(1,"smarter pre - offset: header="+headeritem.offsetWidth+" data="+dataitem.offsetWidth+" scroller="+scrolleritem.offsetWidth); //i2uitrace(1,"smarter pre - scroll: header="+headeritem.scrollWidth+" data="+dataitem.scrollWidth+" scroller="+scrolleritem.scrollWidth); scrolleritem2.style.width = newwidth; scrolleritem2.width = newwidth; scrolleritem.style.width = newwidth; scrolleritem.width = newwidth; tableitem.style.width = newwidth; dataitem.style.width = newwidth; // if scroller present for rows, add extra width to data area var adjust = scrolleritem2.clientWidth - scrolleritem.clientWidth; //i2uitrace(1,"width adjust="+adjust); if (adjust != 0) { scrolleritem.style.width = newwidth + adjust; } //i2uitrace(1,"smarter post - client: header="+headeritem.clientWidth+" data="+dataitem.clientWidth+" scroller="+scrolleritem.clientWidth); //i2uitrace(1,"smarter post - offset: header="+headeritem.offsetWidth+" data="+dataitem.offsetWidth+" scroller="+scrolleritem.offsetWidth); //i2uitrace(1,"smarter post - scroll: header="+headeritem.scrollWidth+" data="+dataitem.scrollWidth+" scroller="+scrolleritem.scrollWidth); //i2uitrace(1,"smarter - newwidth (actual)="+newwidth); if (newwidth != scrolleritem.clientWidth) { newwidth--; scrolleritem2.style.width = newwidth; scrolleritem.style.width = newwidth + adjust; tableitem.style.width = newwidth; dataitem.style.width = newwidth; //i2uitrace(1,"smarter post3 - client: header="+headeritem.clientWidth+" data="+dataitem.clientWidth+" scroller="+scrolleritem.clientWidth); //i2uitrace(1,"smarter post3 - offset: header="+headeritem.offsetWidth+" data="+dataitem.offsetWidth+" scroller="+scrolleritem.offsetWidth); //i2uitrace(1,"smarter post3 - scroll: header="+headeritem.scrollWidth+" data="+dataitem.scrollWidth+" scroller="+scrolleritem.scrollWidth); } // if aligned and scroller present, then skip re-alignment // however, doesn't mean table couldn't be more efficient var skip = false; //i2uitrace(1,"check alignment in ResizeScrollableArea"); if (headerheight == null && i2uiCheckAlignment(mastertableid) && (headeritem.clientWidth > scrolleritem.clientWidth || dataitem.clientWidth > scrolleritem.clientWidth)) { //i2uitrace(1,"check1 "+scrolleritem.scrollWidth+" != "+scrolleritem.clientWidth); //i2uitrace(1,"check2 "+scrolleritem.scrollWidth+" == "+headeritem.scrollWidth); //i2uitrace(1,"check3 "+headeritem.scrollWidth+" == "+headeritem.clientWidth); //i2uitrace(1,"columns aligned but ResizeTable may be needed"); skip = true; //i2uitrace(1,"skip alignment in ResizeScrollableArea"); } if (!skip) { // scroll items to far left scrolleritem.scrollLeft = 0; scrolleritem2.scrollLeft = 0; // now resize columns to handle new overall width i2uiResizeMasterColumns(mastertableid, column1width, headerheight); //i2uitrace(1,"check alignment after ResizeMasterColumns"); if (!i2uiCheckAlignment(mastertableid)) { //i2uitrace(1,"spawn ResizeColumns"); var cmd = "i2uiResizeColumns('"+mastertableid+"',1,1)"; setTimeout(cmd, 250); } //i2uitrace(1,"post3 header width="+headeritem.clientWidth+" data width="+dataitem.clientWidth+" desired width="+minwidth); //i2uitrace(1,"post3 header width="+headeritem.offsetWidth+" data width="+dataitem.offsetWidth+" desired width="+minwidth); } } } if (minheight != null && minheight != 'undefined' && (slavetableid == null || slavetableid != 'undefined')) { var newheight = Math.max(1, Math.min(dataitem.clientHeight, minheight)); scrolleritem.style.height = newheight; // check if scroller beneath var adjust = dataitem.clientHeight - scrolleritem.clientHeight; //i2uitrace(1,"setting height. adjust="+adjust); if (adjust != 0) { scrolleritem.style.height = newheight + Math.min( i2uiScrollerWidth,adjust); } if (slavetableid != null && slavetableid != 'undefined') { var dataitem2 = document.getElementById(slavetableid+"_data"); var scrolleritem2 = document.getElementById(slavetableid+"_scroller"); //i2uitrace(1,"pre data master="+dataitem.clientHeight+" slave="+dataitem2.clientHeight); //i2uitrace(1,"pre scroller master="+scrolleritem.clientHeight+" slave="+scrolleritem2.clientHeight); if (scrolleritem2 != null && dataitem2 != null) { scrolleritem2.style.height = newheight; var adjust = scrolleritem2.clientHeight - scrolleritem.clientHeight; //i2uitrace(1,"post data master="+dataitem.clientHeight+" slave="+dataitem2.clientHeight); //i2uitrace(1,"post scroller master="+scrolleritem.clientHeight+" slave="+scrolleritem2.clientHeight); //i2uitrace(1,"setting slave height. adjust="+adjust); if (adjust != 0) { scrolleritem2.style.height = newheight - adjust; } } // now fix height of slave2 if defined if (slavetableid2 != null && slavetableid2 != 'undefined') { //i2uitrace(1,"fix slave2"); var scrolleritem3 = document.getElementById(slavetableid2+"_scroller"); if (scrolleritem3 != null) { //i2uitrace(1,"fix scrolleritem3"); scrolleritem3.style.height = newheight; var adjust = scrolleritem3.clientHeight - scrolleritem.clientHeight; //i2uitrace(1,"post data master="+dataitem.clientHeight+" slave="+dataitem2.clientHeight); //i2uitrace(1,"post scroller master="+scrolleritem.clientHeight+" slave="+scrolleritem2.clientHeight); //i2uitrace(1,"adjust="+adjust); if (adjust != 0) { scrolleritem3.style.height = newheight - adjust; } } } } } // now fix each row between the master and slave to be of same height if (slavetableid != null && slavetableid != 'undefined') { //i2uitrace(1,"fix each row"); var dataitem2 = document.getElementById(slavetableid+"_data"); if (dataitem2 != null) { var dataitem3 = null; if (slavetableid2 != null && slavetableid2 != 'undefined') { dataitem3 = document.getElementById(slavetableid2+"_data"); } var len; // compute if any row grouping is occuring between slave and master var masterRowsPerSlaveRow = 1; // fakerow will be 1 if slave has extra row used to align columns var fakerow = 0; // if 2 slave tables if (dataitem3 != null) { //if (dataitem.rows.length % dataitem3.rows.length > 0) if (i2uiCheckForAlignmentRow(slavetableid2)) { fakerow = 1; } masterRowsPerSlaveRow = Math.max(1,parseInt(dataitem.rows.length / (dataitem3.rows.length - fakerow))); } else { //if (dataitem.rows.length % dataitem2.rows.length > 0) if (i2uiCheckForAlignmentRow(slavetableid)) { fakerow = 1; } masterRowsPerSlaveRow = Math.max(1,parseInt(dataitem.rows.length / (dataitem2.rows.length - fakerow))); } //i2uitrace(0, "table "+mastertableid+" masterRows="+dataitem.rows.length+" slaveRows="+dataitem2.rows.length); //i2uitrace(0, "table "+mastertableid+" masterRowsPerSlaveRow="+masterRowsPerSlaveRow); // if 2 slave tables and masterRowsPerSlaveRow is not 1, // align master and inner slave first row for row if (dataitem3 != null && masterRowsPerSlaveRow > 1) { len = dataitem.rows.length; //i2uitrace(1, "fix "+len+" rows between master and inner slave"); for (var i=0; i dataitem2.rows[i].clientHeight) { dataitem2.rows[i].style.height = h3; } else { // increase height of last row in group //k = j + masterRowsPerSlaveRow - 1; //delta = Math.max(0,dataitem2.rows[i].clientHeight - h1); //dataitem.rows[k].style.height += delta; // increase height of each row in group // any remainder is added to last row in group k = j + masterRowsPerSlaveRow - 1; delta = dataitem2.rows[i].clientHeight - h1; remainder = delta % masterRowsPerSlaveRow; delta = parseInt(delta / masterRowsPerSlaveRow); //i2uitrace(1,"i="+i+" j="+j+" k="+k+" master="+h1+" slave="+dataitem2.rows[i].clientHeight+" delta="+delta+" remainder="+remainder); for (k=0; k slavetableid - return - none Compatibility: IE, NS6 */ function i2uiSyncdScroll(mastertableid, slavetableid) { var masterscrolleritem; var slavescrolleritem; if (slavetableid == null) { // keep header and data of same table scrolled to same position masterscrolleritem = document.getElementById(mastertableid+"_scroller"); slavescrolleritem = document.getElementById(mastertableid+"_header_scroller"); if (slavescrolleritem != null && masterscrolleritem != null) { slavescrolleritem.scrollTop = masterscrolleritem.scrollTop; slavescrolleritem.scrollLeft = masterscrolleritem.scrollLeft; } } else { // keep data in different tables scrolled to same position masterscrolleritem = document.getElementById(mastertableid+"_scroller"); slavescrolleritem = document.getElementById(slavetableid+"_scroller"); if (slavescrolleritem != null && masterscrolleritem != null) { slavescrolleritem.scrollTop = masterscrolleritem.scrollTop; } } } /* Displays various sizes for each scrollable table partition. tableid - the table id return - none Compatibility: IE, NS6 */ function i2uiRecap(tableid) { // sorry not supported in Netscape 4.x if (document.layers) { return; } var tableitem = document.getElementById(tableid); var headeritem = document.getElementById(tableid+"_header"); var dataitem = document.getElementById(tableid+"_data"); var scrolleritem = document.getElementById(tableid+"_scroller"); if (tableitem != null && headeritem != null && dataitem != null && scrolleritem != null && dataitem.rows.length > 0) { var len = headeritem.rows[0].cells.length; i2uitrace (0,"recap for "+tableid); i2uitrace (0,"data: width="+dataitem.width+" style.width="+dataitem.style.width+" client="+dataitem.clientWidth+" scroll="+dataitem.scrollWidth+" offset="+dataitem.offsetWidth); i2uitrace (0,"header: width="+headeritem.width+" style.width="+headeritem.style.width+" client="+headeritem.clientWidth+" scroll="+headeritem.scrollWidth+" offset="+headeritem.offsetWidth); i2uitrace (0,"scroller: width="+scrolleritem.width+" style.width="+scrolleritem.style.width+" client="+scrolleritem.clientWidth+" scroll="+scrolleritem.scrollWidth+" offset="+scrolleritem.offsetWidth); for (var i=0; iTrace Window"); i2uitracewindow.document.write(i2uitracetext); i2uitracewindow.document.write(""); i2uitracewindow.document.close(); } } /* Mouse down event handler for resizable master/slave tables e - the mouse down event return - none Compatibility: IE, NS6 */ function i2uiResizeSlaveonmousedown(e) { var name; i2uiResizeSlaveOrigonmouseup = document.onmouseup; i2uiResizeSlaveOrigonmousemove = document.onmousemove; document.onmousemove = i2uiResizeSlaveonmousemove; document.onmouseup = i2uiResizeSlaveonmouseup; i2uiResizeSlavewhichEl = null; i2uiResizeSlavewhichEl = event.srcElement; name = i2uiResizeSlavewhichEl.id; //window.status = "mousedown. target="+name; // determine if mousedown on a resize indicator while (i2uiResizeSlavewhichEl.id.indexOf(i2uiResizeKeyword) == -1) { //i2uiResizeSlavewhichEl = i2uiResizeSlavewhichEl.parentElement; i2uiResizeSlavewhichEl = i2uiResizeSlavewhichEl.parentNode; if (i2uiResizeSlavewhichEl == null) { return; } } if (i2uiResizeSlavewhichEl == null) { return; } //window.status = "mousedown. name="+name; i2uiResizeSlavewhichEl.style.cursor = "move"; // retain mousedown position i2uiResizeSlaveorigX = event.clientX + document.body.scrollLeft; } /* Mouse move event handler for resizable master/slave tables. e - the mouse move event return - none Compatibility: IE, NS6 */ function i2uiResizeSlaveonmousemove(e) { if (i2uiResizeSlavewhichEl == null) { event.returnValue = true; } else { event.returnValue = false; } } /* Mouse up event handler for resizable master/slave tables. e - the mouse up event return - none Compatibility: IE, NS6 */ function i2uiResizeSlaveonmouseup(e) { document.onmousemove = i2uiResizeSlaveOrigonmousemove; document.onmouseup = i2uiResizeSlaveOrigonmouseup; if (i2uiResizeSlavewhichEl == null) { //window.status = "mouseup but no item"; return; } //window.status = "mouseup"; i2uiResizeSlavenewX = event.clientX + document.body.scrollLeft; i2uiResizeSlaveresize(); event.returnValue = false; i2uiResizeSlavewhichEl = null; } /* Mouse over event handler for resizable master/slave tables return - none Compatibility: IE, NS6 */ function i2uiResizeSlaveonmouseover() { if (i2uiResizeSlavewhichEl == null && event.srcElement.id.indexOf(i2uiResizeKeyword) != -1) { event.srcElement.style.cursor = "move"; } event.returnValue = true; } /* Performs the actual resizing for master/slave tables return - none Compatibility: IE, NS6 */ function i2uiResizeSlaveresize() { var distanceX = i2uiResizeSlavenewX - i2uiResizeSlaveorigX; //i2uitrace(1,"resize dist="+distanceX); if (distanceX != 0) { //i2uitrace(1,"resize variable="+i2uiResizeSlavewhichEl.id); // test that variable exists by this name if (i2uiIsVariableDefined(i2uiResizeSlavewhichEl.id.substring(i2uiResizeKeywordLength))) { var w = i2uiResizeSlavewhichEl.id.substring(i2uiResizeKeywordLength); var newwidth = eval(w) + distanceX; //i2uitrace(1,"distance="+distanceX+" old width="+eval(w)+" new width="+newwidth); var len = i2uiResizeWidthVariable.length; //i2uitrace(1,"array len="+len); for (var i=0; i master - slave - slave2 - flag - return - none Compatibility: IE, NS6 */ function i2uiResizableSlave(width, master, slave, slave2, flag) { if (document.layers) { return; } var len = i2uiResizeWidthVariable.length; i2uiResizeWidthVariable[len] = width; i2uiResizeMasterVariable[len] = master; i2uiResizeSlaveVariable[len] = slave; i2uiResizeSlave2Variable[len] = slave2; i2uiResizeFlagVariable[len] = flag; var obj = document.getElementById(i2uiResizeKeyword+width); if (obj != null) { obj.onmouseover = i2uiResizeSlaveonmouseover; obj.onmousedown = i2uiResizeSlaveonmousedown; //document.onmousemove = i2uiResizeSlaveonmousemove; //document.onmouseup = i2uiResizeSlaveonmouseup; } } /* Checks whether a javascript variable exists or not name - the javascript variable to check return - true if the variable is defined and false othewise Compatibility: IE, NS6, NS4 */ function i2uiIsVariableDefined(name) { var check; // use of window is critical as well as prepending '' eval("check = ''+window."+name); if (check == "undefined") { return false; } else { return true; } } /* Pad tree table logic tablename - cellname - column - relatedtablenames - name - recurse - return - none Compatibility: IE, NS6 */ function i2uiManagePadTree(tablename, cellname, column, relatedtablenames, name, recurse, relatedroutine) { // NS4 browser does not reflow document so what is the point anyway? if (document.layers) { return; } // allows related table to adjust to new width due to actions in current table if (recurse == null && relatedtablenames != null) { // only do this if not a leaf node var img = document.getElementById("TREECELLIMAGE_"+tablename+"_"+cellname); if (img != null && img.src.indexOf("bullet") == -1) i2uiShrinkScrollableTable(relatedtablenames); } //i2uitrace(1,"manage cell=["+cellname+"]"); var table; var savemasterscrolltop; var saveslavescrolltop; var loadondemand = false; //i2uitrace(1,"tablename=["+tablename+"]"); table = document.getElementById(tablename+"_data"); if (table == null) { table = document.getElementById(tablename); } //i2uitrace(1,"table=["+table+"]"); if (table != null && table.rows != null) { var masterscrolleritem = document.getElementById(relatedtablenames+"_scroller"); var slavescrolleritem = document.getElementById(tablename+"_scroller"); if (slavescrolleritem != null && masterscrolleritem != null) { savemasterscrolltop = masterscrolleritem.scrollTop; saveslavescrolltop = slavescrolleritem.scrollTop; } var relatedtable = null; if (relatedtablenames != null && relatedtablenames != 'undefined') { relatedtable = document.getElementById(relatedtablenames+"_data"); } //i2uitrace(1,document.getElementById("TREECELLIMAGE_"+cellname)); //i2uitrace(1,document.getElementById("TREECELLIMAGE_"+cellname).src); var img = document.getElementById("TREECELLIMAGE_"+tablename+"_"+cellname); if (img.src.indexOf("bullet") != -1) { return; } var action; if (img != null && img.src != null) { if (img.src.indexOf("_loadondemand") != -1) { loadondemand = true; } else if (img.src.indexOf("minus") == -1) { if (recurse == null) { img.src = i2uiImageDirectory+"/minus_norgie.gif"; action = ""; } else { action = "none"; } //i2uitrace(1,"now expand"); } else if (img.src.indexOf("plus") == -1) { if (recurse == null) { img.src = i2uiImageDirectory+"/plus_norgie.gif"; action = "none"; } else { action = ""; } //i2uitrace(1,"now collapse"); } } //i2uitrace(1,document.getElementById("TREECELLIMAGE_"+cellname).src); // if collapsing, must collapse all children // if expanding, expand only immediate children var depth1 = cellname.split("_").length; //i2uitrace(1,"depth1="+depth1); var len = table.rows.length; //i2uitrace(1,"len="+len); for (var i=1; i cellname - column - relatedtablenames - name - recurse - return - none Compatibility: IE, NS6 */ function i2uiManageTreeTable(tablename, cellname, column, relatedtablenames, name, recurse, relatedroutine, startat) { // NS4 browser does not reflow document so what is the point anyway? if (document.layers) { return; } // allows related table to adjust to new width due to actions in current table if (recurse == null && relatedtablenames != null) { // only do this if not a leaf node var img = document.getElementById("TREECELLIMAGE_"+tablename+"_"+cellname); if (img != null && img.src.indexOf("bullet") == -1) i2uiShrinkScrollableTable(relatedtablenames); } //i2uitrace(1,"manage cell=["+cellname+"]"); var table; var savemasterscrolltop; var saveslavescrolltop; var loadondemand = false; //i2uitrace(1,"tablename=["+tablename+"]"); table = document.getElementById(tablename+"_data"); if (table == null) { table = document.getElementById(tablename); } //i2uitrace(1,"table=["+table+"]"); if (table != null && table.rows != null) { var masterscrolleritem = document.getElementById(relatedtablenames+"_scroller"); var slavescrolleritem = document.getElementById(tablename+"_scroller"); if (slavescrolleritem != null && masterscrolleritem != null) { savemasterscrolltop = masterscrolleritem.scrollTop; saveslavescrolltop = slavescrolleritem.scrollTop; } var relatedtable = null; if (relatedtablenames != null && relatedtablenames != 'undefined') { relatedtable = document.getElementById(relatedtablenames+"_data"); } //i2uitrace(1,document.getElementById("TREECELLIMAGE_"+cellname)); //i2uitrace(1,document.getElementById("TREECELLIMAGE_"+cellname).src); var img = document.getElementById("TREECELLIMAGE_"+tablename+"_"+cellname); if (img != null && img.src != null && img.src.indexOf("bullet") != -1) { return; } var action; var action2; if (img != null && img.src != null) { if (img.src.indexOf("_loadondemand") != -1) { loadondemand = true; action2 = "none"; } else if (img.src.indexOf("minus") == -1) { action2 = "expand"; if (recurse == null) { img.src = i2uiImageDirectory+"/minus_norgie.gif"; action = ""; } else { action = "none"; } //i2uitrace(1,"now expand"); } else if (img.src.indexOf("plus") == -1) { action2 = "collapse"; if (recurse == null) { img.src = i2uiImageDirectory+"/plus_norgie.gif"; action = "none"; } else { action = ""; } //i2uitrace(1,"now collapse"); } } //i2uitrace(1,document.getElementById("TREECELLIMAGE_"+cellname).src); // if collapsing, must collapse all children // if expanding, expand only immediate children var depth1 = Math.floor(cellname); //i2uitrace(1,"depth1="+depth1); var len = table.rows.length; //i2uitrace(1,"len="+len); if (startat == null) startat = 0; //i2uitrace(1,"**** startat="+startat+" depth1="+depth1+" cellname="+cellname); for (var i=startat; i depth1 + 5 && action2 == "collapse")) { //i2uitrace(1,"perform action ["+action+"] on row "+j); table.rows[j].style.display = action; if (relatedtable != null) relatedtable.rows[j].style.display = action; // if expanding and not already recursing, then recurse if (depth2 == depth1 + 10 && action2 == "expand" && recurse == null) { //i2uitrace(0,"recurse with "+newcell+" from row "+j); i2uiManageTreeTable(tablename,newcell,column,relatedtablenames,name,1,null,j); } } if (depth2 <= depth1) { //i2uitrace(1,"*** done with children"); break; } } break; } } // finally realign tables if (recurse == null) { if (relatedtablenames != null || document.getElementById(tablename+"_data") != null) { // must scroll to top. can't use previous scroll position // since table height itself could have changed. as a result, // rows become misaligned. var masterscrolleritem = document.getElementById(relatedtablenames+"_scroller"); var slavescrolleritem = document.getElementById(tablename+"_scroller"); if (slavescrolleritem != null && masterscrolleritem != null) { //i2uitrace(1,"savedmasterscrolltop="+savemasterscrolltop); //i2uitrace(1,"savedslavescrolltop="+saveslavescrolltop); masterscrolleritem.scrollTop = 0; slavescrolleritem.scrollTop = 0; //masterscrolleritem.scrollTop = savemasterscrolltop; //slavescrolleritem.scrollTop = masterscrolleritem.scrollTop; } } // call a related routine to handle any follow-up actions // intended for internal use. external use should use the // callback mechanism //i2uitrace(0,"managetreetable related=["+relatedroutine+"]"); if (relatedroutine != null) { // must invoke the routine 'in the future' to allow browser // to settle down, that is, finish rendering the effects of // the tree element changing state setTimeout(relatedroutine,100); } // call a routine of the invoker's choosing to handle any realignment if (i2uiManageTreeTableUserFunction != null) { if (name == null) { name = 'undefined'; } if (relatedtablenames != null) { eval(i2uiManageTreeTableUserFunction+"('"+tablename+"','"+relatedtablenames+"','"+action+"',"+savemasterscrolltop+",'"+name+"',"+loadondemand+")"); } else { eval(i2uiManageTreeTableUserFunction+"('"+tablename+"','undefined','"+action+"',null,'"+name+"',"+loadondemand+")"); } } } } } /* Collapses all nodes of a pad tree to a given depth. Topmost should be 0. Also expands nodes to reach the specified depth. tablename - name of pad depth - depth to which pad should be collapsed return - none Compatibility: IE, NS6 */ function i2uiCollapsePadTree(tablename, depth) { // NS4 browser does not reflow document so what is the point anyway? if (document.layers) { return; } var column = 0; //i2uitrace(1,"collapsepadtree depth="+depth); var table; var savemasterscrolltop; var saveslavescrolltop; //i2uitrace(1,"tablename=["+tablename+"]"); table = document.getElementById(tablename+"_data"); if (table == null) { table = document.getElementById(tablename); } //i2uitrace(1,"table=["+table+"]"); if (table != null && table.rows != null) { var len = table.rows.length; var rowdepth; var img; var cellname; var childkey; var childnode; //i2uitrace(1,"#rows="+len); for (var i=0; i depth) { // test for children if (childnode == null) { if (img != null) { // Added by WJD for degraded mode tree bullets if (img.tagName == "A") { img.innerText = "*"; } else { if (img.src.indexOf("plus_loadondemand.gif") == -1) { img.src = i2uiImageDirectory+"/tree_bullet.gif"; } } } } //i2uitrace(1,"HIDE ME id="+table.rows[i].cells[column].id); table.rows[i].style.display = "none"; } else { // test for children if (childnode == null) { if (img != null) { if (img.src.indexOf("plus_loadondemand.gif") == -1) img.src = i2uiImageDirectory+"/tree_bullet.gif"; } } else { if (img != null) { img.src = i2uiImageDirectory+"/minus_norgie.gif"; } } //i2uitrace(1,"EXPAND ME id="+table.rows[i].cells[column].id); table.rows[i].style.display = ""; } } } } } /* Collapses all nodes of a tree to a given depth. Topmost should be 0. Also expands nodes to reach the specified depth. tablename - name of table containing treecells depth - desired depth relatedtablenames - name of any sync'd table column - indicates which column contains the tree processdescendants - whether to collapse descendants also return - none Compatibility: IE, NS6 */ function i2uiCollapseTreeTable(tablename, depth, relatedtablenames, column, processdescendants) { // NS4 browser does not reflow document so what is the point anyway? if (document.layers) { return; } // column is 0 based. if not supplied assume first column if (column == null) { column = 0; } //i2uitrace(1,"collapsetree depth="+depth); var table; var savemasterscrolltop; var saveslavescrolltop; //i2uitrace(1,"tablename=["+tablename+"]"); table = document.getElementById(tablename+"_data"); if (table == null) { table = document.getElementById(tablename); } //i2uitrace(1,"table=["+table+"]"); if (table != null && table.rows != null) { var relatedtable = null; if (relatedtablenames != null && relatedtablenames != 'undefined') { relatedtable = document.getElementById(relatedtablenames+"_data"); var masterscrolleritem = document.getElementById(relatedtablenames+"_scroller"); if (masterscrolleritem != null) { savemasterscrolltop = masterscrolleritem.scrollTop; } } var len = table.rows.length; var rowdepth; var newdepth; var node; var img; var cellname; var childkey; var childnode; //i2uitrace(0,"#rows="+len); for (var i=0; i return - none Compatibility: IE, NS6 */ function i2uiSetTabFillerHeight(id) { // NS4 browser does not reflow document so what is the point anyway? if (document.layers) { return; } var filler_obj = document.getElementById(id+"_filler"); var tab_table_obj = document.getElementById(id); if (filler_obj != null && tab_table_obj != null) { var container_table_obj = tab_table_obj.parentNode; while (container_table_obj != null) { if (container_table_obj.tagName == 'TABLE') { break; } container_table_obj = container_table_obj.parentNode; } if (container_table_obj != null && tab_table_obj != null) { //i2uitrace(1,"container height="+container_table_obj.offsetHeight); //i2uitrace(1,"tab height="+tab_table_obj.offsetHeight); filler_obj.style.height = container_table_obj.offsetHeight - tab_table_obj.offsetHeight; } } } /* Sets the dimensions for the scrollable area of a container. id - height - delta - width - useminheight - autoscrollers - return - none Compatibility: IE, NS6 */ function i2uiResizeScrollableContainer(id, height, delta, width, useminheight, autoscrollers) { // NS4 browser does not reflow document so what is the point anyway? if (document.layers) { return; } // sorry bug in Netscape 6.0,6.01,6.1 causes container to continally grow in size if (!i2uiIsSuitableBrowser()) { return; } var scroller_obj = document.getElementById(id+"_scroller"); //i2uitrace(1,"resizescrollablecontainer scroller="+scroller_obj); if (scroller_obj != null) { i2uiComputeScrollHeight(id+"_scroller",true); if (width != null) { scroller_obj.style.width = Math.max(1,width); var obj = document.getElementById(id); if (obj != null) { obj.style.width = Math.max(1,width); // handle case where title width is more than new content width // must resize content to be at least the same as the title if (width > 0 && width < obj.offsetWidth - 3) { scroller_obj.style.width = obj.offsetWidth - 3; } } } if (height != null) { // if you want to size the container to the minimum of // the content and allowable space if (useminheight != null && useminheight == true && scroller_obj.scrollHeight != null) { //i2uitrace(1,"id="+id+" desire="+height+" now="+scroller_obj.offsetHeight+" need="+scroller_obj.scrollHeight); var scrollHeight = scroller_obj.scrollHeight; if (scroller_obj.offsetWidth < scroller_obj.scrollWidth) scrollHeight += i2uiScrollerWidth; scroller_obj.style.height = Math.min(Math.max(1,height), scrollHeight); } else { scroller_obj.style.height = Math.max(1,height); } } else { if (delta != null) { var x = scroller_obj.offsetWidth; var y = scroller_obj.offsetHeight + delta; if (x > 0 && y > 0) { if (useminheight != null && useminheight == true && scroller_obj.scrollHeight != null) { //i2uitrace(1,"id="+id+" desire="+y+" now="+scroller_obj.offsetHeight+" need="+scroller_obj.scrollHeight); scroller_obj.style.height = Math.min(y, scroller_obj.scrollHeight); } else { scroller_obj.style.height = y; } //scroller_obj.style.width = x; } // bug in Netscape 6.01 causes container to get wider // with each call. resizing container not helping. } } //i2uitrace(1,"overflow="+scroller_obj.style.overflow+" scrollheight="+scroller_obj.scrollHeight+" offsetheight="+scroller_obj.offsetHeight); // whether or not the scroller state should track the space needed. // if enabled, the dead space reserved for auto scroller is available // for use by the container. if (autoscrollers != null && autoscrollers == 'yes') { if (scroller_obj.scrollHeight <= scroller_obj.offsetHeight && scroller_obj.scrollWidth <= scroller_obj.offsetWidth ) { scroller_obj.style.overflowX="hidden"; scroller_obj.style.overflowY="hidden"; } else { scroller_obj.style.overflowX="auto"; scroller_obj.style.overflowY="auto"; } } } } /* Changes the visual appearance of popup menu options. obj - flag - id - menuid - return - none Compatibility: IE, NS6, NS4 */ function i2uiHighlightMenuOption(obj,flag,id,menuid) { i2uiSubMenuFlag = flag; // as mouse moves over options in main menu, hide any active child menu if (menuid != null && flag == "Highlighted" && i2uiSubMenuActiveId != null && menuid == i2uiMenuActiveId) { i2uiToggleItemVisibility(i2uiSubMenuActiveId, 'hide'); i2uiSubMenuActiveId = null; } if (document.layers) { //i2uitrace(0,"Highlight flag=["+flag+"] id=["+id+"] menuid=["+menuid+"]"); var obj2 = document.layers[menuid]; if (obj2 != null) { var obj3 = obj2.layers[id]; if (obj3 != null) { if (flag == "Highlighted") { obj3.bgColor = "#d1d6f0"; } else { obj3.bgColor = "#f2f4fe"; } } } return; } // find row tag that contains menu option while (obj != null && obj.tagName != 'TR') { obj = obj.parentNode; } if (obj != null) { obj.className = "menu"+flag; } } /* Determines the location at which a popup menu should be placed. obj - e - return - none Compatibility: IE, NS6, NS4 */ function i2uiSetMenuCoords(obj, e) { // this works for IE if (obj.clientLeft != null && obj.clientTop != null) { i2uiMenu_x = e.clientX + obj.document.body.scrollLeft; i2uiMenu_y = e.clientY + obj.document.body.scrollTop; //window.status = "IE popup menu at x="+i2uiMenu_x+" y="+i2uiMenu_y+" or "+e.x+","+e.y; } else { // this works for NS 6 if (obj.offsetLeft != null && obj.offsetTop != null) { // this is relative to owner not page coords i2uiMenu_x = obj.offsetLeft + obj.offsetWidth; i2uiMenu_y = obj.offsetTop + obj.offsetHeight; //window.status = "NS6 popup menu at x="+i2uiMenu_x+" y="+i2uiMenu_y; } else // this works for NS 4 { // sorry - the best we can do is show it where the mouse event occured i2uiMenu_x = e.pageX; i2uiMenu_y = e.pageY; } } } /* Hides the previous popup menu and then displays the specified popup menu. id - the id of the menu to display return - none Compatibility: IE, NS6 */ function i2uiShowMenu(id, obj) { var docObj; //fix for eQ :: 530156 - IE loses document after we do save on reports if ( obj != null ) {