questia.Package( "coreweb.workspace" ); coreweb.workspace.DragObject = function() { var CONTAINER_WIDTH = 0; var EXCERPT_COL = 4; var MODIFIED_COL = 5; var m_headers = [ { minWidth: 10, tableSelector: '.checkboxCol', hdrSelector: '#hdCheck' }, { minWidth: 75, tableSelector: '.titleCol', hdrSelector: '#hdTitle' }, { minWidth: 20, tableSelector: '.pageCol', hdrSelector: '#hdPage' }, { minWidth: 50, tableSelector: '.typeCol', hdrSelector: '#hdType' }, { minWidth: 50, tableSelector: '.excerptCol', hdrSelector: '#hdExcerpt' }, { minWidth: 20, tableSelector: '.modifiedCol', hdrSelector: '#hdModified' } ]; var m_resizeWidths = new Array(m_headers.length); var m_dragContext = {}; function initialize() { var totalMins = 0; var totalWidth = 0; for( index=0; index < m_headers.length; index++ ) { var nextNode = m_headers[index]; var width = parseInt(getStyleSelector( nextNode.hdrSelector ).style.width); nextNode.initialWidth = width; totalWidth += width; totalMins = nextNode.minWidth; nextNode.headerNode = document.getElementById( nextNode.hdrSelector.substring(1) ); } if ( CONTAINER_WIDTH == 0 ) { CONTAINER_WIDTH = totalWidth; } for( index=0; index < m_headers.length; index++ ) { var nextNode = m_headers[index]; nextNode.weight = nextNode.initialWidth*100/totalWidth; } var delta_weight = m_headers[MODIFIED_COL].weight*0.5; //m_headers[EXCERPT_COL].weight += delta_weight; //m_headers[MODIFIED_COL].weight -= delta_weight; } function getStyleSelector(selectorName) { var stylesheets = document.styleSheets; var rule = null; for (i = 0; i < stylesheets.length; i++){ var css = stylesheets[i]; var rtype = ( typeof css.rules != 'undefined' ) ? 'rules' : 'cssRules'; for( j=0; j < css[rtype].length; j++ ) { var rules = css[rtype]; if( rules[j].selectorText == selectorName){ return rules[j]; } } } } function updateWidthStyle(width,selector) { var rule = getStyleSelector(selector); if ( rule) { rule.style.width = width + 'px'; } } this.dragStart = function(event, id) { initialize(); m_dragContext.rule = null; m_dragContext.columnWeight = null; var el; var x, y; // Get cursor position with respect to the page. if ( coreweb.common.Browser.isBrowser("ie.windows")) { m_dragContext.dragNode = window.event.srcElement; x = window.event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft; y = window.event.clientY + document.documentElement.scrollTop + document.body.scrollTop; } else { m_dragContext.dragNode = event.target; x = event.clientX + window.scrollX; y = event.clientY + window.scrollY; } for( index=0; index < m_headers.length; index++ ) { var headerNode = m_headers[index]; if ( headerNode.hdrSelector.substring(1) == id ) { m_dragContext.header = headerNode; m_dragContext.header.dragTargetNode = document.getElementById(id); m_dragContext.header.initialWidth = m_dragContext.header.dragTargetNode.offsetWidth; m_dragContext.headerIndex = index; break; } } // Save starting positions of cursor and element. m_dragContext.cursorStartX = x; m_dragContext.cursorStartY = y; m_dragContext.elStartLeft = parseInt(m_dragContext.dragNode.style.left, 10); m_dragContext.elStartTop = parseInt(m_dragContext.dragNode.style.top, 10); if (isNaN(m_dragContext.elStartLeft)) m_dragContext.elStartLeft = 0; if (isNaN(m_dragContext.elStartTop)) m_dragContext.elStartTop = 0; // Capture mousemove and mouseup events on the page. if (coreweb.common.Browser.isBrowser("ie.windows")) { document.attachEvent("onmousemove", doDrag); document.attachEvent("onmouseup", dragStop); window.event.cancelBubble = true; window.event.returnValue = false; } else { document.addEventListener("mousemove", doDrag, true); document.addEventListener("mouseup", dragStop, true); event.preventDefault(); } } function doDrag(event) { var x, y; // Get cursor position with respect to the page. if (coreweb.common.Browser.isBrowser("ie.windows")) { x = window.event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft; y = window.event.clientY + document.documentElement.scrollTop + document.body.scrollTop; } else { x = event.clientX + window.scrollX; y = event.clientY + window.scrollY; } if (coreweb.common.Browser.isBrowser("ie.windows") ) { window.event.cancelBubble = true; window.event.returnValue = false; } else { event.preventDefault(); } var delta = x - m_dragContext.cursorStartX; var newHeaderWidth = m_dragContext.header.initialWidth + delta; if ( newHeaderWidth < m_dragContext.header.minWidth ) { newHeaderWidth = m_dragContext.header.minWidth; } var totalWeight = 0; if ( !m_dragContext.columnWeight ) { for( index=m_dragContext.headerIndex+1; index < m_headers.length; index++ ) { var headerNode = m_headers[index]; /** * Now update the remaining column widths */ totalWeight += headerNode.weight; } m_dragContext.columnWeight = totalWeight; } else { totalWeight = m_dragContext.columnWeight; } var remainingWidth = CONTAINER_WIDTH - (m_dragContext.header.headerNode.offsetLeft+newHeaderWidth); var usedWidth = 0; for( index=m_dragContext.headerIndex+1; index < m_headers.length; index++ ) { var headerNode = m_headers[index]; var newWidth = 0; if ( index == m_headers.length - 1 ) { newWidth = remainingWidth - usedWidth; } else { newWidth = remainingWidth*headerNode.weight/totalWeight; } if ( newWidth < headerNode.minWidth ) { newWidth = headerNode.minWidth; } usedWidth += newWidth; m_resizeWidths[index] = newWidth; } // now calculate the result and make sure we are not beyond the container width var totalWidth = newHeaderWidth; for( index=m_dragContext.headerIndex+1; index < m_headers.length; index++ ) { totalWidth += m_resizeWidths[index]; } for( index=0; index < m_dragContext.headerIndex; index++ ) { totalWidth += m_headers[index].headerNode.offsetWidth; } if ( totalWidth <= CONTAINER_WIDTH ) { m_dragContext.header.headerNode.style.width = newHeaderWidth + 'px'; for( index=m_dragContext.headerIndex+1; index < m_headers.length; index++ ) { var headerNode = m_headers[index]; headerNode.headerNode.style.width = m_resizeWidths[index] + 'px'; } } } function dragStop(event) { if (coreweb.common.Browser.isBrowser("ie.windows") ) { document.detachEvent("onmousemove", doDrag); document.detachEvent("onmouseup", dragStop); } else { document.removeEventListener("mousemove", doDrag, true); document.removeEventListener("mouseup", dragStop, true); } initialize(); for( index=1; index < m_headers.length; index++ ) { var headerNode = m_headers[index]; headerNode.initialWidth = parseInt(headerNode.headerNode.style.width); updateWidthStyle( headerNode.headerNode.offsetWidth, headerNode.hdrSelector ); updateWidthStyle( headerNode.headerNode.offsetWidth, headerNode.tableSelector ); } var setcolUrl = "/workspace/projects/action/setcolsizes?"; for( index=1; index < m_headers.length; index++ ) { var headerNode = m_headers[index]; var element = document.getElementById(headerNode.tableSelector.substring(1)); updateWidthStyle( element.offsetWidth, headerNode.hdrSelector ); headerNode.headerNode.style.width = element.offsetWidth + 'px'; setcolUrl += headerNode.hdrSelector.substring(1) + "=" + element.offsetWidth + "&"; } questia.asyncRequest.get( setcolUrl, null ); } this.initializeColumnWidths = function( colWidths ) { if ( colWidths == null ) { return; } for( index=1; index < m_headers.length; index++ ) { var headerNode = m_headers[index]; var tableElement = document.getElementById(headerNode.tableSelector.substring(1)); var newWidth = colWidths[headerNode.hdrSelector.substring(1)]; updateWidthStyle( newWidth, headerNode.hdrSelector ); updateWidthStyle( newWidth, headerNode.tableSelector ); document.getElementById(headerNode.hdrSelector.substring(1)).style.width = newWidth + 'px'; } } }