/*jslint white: true, indent: 2, onevar: false, browser: true, undef: true, nomen: false, eqeqeq: true, plusplus: false, bitwise: true, regexp: true, strict: false, newcap: true, immed: true */ /*global window, console, jQuery, setTimeout */ /* [INSERT_PLUGIN_NAME] [INSERT_VERSION_NUMBER] Author and Contributors ======================================== [INSERT_AUTHOR_LIST] File: jquery.iframe-auto-height.plugin.js Remarks: original code from http://sonspring.com/journal/jquery-iframe-sizing [INSERT_DESCRIPTION] */ (function ($) { $.fn.iframeAutoHeight = function (spec) { // set default option values var options = $.extend({ heightOffset: 0, minHeight: 0, callback: function (newHeight) {}, debug: false, diagnostics: false // used for development only }, spec); // logging function debug(message) { if (options.debug && options.debug === true && window.console) { console.log(message); } } // not used by production code function showDiagnostics(iframe, calledFrom) { debug("Diagnostics from '" + calledFrom + "'"); try { debug(" " + $(iframe, window.top.document).contents().find('body')[0].scrollHeight + " for ...find('body')[0].scrollHeight"); debug(" " + $(iframe.contentWindow.document).height() + " for ...contentWindow.document).height()"); debug(" " + $(iframe.contentWindow.document.body).height() + " for ...contentWindow.document.body).height()"); } catch (ex) { // ie fails when called during for each, ok later on // probably not an issue if called in a document ready block debug(" unable to check in this state"); } debug("End diagnostics -> results vary by browser and when diagnostics are requested"); } // show all option values debug(options); // ****************************************************** // iterate over the matched elements passed to the plugin ; return will make it chainable return this.each(function () { // for use by webkit only var loadCounter = 0; // resizeHeight function resizeHeight(iframe) { if (options.diagnostics) { showDiagnostics(iframe, "resizeHeight"); } // get the iframe body height and set inline style to that plus a little var $body = $(iframe, window.top.document).contents().find('body'); var newHeight = $body[0].scrollHeight + options.heightOffset; //erik: forcing minHeigth to current body height dd = $(document.body) options.minHeight = dd[0].clientHeight - 40; if (newHeight < options.minHeight) { debug("new height is less than minHeight"); newHeight = options.minHeight;// + options.heightOffset; } debug("New Height: " + newHeight); iframe.style.height = newHeight + 'px'; options.callback.apply($(iframe), [{newFrameHeight: newHeight}]); } // debug me debug(this); if (options.diagnostics) { showDiagnostics(this, "each iframe"); } // Check if browser is Opera or Safari (Webkit really, so includes Chrome) if (true) { //erik patch ($.browser.safari || $.browser.opera) { debug("browser is webkit or opera"); // Start timer when loaded. $(this).load(function () { var delay = 0; var iframe = this; // Reset iframe height to 0 to force new frame size to fit window properly iframe.style.height = '0px'; var delayedResize = function () { resizeHeight(iframe); }; if (loadCounter === 0) { delay = 500; // delay the first one } debug("load delay: " + delay); setTimeout(delayedResize, delay); loadCounter++; }); // Safari and Opera need a kick-start. var source = $(this).attr('src'); $(this).attr('src', ''); $(this).attr('src', source); } else { // For other browsers. $(this).load(function () { resizeHeight(this); }); } // if browser this.forceResizeHeight = resizeHeight; // this.forceResizeHeight = function (iframeInstance) { // resizeHeight(iframeInstance); // }; }); // $(this).each(function () { }; // $.fn.iframeAutoHeight = function (options) { }(jQuery)); // (function ($) {