-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjquery.mgExternal.min.js
7 lines (7 loc) · 18.3 KB
/
jquery.mgExternal.min.js
1
2
3
4
5
6
7
/**
* mgExternal 1.0.30
*
* Copyright 2012 Ricard Osorio Mañanas
* Dual licensed under the MIT or GPL Version 2 licenses.
*/
(function(d){d.fn.mgExternal=function(a,c){var b;this.each(function(){d(this).data("mgExternal")?b=d(this).data("mgExternal"):d(this).data("mgExternal",mgExternal(this,a,c))});return b||this};d.expr[":"].mgExternal=function(a){return!!d(a).data("mgExternal")};d.mgExternal=window.mgExternal=function(a,c,b){if(!(this instanceof mgExternal))return new mgExternal(a,c,b);if(!a||!a.nodeType)b=c,c=a,a=null;"object"==typeof c&&(b=c,c=null);this._unique=Math.random().toString().substr(2);mgExternal.instances.register(this);b=d.extend(!0,{},this.defaults,b,d(a).data("mgExternalOptions"));this.settings={display:"modal",auto:!a,renew:!0,autoFocus:!0,outsideClose:!0,escClose:!0,destroyOnClose:!a,css:{},extraClass:b&&b.display?"inline"!=b.display?"mgE-"+b.display:null:"mgE-modal",activeClass:"active",loadingClass:"loading",showDelay:b&&"tooltip"==b.display&&b.tooltip&&"hover"==b.tooltip.bind?200:0,hideDelay:b&&"tooltip"==b.display&&b.tooltip&&"hover"==b.tooltip.bind?200:0,showSpeed:300,hideSpeed:300,overlayShow:!b||!b.display||"modal"==b.display?!0:!1,overlayColor:"#fff",overlayOpacity:0.7,overlayShowSpeed:300,overlayHideSpeed:300,submitIdentifier:'input[type="submit"]',focusPriority:[":not(:radio):input:visible:enabled:first"],zIndexContainer:999,zIndexTooltipTrigger:998,zIndexOverlay:997,breatheSeparation:b&&"tooltip"==b.display?15:30,ajaxUrl:null,ajaxData:{"mgExternal-unique":this._unique},modal:{animateSpeed:500,onDisableScroll:function(){},onRestoreScroll:function(){}},tooltip:{bind:"click",position:"top center",positionSource:d(a),distance:0,arrowSize:8,arrowDistance:15,arrowFrontColor:null,fit:!0},onCreateElements:function(){},onBeforeShow:function(){},onShow:function(){},onBeforeClose:function(){},onClose:function(){},onDestroy:function(){},onContentReady:function(){},onStartLoading:function(){},onStopLoading:function(){},onJsonData:function(){}};d.extend(!0,this.settings,b);this.$trigger=d(a);this.$container=null;this.$content=b&&"inline"==b.display?this.$trigger:null;this.$tooltipArrow=null;this._defaultContent=c;this._defaultAjaxUrl=this.settings.ajaxUrl;this._lastSubmitName=null;this._show=!1;this._triggerZIndexBackup=null;this._preventNextMouseUp=!1;this._currentAjaxRequest=this._moveTooltipTimeout=null;if(this.$trigger){var e=this;switch(this.settings.display){case "modal":this.$trigger.bind("click",function(a){e.open(e.settings.showDelay);a.preventDefault();a.stopPropagation()});break;case "tooltip":switch(this.settings.tooltip.bind){case "click":this.$trigger.bind("click",function(a){e.isVisible()?e.close():e.open(e.settings.showDelay);a.preventDefault();a.stopPropagation()});break;case "hover":this.$trigger.bind({mouseenter:function(){e.open(e.settings.showDelay)},mouseleave:function(){e.close(e.settings.hideDelay)},mouseup:function(a){a.stopPropagation()}});break;case "focus":this.$trigger.bind({focus:function(){e.open(e.settings.showDelay)},blur:function(){e.close(e.settings.hideDelay)},mouseup:function(a){a.stopPropagation()}})}break;case "inline":this.bindSpecialActions()}}this.settings.auto&&this.open()};mgExternal.instances={_instances:{},register:function(a){this._instances[a._unique]=a},get:function(a){return this._instances[a]}};mgExternal.prototype={defaults:{},_browserScrollbarWidth:17,isVisible:function(){return"inline"==this.settings.display?!0:!!this.$container&&this.$container.is(":visible")},open:function(a){var c=this;this._show=!0;a?setTimeout(function(){c._open()},a):this._open()},_open:function(){if(this._show&&!this.isVisible()){var a=this;if(this.settings.renew||!this.$container){this.settings.ajaxUrl=this._defaultAjaxUrl;this._lastSubmitName=null;var c=this.settings.ajaxUrl||this.$trigger.attr("href");c&&this._defaultContent&&0<=this._defaultContent.indexOf("mgExternal-preloader")?(this.setContent(this._defaultContent),setTimeout(function(){a.$content.find(".mgExternal-preloader").attr("href",c).trigger("click")},this.settings.showSpeed)):this._defaultContent?this.setContent(this._defaultContent):c.match(/\.(jpg|gif|png|bmp|jpeg)(.*)?$/i)?this.setContent('<img src="'+c+'" style="display:block;" />'):this.loadAjaxContent()}else this.isVisible()||this.showContainer()}},close:function(a){var c=this;this._show=!1;a?setTimeout(function(){c._close()},a):this._close()},_close:function(){if(!this._show&&!("inline"==this.settings.display||!this.isVisible()||!1===this.settings.onBeforeClose.call(this))){var a=this;this.abortCurrentAjaxRequest();this.$trigger.removeClass(this.settings.loadingClass).removeClass(this.settings.activeClass);this.settings.onStopLoading.call(this);this.$container.fadeOut(this.settings.hideSpeed,function(){a.settings.destroyOnClose&&a.destroy();"modal"==a.settings.display&&a.settings.overlayShow?(a.$container.parent().hide(),d("body").css({marginRight:"",overflow:""}),a.settings.modal.onRestoreScroll.call(a),d("#mgExternal-overlay").fadeOut(a.settings.overlayHideSpeed,function(){a.settings.onClose.call(a)})):a.settings.onClose.call(a)});"tooltip"==this.settings.display&&this.settings.overlayShow&&d("#mgExternal-overlay").fadeOut(this.settings.overlayHideSpeed,function(){a.$trigger.css({position:a._triggerZIndexBackup.position,zIndex:a._triggerZIndexBackup.zIndex})})}},setContent:function(a,c){!this.$container&&"inline"!=this.settings.display&&this.createElements();"modal"==this.settings.display&&(c=c||{type:"resize"},c.$preContent=this.$content.clone(!1),c.preHeight=this.$content.height(),c.preWidth=this.$content.width());var b=this.$content.clone();"inline"==this.settings.display?b.insertBefore(this.$content):b.appendTo(this.$container);this.$content.html(a).css({left:0,top:0,position:"absolute",visibility:"hidden"}).children().css({marginLeft:0,marginRight:0}).first().css("margin-top","0").end().last().css("margin-bottom","0").end().end().appendTo("body");this.bindSpecialActions();this.settings.onContentReady.call(this);this.$content.css({left:"",top:"",position:"",visibility:""});"inline"==this.settings.display?this.$content.insertAfter(b):this.$content.appendTo(this.$container);b.remove();this.isVisible()&&1==this.$container.css("opacity")?(this.setFocus(),this.moveContainer(c)):this.showContainer()},showContainer:function(){if(!("inline"==this.settings.display||!1===this.settings.onBeforeShow.call(this))){var a=this;this.$trigger.addClass(this.settings.activeClass);"tooltip"==this.settings.display&&this.settings.overlayShow&&(this._triggerZIndexBackup={position:"static"==this.$trigger.css("position")?"":this.$trigger.css("position"),zIndex:0==this.$trigger.css("z-index")?"":this.$trigger.css("z-index")},this.$trigger.css({position:this._triggerZIndexBackup.position?null:"relative",zIndex:this.settings.zIndexTooltipTrigger}));var c=function(){"modal"==a.settings.display&&a.settings.overlayShow&&a.$container.parent().show();a.$container.css("visibility","hidden").show();a.moveContainer({type:"instant"});a.$container.hide().css("visibility","");a.$container.fadeIn(a.settings.showSpeed,function(){a.setFocus();a.settings.onShow.call(a)})};if(this.settings.overlayShow){var b=d("#mgExternal-overlay");b.css({background:this.settings.overlayColor,opacity:this.settings.overlayOpacity});"modal"==this.settings.display?(d("body").css({marginRight:this._browserScrollbarWidth,overflow:"hidden"}),this.settings.modal.onDisableScroll.call(this),b.fadeIn(this.settings.overlayShowSpeed,c)):(b.fadeIn(this.settings.overlayShowSpeed),c())}else c()}},destroy:function(){"modal"==this.settings.display&&this.settings.overlayShow?this.$container.parent().remove():this.$container.remove();this.settings.onDestroy.call(this);this.$trigger.removeData("mgExternal")},bindSpecialActions:function(){var a=this;this.$content.find("form").bind("submit mgExternal_submit",function(c){c.preventDefault();var b=d(this);"mgExternal_submit"==c.type?a.loadAjaxContent(b,{type:"move"},100):setTimeout(function(){c.isPropagationStopped()||b.trigger("mgExternal_submit")},100)});this.$content.find('[class*="mgExternal-redirect"]').bind("click",function(c){var b=d(this);b.addClass(a.settings.loadingClass);var e={};"modal"==a.settings.display&&(e.type=b.is('[class*="redirect-fade"]')?"fade":b.is('[class*="redirect-move"]')?"move":b.is('[class*="redirect-instant"]')?"instant":"resize");a.settings.ajaxUrl=b.attr("href");a.loadAjaxContent(null,e);c.preventDefault()});this.$content.find(".mgExternal-close").bind("click",function(c){a.close();c.preventDefault()})},abortCurrentAjaxRequest:function(){this._currentAjaxRequest&&(this._currentAjaxRequest.abort(),this._currentAjaxRequest=null)},loadAjaxContent:function(a,c){this.abortCurrentAjaxRequest();var b=this,e=d.extend({},b.settings.ajaxData);this.$trigger.addClass(this.settings.loadingClass);this.settings.onStartLoading.call(this);a&&(this._lastSubmitName=a.find(this.settings.submitIdentifier).val(),a.find(":input").each(function(){d(this).is(":checkbox")?e[d(this).attr("name")]=d(this).prop("checked")?1:0:d(this).is(":radio")?d(this).prop("checked")&&(e[d(this).attr("name")]=d(this).val()):e[d(this).attr("name")]=d(this).val()}));if(a&&"multipart/form-data"==a.attr("enctype")){var k="mgExternal-iframe"+Math.floor(99999*Math.random());d('<iframe name="'+k+'" id="'+k+'" src="" style="display:none;"></iframe>').appendTo("body").bind("load",function(){b.$trigger.removeClass(b.settings.loadingClass);b.settings.onStopLoading.call(b);var a=d(this).contents().find("body").html();try{var e=eval("("+a+")");if("object"==typeof e){b.settings.onJsonData.call(b,e);return}}catch(f){}b.setContent(a,c)});a.clone().insertAfter(a);d.each(this.settings.ajaxData,function(b,c){a.append('<input type="hidden" name="'+b+'" value="'+c+'" />')});a.appendTo(d("#"+k)).attr("action",this.settings.ajaxUrl||this.$trigger.attr("href")).attr("target",k).append('<input type="hidden" name="is_iframe" value="true" />').unbind("submit").trigger("submit")}else this._currentAjaxRequest=d.ajax({url:this.settings.ajaxUrl||this.$trigger.attr("href"),type:a?"POST":"GET",data:e,success:function(a){b._currentAjaxRequest=null;b.$trigger.removeClass(b.settings.loadingClass);b.settings.onStopLoading.call(b);"object"==typeof a?b.settings.onJsonData.call(b,a):b.setContent(a,c)},error:function(a,d){b._currentAjaxRequest=null;"abort"!==d&&(b.$trigger.removeClass(b.settings.loadingClass),b.settings.onStopLoading.call(b),b.setContent('<div class="notice alert">S\'ha produ\u00eft un error</div>',c))}});this.$content&&this.setLoadingState()},setLoadingState:function(){this.$content.find(":input").prop("disabled",!0).addClass("disabled");this.$content.find(".mgExternal-loading").show()},disableLoadingState:function(){this.$content.find(":input").prop("disabled",!1).removeClass("disabled");this.$content.find(".mgExternal-loading").hide()},setFocus:function(){if(this.settings.autoFocus){var a=this.$content.find(this.settings.submitIdentifier+'[value="'+this._lastSubmitName+'"]').parents("form:visible");0==a.length&&(a=this.$content.find("form:first:visible"));0==a.length&&(a=this.$content);for(var c=0,b=a.find(this.settings.focusPriority[c]);0==b.length&&c<=this.settings.focusPriority.length;b=a.find(this.settings.focusPriority[++c]));setTimeout(function(){b.trigger("focus")},10)}},createElements:function(){var a=this;this.$container||(this.$container=d("<div/>").addClass("mgExternal-container").addClass(this.settings.extraClass).css({position:"absolute",zIndex:this.settings.zIndexContainer}).hide().appendTo("modal"==this.settings.display&&this.settings.overlayShow?d("<div/>").css({height:"100%",left:0,overflowY:"scroll",position:"fixed",top:0,width:"100%",zIndex:this.settings.zIndexContainer}).appendTo("body"):"body").bind("mouseup",function(){a._preventNextMouseUp=!0}),this.$content=d("<div/>").addClass("mgExternal-content").css(this.settings.css).appendTo(this.$container),"hover"==this.settings.tooltip.bind&&(this.$container.bind("mouseenter",function(){a.open(a.settings.showDelay)}),this.$container.bind("mouseleave",function(){a.close(a.settings.hideDelay)})),d(window).bind("resize",function(){a.moveContainer()}),"tooltip"==this.settings.display&&d(window).bind("scroll",function(){a.moveContainer()}),this.settings.outsideClose&&d("body").bind("mouseup",function(c){!a.$trigger.is(c.target)&&!a.$trigger.find(c.target).length&&(a._preventNextMouseUp?a._preventNextMouseUp=!1:1==c.which&&a.isVisible()&&(!c.originalEvent.originalTarget||!(c.originalEvent.originalTarget instanceof XULElement))&&a.close())}),this.settings.escClose&&d(document).bind("keyup",function(c){27==c.keyCode&&a.close()}),a.settings.onCreateElements.call(a));this.settings.overlayShow&&0==d("#mgExternal-overlay").length&&d("<div/>").attr("id","mgExternal-overlay").css({height:"100%",left:0,position:"fixed",top:0,width:"100%",zIndex:this.settings.zIndexOverlay}).hide().appendTo("body");!this.$tooltipArrow&&("tooltip"==this.settings.display&&this.settings.tooltip.arrowSize)&&(this.$tooltipArrow=d("<div/>").addClass("mgExternal-arrow").css({position:"absolute"}).appendTo(this.$container).append(d("<div/>").addClass("mgExternal-arrow-shadow").css({borderStyle:"solid",borderWidth:this.settings.tooltip.arrowSize})).append(d("<div/>").addClass("mgExternal-arrow-front").css({borderColor:this.settings.tooltip.arrowFrontColor||this.$content.css("background-color"),borderStyle:"solid",borderWidth:this.settings.tooltip.arrowSize,position:"absolute"})))},moveContainer:function(a){if(this.isVisible())switch(this.settings.display){case "modal":this.moveModal(a);break;case "tooltip":this.moveTooltip()}},moveModal:function(a){var c=this,b=0,e=0,k=this.settings.breatheSeparation;this.$container.css("padding",k+"px 0 "+2*k+"px");a=a||{type:"resize"};if(!a.preHeight||!a.preWidth)a.preHeight=this.$content.height(),a.preWidth=this.$content.width();this.$content.stop().css({height:this.settings.css.height||"",width:this.settings.css.width||""});a.postHeight=this.$content.height();a.postWidth=this.$content.width();var k=this.$container.outerHeight(!0),l=this.$container.outerWidth(!0),t=d(window).height(),f=d(window).width(),j=this.settings.overlayShow?0:d(document).scrollTop();this.settings.overlayShow&&(l+=this._browserScrollbarWidth);k<t&&(b=j+(t-k)/2);b<j&&(b=j);e=(f-l)/2;0>e&&(e=0);switch(a.type){case "fade":this.$content.hide();this.$container.append(a.$preContent).fadeOut(this.settings.modal.animateSpeed,function(){a.$preContent.remove();c.$content.show();c.$container.css({top:b,left:e}).fadeIn(c.settings.modal.animateSpeed,function(){c.setFocus()})});break;case "move":this.$container.stop().animate({top:b,left:e,opacity:1},this.settings.modal.animateSpeed);break;case "instant":this.$container.stop().css({top:b,left:e,opacity:1});break;default:this.$content.css({height:a.preHeight,width:a.preWidth}).animate({height:a.postHeight,width:a.postWidth},this.settings.modal.animateSpeed,function(){c.$content.css("height",c.settings.css.height||"")}),this.$container.stop().animate({top:b,left:e,opacity:1},this.settings.modal.animateSpeed)}},moveTooltip:function(){var a,c,b,e,k,l,t=this;if((!this.settings.css.height||!this.settings.css.width)&&!this._moveTooltipTimeout){this._moveTooltipTimeout=setTimeout(function(){t._moveTooltipTimeout=null},200);var f=this.$container.clone();f.css({left:0,top:0,visibility:"hidden"}).find(".mgExternal-content").css({height:this.settings.css.height||"",width:this.settings.css.width||""}).end().show().appendTo("body");this.$content.css({width:f.find(".mgExternal-content").width()});f.remove()}var f={top:0,left:0},j=this.settings.breatheSeparation;k=d(window).height();var p=d(window).width(),m=this.$container.outerHeight(!0),n=this.$container.outerWidth(!0),u=this.settings.tooltip.positionSource,i=u.offset(),r=u.outerHeight(),s=u.outerWidth();a=this.settings.tooltip.distance;var g=this.settings.tooltip.arrowSize,q=this.settings.tooltip.arrowDistance,v=d(document).scrollTop();l=d(document).scrollLeft();var h=this.settings.tooltip.position.split(" ")[0];c=this.settings.tooltip.position.split(" ")[1];this.settings.tooltip.fit&&("bottom"==h&&k<i.top-v+r+m+j&&(h="top"),"top"==h&&i.top-v-j<m&&(h="bottom"),"right"==h&&p<i.left-l+s+n+j&&(h="left"),"left"==h&&i.left-l-j<n&&(h="right"));switch(h){case "top":f.top=i.top-m-a-g;break;case "bottom":f.top=i.top+r+a+g;break;case "left":f.left=i.left-n-a-g;break;case "right":f.left=i.left+s+a+g}switch(c){case "top":f.top=i.top;break;case "middle":f.top=i.top-m/2+r/2;break;case "bottom":f.top=i.top-m+r;break;case "left":f.left=i.left;break;case "center":f.left=i.left-n/2+s/2;break;case "right":f.left=i.left-n+s}if(this.settings.tooltip.fit){"left"==h||"right"==h?(a="top",c=r,b=i.top,e=m,l=v):(a="left",c=s,b=i.left,e=n,k=p);for(;f[a]-l+e+j>k;)if(p=!1,e>=c?f[a]+e>b+c&&(p=!0):f[a]>b&&(p=!0),p)f[a]--;else break;for(;f[a]-l<j;)if(p=!1,e>=c?f[a]<b&&(p=!0):f[a]+e<b+c&&(p=!0),p)f[a]++;else break;if(g&&c<g+2*q&&(j=b+c/2-g-f[a],l=f[a]+e-b-c/2-g,!(j<q&&l<q)&&(j<q&&(f[a]=b+c/2-g-q),l<q&&(f[a]=b-e+c/2+g+q,j=b+c/2-g-f[a]),j=b+c/2-g-f[a],l=f[a]+e-b-c/2-g,j<q||l<q)))f[a]=b-(e-2*g)/2}g?(this.$tooltipArrow||this.createElements(),this.$tooltipArrow.show(),"top"==h||"bottom"==h?this.$tooltipArrow.css({bottom:"top"==h?-g:"",height:g,left:n<s?n/2-g:i.left-f.left+s/2-g,top:"top"==h?"":-g,width:2*g}).find("div").css({borderLeftColor:"transparent",borderRightColor:"transparent",borderBottomWidth:"top"==h?0:g,borderTopWidth:"bottom"==h?0:g}).filter(".mgExternal-arrow-front").css({left:0,top:("top"==h?"-":"")+this.$content.css("borderBottomWidth")}).end().filter(".mgExternal-arrow-shadow").css("border-"+h+"-color",this.$content.css("border-"+("top"==h?"bottom":"top")+"-color")):this.$tooltipArrow.css({bottom:"",height:2*g,left:"left"==h?"":-g,right:"right"==h?"":-g,top:m<r?m/2-g:i.top-f.top+r/2-g,width:g}).find("div").css({borderBottomColor:"transparent",borderTopColor:"transparent",borderLeftWidth:"right"==h?0:g,borderRightWidth:"left"==h?0:g}).filter(".mgExternal-arrow-front").css({left:("left"==h?"-":"")+this.$content.css("borderBottomWidth"),top:0}).end().filter(".mgExternal-arrow-shadow").css("border-"+h+"-color",this.$content.css("border-"+("left"==h?"right":"left")+"-color"))):this.$tooltipArrow&&this.$tooltipArrow.hide();if("bottom"==h){m=u;for(n=!1;!m.is("body");){if("fixed"==m.css("position")){n=!0;break}m=m.parent()}n?(f.position="fixed",f.top-=v):f.position="absolute"}this.$container.css(f)}};d(function(){var a=d("<div/>").css({height:100,overflow:"hidden",position:"absolute",width:100}).append(d("<div/>").css("height","100%")).appendTo("body");window.mgExternal.prototype._browserScrollbarWidth=a.find("> div").width()-a.css("overflow-y","scroll").find("> div").width();a.remove()})})(jQuery,window);