/** * Javascript code to be used with extension PageForms for popup forms. * * @author Stephan Gambke * */ /*global escape*/ // initialise jQuery( function() { // register eventhandlers on 'edit' links and buttons // register formlink with link jQuery('a.popupformlink').click(function(evt){ return ext.popupform.handlePopupFormLink( this.getAttribute('href'), this ); }); // register formlink with button jQuery( 'form.popupformlink' ).submit(function(evt){ return ext.popupform.handlePopupFormLink( this.getAttribute( 'action' ), this ); }); // register forminput jQuery( 'form.popupforminput' ).submit(function(evt){ return ext.popupform.handlePopupFormInput( this.getAttribute( 'action' ), this ); }); } ); // create ext if it does not exist yet if ( typeof( window.ext ) === "undefined" ) { window.ext = {}; } window.ext.popupform = ( function () { var wrapper; var background; var container; var innerContainer; var iframe; var content; var waitIndicator; var instance = 0; var timer; var needsRender = true; var doc; var brokenBrowser, brokenChrome; var padding = 20; var reload; function fadeOut(elem, callback ) { // no fading for broken browsers if ( brokenBrowser ){ elem.hide(); if ( callback ) { callback(); } } else { // what an ugly hack if ( elem === waitIndicator ) { elem.fadeOut( 200, callback ); } else { elem.fadeOut( callback ); } } } function adjustFrameSize( animate ) { // set some inputs var oldFrameW = container.width(); var oldFrameH = container.height(); var oldContW = content.width(); var oldContH = content.height(); var availW = Math.floor( jQuery(window).width() * 0.8 ); var availH = Math.floor( jQuery(window).height() * 0.8 ); var emergencyW = Math.floor( jQuery(window).width() * 0.85 ); var emergencyH = Math.floor( jQuery(window).height() * 0.85 ); // FIXME: these might not be the true values var scrollW = 25; var scrollH = 25; // find the dimensions of the document var body = content.closest('body'); var html = body.parent(); var scrollTgt = html; if ( jQuery.browser.webkit || jQuery.browser.safari ) { scrollTgt = body; } var scrollTop = scrollTgt.scrollTop(); var scrollLeft = scrollTgt.scrollLeft(); content .css('position', 'absolute') .width( 'auto' ) .height( 'auto' ); // set max dimensions for layout of content iframe .width( emergencyW ) .height( emergencyH ); // get dimension values var docW = content.width(); var docH = content.height(); // set old dimensions for layout of content iframe .width( '100%' ) .height( '100%' ); content .css('position', 'relative') .width( oldContW ) .height( oldContH ); if ( jQuery.browser.msie ) { docW += 20; docH += 20; } var docpW = docW + 2 * padding; var docpH = docH + 2 * padding; // Flags var needsHScroll = docpW > emergencyW || ( docpW > emergencyW - scrollW && docpH > emergencyH ); var needsVScroll = docpH > emergencyH || ( docpH > emergencyH - scrollH && docpW > emergencyW ); var needsWStretch = ( docpW > availW && docpW <= emergencyW ) && ( docpH <= emergencyH ) || ( docpW > availW - scrollW && docpW <= emergencyW - scrollW ) && ( docpH > emergencyH ); var needsHStretch = ( docpH > availH && docpH <= emergencyH ) && ( docpW <= emergencyW ) || ( docpH > availH - scrollH && docpH <= emergencyH - scrollH ) && ( docpW > emergencyW ); // Outputs var frameW; var frameH; var contW; var contH; if ( needsWStretch ) { contW = docW; frameW = docpW; } else if ( docpW > availW ) { // form does not even fit with stretching contW = docW; frameW = availW; } else { //contW = Math.max( Math.min( 1.5 * docW, availW ), availW / 2 ); contW = docW; frameW = docpW; } if ( needsVScroll ){ frameW += scrollW; } else { scrollTop = 0; } if ( needsHStretch ) { contH = docH; frameH = docpH; } else if ( docpH > availH ) { // form does not even fit with stretching contH = docH; frameH = availH; } else { //contH = Math.min( 1.1 * docH, availH); contH = docH; frameH = docpH; } if ( needsHScroll ){ frameH += scrollH; } else { scrollLeft = 0; } if ( frameW !== oldFrameW || frameH !== oldFrameH ) { if ( jQuery.browser.safari ) { html[0].style.overflow="hidden"; } else { iframe[0].style.overflow="hidden"; } if ( animate ) { content .width ( 'auto' ) .height ( 'auto' ); container.animate({ width: frameW, height: frameH, top: Math.floor(( - frameH ) / 2), left: Math.floor(( - frameW ) / 2) }, { duration: 500, complete: function() { if ( jQuery.browser.safari ) { html[0].style.overflow="visible"; } else if ( jQuery.browser.msie ) { iframe[0].style.overflow="auto"; } else { iframe[0].style.overflow="visible"; } if ( jQuery.browser.mozilla ) { content .width ( contW ) .height ( contH ); } else { content .width ( 'auto' ) .height ( 'auto' ); } } }); } else { container .width( frameW ) .height ( frameH ); container[0].style.top = (Math.floor(( - frameH ) / 2)) + "px"; container[0].style.left = (Math.floor(( - frameW ) / 2)) + "px"; setTimeout(function(){ if ( jQuery.browser.safari ) { html[0].style.overflow="visible"; } else if ( jQuery.browser.msie ) { iframe[0].style.overflow="auto"; } else { iframe[0].style.overflow="visible"; } }, 100); if ( jQuery.browser.mozilla ) { content .width ( contW ) .height ( contH ); } else { content .width ( 'auto' ) .height ( 'auto' ); } } } else { content .width ( 'auto' ) .height ( 'auto' ); if ( jQuery.browser.safari ) { // Google chrome needs a kick // turn scrollbars off and on again to really only show them when needed html[0].style.overflow="hidden"; setTimeout(function(){ html[0].style.overflow="visible"; }, 1); } } scrollTgt .css('overflow', 'auto') .scrollTop(Math.min(scrollTop, docpH - frameH)) .scrollLeft(scrollLeft); if ( jQuery.browser.mozilla ) { body .css('overflow', 'auto'); } return true; } function handleCloseFrame( event ){ jQuery(window).unbind( "resize", adjustFrameSize ); clearTimeout(timer); fadeOut( container, function(){ background.fadeOut( function(){ wrapper.remove(); }); }); return false; } function fadeIn(elem, callback ) { // no fading for broken browsers if ( brokenBrowser ){ elem.show(); if ( callback ) { callback(); } } else { // what an ugly hack if ( elem === waitIndicator ) { elem.fadeIn( 200, callback ); } else { elem.fadeIn( callback ); } } } function fadeTo(elem, time, target, callback) { // no fading for broken browsers if ( brokenBrowser ){ if (target > 0) { elem[0].style.visibility = "visible"; } else { elem[0].style.visibility = "hidden"; } if ( callback ) { callback(); } } else { elem.fadeTo(time, target, callback); } } function showForm() { instance++; brokenChrome = ( navigator.userAgent.indexOf("Chrome") >= 0 && navigator.platform.indexOf("Linux x86_64") >= 0 ); brokenBrowser= jQuery.browser.msie || brokenChrome; var maxZIndex = 0; jQuery("*").each(function() { var curr = parseInt( jQuery( this ).css( "z-index" ) ); maxZIndex = curr > maxZIndex ? curr : maxZIndex; }); wrapper = jQuery( "
" ); background = jQuery( "
" ); var waitIndicatorWrapper = jQuery( "
" ); waitIndicator = jQuery( "
" ); var anchor = jQuery( "
" ); container = jQuery( "
" ); innerContainer = jQuery( "
" ); iframe = jQuery( "