/** * This file wraps the Snapsie ActiveX object, exposing a single saveSnapshot() * method on a the object. * * See http://snapsie.sourceforge.net/ */ function Snapsie() { // private methods function isQuirksMode(inDocument) { return (inDocument.compatMode == 'BackCompat'); } function getDrawableElement(inDocument) { if (isQuirksMode(inDocument)) { var body = inDocument.getElementsByTagName('body')[0]; return body; } else { // standards mode return inDocument.documentElement; } } /** * Returns the canonical Windows path for a given path. This means * basically replacing any forwards slashes with backslashes. * * @param path the path whose canonical form to return */ function getCanonicalPath(path) { path = path.replace(/\//g, '\\'); path = path.replace(/\\\\/g, '\\'); return path; } // public methods /** * Saves a screenshot of the current document to a file. If frameId is * specified, a screenshot of just the frame is captured instead. * * @param outputFile the file to which to save the screenshot * @param frameId the frame to capture; omit to capture entire document */ this.saveSnapshot = function(outputFile, frameId) { var drawableElement = getDrawableElement(document); var drawableInfo = { overflow : drawableElement.style.overflow , scrollLeft: drawableElement.scrollLeft , scrollTop : drawableElement.scrollTop }; drawableElement.style.overflow = 'hidden'; var capturableDocument; var frameBCR = { left: 0, top: 0 }; if (!frameId) { capturableDocument = document; } else { var frame = document.getElementById(frameId); capturableDocument = frame.document; // scroll as much of the frame into view as possible frameBCR = frame.getBoundingClientRect(); window.scroll(frameBCR.left, frameBCR.top); frameBCR = frame.getBoundingClientRect(); } var nativeObj = new ActiveXObject('Snapsie.CoSnapsie'); nativeObj.saveSnapshot( getCanonicalPath(outputFile), frameId, drawableElement.scrollWidth, drawableElement.scrollHeight, drawableElement.clientWidth, drawableElement.clientHeight, drawableElement.clientLeft, drawableElement.clientTop, frameBCR.left, frameBCR.top ); // revert drawableElement.style.overflow = drawableInfo.overflow; drawableElement.scrollLeft = drawableInfo.scrollLeft; drawableElement.scrollTop = drawableInfo.scrollTop; } };