muck-engine 0.4.23 → 0.4.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/VERSION +1 -1
- data/app/helpers/muck_engine_helper.rb +1 -1
- data/app/views/shared/_output_ajax_messages.erb +16 -0
- data/lib/muck_engine/flash_errors.rb +22 -5
- data/muck-engine.gemspec +27 -3
- data/public/javascripts/jquery/jquery.easing.js +45 -71
- data/public/javascripts/muck-src.js +13 -0
- data/public/javascripts/muck.js +2 -1
- data/test/rails_root/lib/tasks/muck.rake +7 -0
- data/test/rails_root/public/images/admin/Home.gif +0 -0
- data/test/rails_root/public/images/admin/source/Home.png +0 -0
- data/test/rails_root/public/images/fancybox/blank.gif +0 -0
- data/test/rails_root/public/images/fancybox/fancy_close.png +0 -0
- data/test/rails_root/public/images/fancybox/fancy_loading.png +0 -0
- data/test/rails_root/public/images/fancybox/fancy_nav_left.png +0 -0
- data/test/rails_root/public/images/fancybox/fancy_nav_right.png +0 -0
- data/test/rails_root/public/images/fancybox/fancy_shadow_e.png +0 -0
- data/test/rails_root/public/images/fancybox/fancy_shadow_n.png +0 -0
- data/test/rails_root/public/images/fancybox/fancy_shadow_ne.png +0 -0
- data/test/rails_root/public/images/fancybox/fancy_shadow_nw.png +0 -0
- data/test/rails_root/public/images/fancybox/fancy_shadow_s.png +0 -0
- data/test/rails_root/public/images/fancybox/fancy_shadow_se.png +0 -0
- data/test/rails_root/public/images/fancybox/fancy_shadow_sw.png +0 -0
- data/test/rails_root/public/images/fancybox/fancy_shadow_w.png +0 -0
- data/test/rails_root/public/images/fancybox/fancy_title_left.png +0 -0
- data/test/rails_root/public/images/fancybox/fancy_title_main.png +0 -0
- data/test/rails_root/public/images/fancybox/fancy_title_over.png +0 -0
- data/test/rails_root/public/images/fancybox/fancy_title_right.png +0 -0
- data/test/rails_root/public/images/fancybox/fancybox-x.png +0 -0
- data/test/rails_root/public/images/fancybox/fancybox-y.png +0 -0
- data/test/rails_root/public/images/fancybox/fancybox.png +0 -0
- data/test/rails_root/public/images/service_icons/16/fireeagle.png +0 -0
- data/test/rails_root/public/images/service_icons/24/fireeagle.png +0 -0
- data/test/rails_root/public/images/service_icons/48/fireeagle.png +0 -0
- data/test/rails_root/public/images/service_icons/60/fireeagle.png +0 -0
- data/test/rails_root/public/images/service_icons/source/fireeagle.psd +0 -0
- data/test/rails_root/public/javascripts/jquery/jquery.easing.js +72 -1
- data/test/rails_root/public/javascripts/jquery/jquery.fancybox.js +34 -6
- data/test/rails_root/public/javascripts/jquery/jquery.form.js +511 -473
- data/test/rails_root/public/javascripts/jquery/jquery.jgrowl.js +9 -2
- data/test/rails_root/public/javascripts/jquery/jquery.js +150 -15
- data/test/rails_root/public/javascripts/jquery/jquery.mousewheel.js +13 -0
- data/test/rails_root/public/javascripts/muck-countries.js +50 -0
- data/test/rails_root/public/javascripts/muck-src.js +147 -0
- data/test/rails_root/public/javascripts/muck.js +7 -91
- data/test/rails_root/public/stylesheets/jquery/cupertino/jquery-ui-1.7.2.custom.css +160 -0
- data/test/rails_root/public/stylesheets/jquery/jquery.fancybox.css +77 -38
- data/test/rails_root/public/stylesheets/jquery/redmond/jquery-ui-1.7.2.custom.css +160 -0
- data/test/rails_root/public/stylesheets/jquery/smoothness/jquery-ui-1.7.2.custom.css +160 -0
- data/test/rails_root/public/stylesheets/jquery/ui-lightness/jquery-ui-1.7.2.custom.css +160 -0
- metadata +28 -4
- data/app/views/admin/shared/_output_admin_messages.js.erb +0 -2
@@ -1,16 +1,44 @@
|
|
1
1
|
/*
|
2
2
|
* FancyBox - jQuery Plugin
|
3
|
-
*
|
3
|
+
* Simple and fancy lightbox alternative
|
4
4
|
*
|
5
|
-
* Copyright (c) 2009 Janis Skarnelis
|
6
5
|
* Examples and documentation at: http://fancybox.net
|
7
6
|
*
|
8
|
-
*
|
7
|
+
* Copyright (c) 2008 - 2010 Janis Skarnelis
|
8
|
+
*
|
9
|
+
* Version: 1.3.1 (05/03/2010)
|
9
10
|
* Requires: jQuery v1.3+
|
10
|
-
*
|
11
|
+
*
|
11
12
|
* Dual licensed under the MIT and GPL licenses:
|
12
13
|
* http://www.opensource.org/licenses/mit-license.php
|
13
14
|
* http://www.gnu.org/licenses/gpl.html
|
14
15
|
*/
|
15
|
-
|
16
|
-
|
16
|
+
|
17
|
+
(function(b){var m,u,x,g,D,i,z,A,B,p=0,e={},q=[],n=0,c={},j=[],E=null,s=new Image,G=/\.(jpg|gif|png|bmp|jpeg)(.*)?$/i,S=/[^\.]\.(swf)\s*$/i,H,I=1,k,l,h=false,y=b.extend(b("<div/>")[0],{prop:0}),v=0,O=!b.support.opacity&&!window.XMLHttpRequest,J=function(){u.hide();s.onerror=s.onload=null;E&&E.abort();m.empty()},P=function(){b.fancybox('<p id="fancybox_error">The requested content cannot be loaded.<br />Please try again later.</p>',{scrolling:"no",padding:20,transitionIn:"none",transitionOut:"none"})},
|
18
|
+
K=function(){return[b(window).width(),b(window).height(),b(document).scrollLeft(),b(document).scrollTop()]},T=function(){var a=K(),d={},f=c.margin,o=c.autoScale,t=(20+f)*2,w=(20+f)*2,r=c.padding*2;if(c.width.toString().indexOf("%")>-1){d.width=a[0]*parseFloat(c.width)/100-40;o=false}else d.width=c.width+r;if(c.height.toString().indexOf("%")>-1){d.height=a[1]*parseFloat(c.height)/100-40;o=false}else d.height=c.height+r;if(o&&(d.width>a[0]-t||d.height>a[1]-w))if(e.type=="image"||e.type=="swf"){t+=r;
|
19
|
+
w+=r;o=Math.min(Math.min(a[0]-t,c.width)/c.width,Math.min(a[1]-w,c.height)/c.height);d.width=Math.round(o*(d.width-r))+r;d.height=Math.round(o*(d.height-r))+r}else{d.width=Math.min(d.width,a[0]-t);d.height=Math.min(d.height,a[1]-w)}d.top=a[3]+(a[1]-(d.height+40))*0.5;d.left=a[2]+(a[0]-(d.width+40))*0.5;if(c.autoScale===false){d.top=Math.max(a[3]+f,d.top);d.left=Math.max(a[2]+f,d.left)}return d},U=function(a){if(a&&a.length)switch(c.titlePosition){case "inside":return a;case "over":return'<span id="fancybox-title-over">'+
|
20
|
+
a+"</span>";default:return'<span id="fancybox-title-wrap"><span id="fancybox-title-left"></span><span id="fancybox-title-main">'+a+'</span><span id="fancybox-title-right"></span></span>'}return false},V=function(){var a=c.title,d=l.width-c.padding*2,f="fancybox-title-"+c.titlePosition;b("#fancybox-title").remove();v=0;if(c.titleShow!==false){a=b.isFunction(c.titleFormat)?c.titleFormat(a,j,n,c):U(a);if(!(!a||a==="")){b('<div id="fancybox-title" class="'+f+'" />').css({width:d,paddingLeft:c.padding,
|
21
|
+
paddingRight:c.padding}).html(a).appendTo("body");switch(c.titlePosition){case "inside":v=b("#fancybox-title").outerHeight(true)-c.padding;l.height+=v;break;case "over":b("#fancybox-title").css("bottom",c.padding);break;default:b("#fancybox-title").css("bottom",b("#fancybox-title").outerHeight(true)*-1);break}b("#fancybox-title").appendTo(D).hide()}}},W=function(){b(document).unbind("keydown.fb").bind("keydown.fb",function(a){if(a.keyCode==27&&c.enableEscapeButton){a.preventDefault();b.fancybox.close()}else if(a.keyCode==
|
22
|
+
37){a.preventDefault();b.fancybox.prev()}else if(a.keyCode==39){a.preventDefault();b.fancybox.next()}});if(b.fn.mousewheel){g.unbind("mousewheel.fb");j.length>1&&g.bind("mousewheel.fb",function(a,d){a.preventDefault();h||d===0||(d>0?b.fancybox.prev():b.fancybox.next())})}if(c.showNavArrows){if(c.cyclic&&j.length>1||n!==0)A.show();if(c.cyclic&&j.length>1||n!=j.length-1)B.show()}},X=function(){var a,d;if(j.length-1>n){a=j[n+1].href;if(typeof a!=="undefined"&&a.match(G)){d=new Image;d.src=a}}if(n>0){a=
|
23
|
+
j[n-1].href;if(typeof a!=="undefined"&&a.match(G)){d=new Image;d.src=a}}},L=function(){i.css("overflow",c.scrolling=="auto"?c.type=="image"||c.type=="iframe"||c.type=="swf"?"hidden":"auto":c.scrolling=="yes"?"auto":"visible");if(!b.support.opacity){i.get(0).style.removeAttribute("filter");g.get(0).style.removeAttribute("filter")}b("#fancybox-title").show();c.hideOnContentClick&&i.one("click",b.fancybox.close);c.hideOnOverlayClick&&x.one("click",b.fancybox.close);c.showCloseButton&&z.show();W();b(window).bind("resize.fb",
|
24
|
+
b.fancybox.center);c.centerOnScroll?b(window).bind("scroll.fb",b.fancybox.center):b(window).unbind("scroll.fb");b.isFunction(c.onComplete)&&c.onComplete(j,n,c);h=false;X()},M=function(a){var d=Math.round(k.width+(l.width-k.width)*a),f=Math.round(k.height+(l.height-k.height)*a),o=Math.round(k.top+(l.top-k.top)*a),t=Math.round(k.left+(l.left-k.left)*a);g.css({width:d+"px",height:f+"px",top:o+"px",left:t+"px"});d=Math.max(d-c.padding*2,0);f=Math.max(f-(c.padding*2+v*a),0);i.css({width:d+"px",height:f+
|
25
|
+
"px"});if(typeof l.opacity!=="undefined")g.css("opacity",a<0.5?0.5:a)},Y=function(a){var d=a.offset();d.top+=parseFloat(a.css("paddingTop"))||0;d.left+=parseFloat(a.css("paddingLeft"))||0;d.top+=parseFloat(a.css("border-top-width"))||0;d.left+=parseFloat(a.css("border-left-width"))||0;d.width=a.width();d.height=a.height();return d},Q=function(){var a=e.orig?b(e.orig):false,d={};if(a&&a.length){a=Y(a);d={width:a.width+c.padding*2,height:a.height+c.padding*2,top:a.top-c.padding-20,left:a.left-c.padding-
|
26
|
+
20}}else{a=K();d={width:1,height:1,top:a[3]+a[1]*0.5,left:a[2]+a[0]*0.5}}return d},N=function(){u.hide();if(g.is(":visible")&&b.isFunction(c.onCleanup))if(c.onCleanup(j,n,c)===false){b.event.trigger("fancybox-cancel");h=false;return}j=q;n=p;c=e;i.get(0).scrollTop=0;i.get(0).scrollLeft=0;if(c.overlayShow){O&&b("select:not(#fancybox-tmp select)").filter(function(){return this.style.visibility!=="hidden"}).css({visibility:"hidden"}).one("fancybox-cleanup",function(){this.style.visibility="inherit"});
|
27
|
+
x.css({"background-color":c.overlayColor,opacity:c.overlayOpacity}).unbind().show()}l=T();V();if(g.is(":visible")){b(z.add(A).add(B)).hide();var a=g.position(),d;k={top:a.top,left:a.left,width:g.width(),height:g.height()};d=k.width==l.width&&k.height==l.height;i.fadeOut(c.changeFade,function(){var f=function(){i.html(m.contents()).fadeIn(c.changeFade,L)};b.event.trigger("fancybox-change");i.empty().css("overflow","hidden");if(d){i.css({top:c.padding,left:c.padding,width:Math.max(l.width-c.padding*
|
28
|
+
2,1),height:Math.max(l.height-c.padding*2-v,1)});f()}else{i.css({top:c.padding,left:c.padding,width:Math.max(k.width-c.padding*2,1),height:Math.max(k.height-c.padding*2,1)});y.prop=0;b(y).animate({prop:1},{duration:c.changeSpeed,easing:c.easingChange,step:M,complete:f})}})}else{g.css("opacity",1);if(c.transitionIn=="elastic"){k=Q();i.css({top:c.padding,left:c.padding,width:Math.max(k.width-c.padding*2,1),height:Math.max(k.height-c.padding*2,1)}).html(m.contents());g.css(k).show();if(c.opacity)l.opacity=
|
29
|
+
0;y.prop=0;b(y).animate({prop:1},{duration:c.speedIn,easing:c.easingIn,step:M,complete:L})}else{i.css({top:c.padding,left:c.padding,width:Math.max(l.width-c.padding*2,1),height:Math.max(l.height-c.padding*2-v,1)}).html(m.contents());g.css(l).fadeIn(c.transitionIn=="none"?0:c.speedIn,L)}}},F=function(){m.width(e.width);m.height(e.height);if(e.width=="auto")e.width=m.width();if(e.height=="auto")e.height=m.height();N()},Z=function(){h=true;e.width=s.width;e.height=s.height;b("<img />").attr({id:"fancybox-img",
|
30
|
+
src:s.src,alt:e.title}).appendTo(m);N()},C=function(){J();var a=q[p],d,f,o,t,w;e=b.extend({},b.fn.fancybox.defaults,typeof b(a).data("fancybox")=="undefined"?e:b(a).data("fancybox"));o=a.title||b(a).title||e.title||"";if(a.nodeName&&!e.orig)e.orig=b(a).children("img:first").length?b(a).children("img:first"):b(a);if(o===""&&e.orig)o=e.orig.attr("alt");d=a.nodeName&&/^(?:javascript|#)/i.test(a.href)?e.href||null:e.href||a.href||null;if(e.type){f=e.type;if(!d)d=e.content}else if(e.content)f="html";else if(d)if(d.match(G))f=
|
31
|
+
"image";else if(d.match(S))f="swf";else if(b(a).hasClass("iframe"))f="iframe";else if(d.match(/#/)){a=d.substr(d.indexOf("#"));f=b(a).length>0?"inline":"ajax"}else f="ajax";else f="inline";e.type=f;e.href=d;e.title=o;if(e.autoDimensions&&e.type!=="iframe"&&e.type!=="swf"){e.width="auto";e.height="auto"}if(e.modal){e.overlayShow=true;e.hideOnOverlayClick=false;e.hideOnContentClick=false;e.enableEscapeButton=false;e.showCloseButton=false}if(b.isFunction(e.onStart))if(e.onStart(q,p,e)===false){h=false;
|
32
|
+
return}m.css("padding",20+e.padding+e.margin);b(".fancybox-inline-tmp").unbind("fancybox-cancel").bind("fancybox-change",function(){b(this).replaceWith(i.children())});switch(f){case "html":m.html(e.content);F();break;case "inline":b('<div class="fancybox-inline-tmp" />').hide().insertBefore(b(a)).bind("fancybox-cleanup",function(){b(this).replaceWith(i.children())}).bind("fancybox-cancel",function(){b(this).replaceWith(m.children())});b(a).appendTo(m);F();break;case "image":h=false;b.fancybox.showActivity();
|
33
|
+
s=new Image;s.onerror=function(){P()};s.onload=function(){s.onerror=null;s.onload=null;Z()};s.src=d;break;case "swf":t='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="'+e.width+'" height="'+e.height+'"><param name="movie" value="'+d+'"></param>';w="";b.each(e.swf,function(r,R){t+='<param name="'+r+'" value="'+R+'"></param>';w+=" "+r+'="'+R+'"'});t+='<embed src="'+d+'" type="application/x-shockwave-flash" width="'+e.width+'" height="'+e.height+'"'+w+"></embed></object>";m.html(t);
|
34
|
+
F();break;case "ajax":a=d.split("#",2);f=e.ajax.data||{};if(a.length>1){d=a[0];if(typeof f=="string")f+="&selector="+a[1];else f.selector=a[1]}h=false;b.fancybox.showActivity();E=b.ajax(b.extend(e.ajax,{url:d,data:f,error:P,success:function(r){if(E.status==200){m.html(r);F()}}}));break;case "iframe":b('<iframe id="fancybox-frame" name="fancybox-frame'+(new Date).getTime()+'" frameborder="0" hspace="0" scrolling="'+e.scrolling+'" src="'+e.href+'"></iframe>').appendTo(m);N();break}},$=function(){if(u.is(":visible")){b("div",
|
35
|
+
u).css("top",I*-40+"px");I=(I+1)%12}else clearInterval(H)},aa=function(){if(!b("#fancybox-wrap").length){b("body").append(m=b('<div id="fancybox-tmp"></div>'),u=b('<div id="fancybox-loading"><div></div></div>'),x=b('<div id="fancybox-overlay"></div>'),g=b('<div id="fancybox-wrap"></div>'));if(!b.support.opacity){g.addClass("fancybox-ie");u.addClass("fancybox-ie")}D=b('<div id="fancybox-outer"></div>').append('<div class="fancy-bg" id="fancy-bg-n"></div><div class="fancy-bg" id="fancy-bg-ne"></div><div class="fancy-bg" id="fancy-bg-e"></div><div class="fancy-bg" id="fancy-bg-se"></div><div class="fancy-bg" id="fancy-bg-s"></div><div class="fancy-bg" id="fancy-bg-sw"></div><div class="fancy-bg" id="fancy-bg-w"></div><div class="fancy-bg" id="fancy-bg-nw"></div>').appendTo(g);
|
36
|
+
D.append(i=b('<div id="fancybox-inner"></div>'),z=b('<a id="fancybox-close"></a>'),A=b('<a href="javascript:;" id="fancybox-left"><span class="fancy-ico" id="fancybox-left-ico"></span></a>'),B=b('<a href="javascript:;" id="fancybox-right"><span class="fancy-ico" id="fancybox-right-ico"></span></a>'));z.click(b.fancybox.close);u.click(b.fancybox.cancel);A.click(function(a){a.preventDefault();b.fancybox.prev()});B.click(function(a){a.preventDefault();b.fancybox.next()});if(O){x.get(0).style.setExpression("height",
|
37
|
+
"document.body.scrollHeight > document.body.offsetHeight ? document.body.scrollHeight : document.body.offsetHeight + 'px'");u.get(0).style.setExpression("top","(-20 + (document.documentElement.clientHeight ? document.documentElement.clientHeight/2 : document.body.clientHeight/2 ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop )) + 'px'");D.prepend('<iframe id="fancybox-hide-sel-frame" src="javascript:\'\';" scrolling="no" frameborder="0" ></iframe>')}}};
|
38
|
+
b.fn.fancybox=function(a){b(this).data("fancybox",b.extend({},a,b.metadata?b(this).metadata():{})).unbind("click.fb").bind("click.fb",function(d){d.preventDefault();if(!h){h=true;b(this).blur();q=[];p=0;d=b(this).attr("rel")||"";if(!d||d==""||d==="nofollow")q.push(this);else{q=b("a[rel="+d+"], area[rel="+d+"]");p=q.index(this)}C();return false}});return this};b.fancybox=function(a,d){if(!h){h=true;d=typeof d!=="undefined"?d:{};q=[];p=d.index||0;if(b.isArray(a)){for(var f=0,o=a.length;f<o;f++)if(typeof a[f]==
|
39
|
+
"object")b(a[f]).data("fancybox",b.extend({},d,a[f]));else a[f]=b({}).data("fancybox",b.extend({content:a[f]},d));q=jQuery.merge(q,a)}else{if(typeof a=="object")b(a).data("fancybox",b.extend({},d,a));else a=b({}).data("fancybox",b.extend({content:a},d));q.push(a)}if(p>q.length||p<0)p=0;C()}};b.fancybox.showActivity=function(){clearInterval(H);u.show();H=setInterval($,66)};b.fancybox.hideActivity=function(){u.hide()};b.fancybox.next=function(){return b.fancybox.pos(n+1)};b.fancybox.prev=function(){return b.fancybox.pos(n-
|
40
|
+
1)};b.fancybox.pos=function(a){if(!h){a=parseInt(a,10);if(a>-1&&j.length>a){p=a;C()}if(c.cyclic&&j.length>1&&a<0){p=j.length-1;C()}if(c.cyclic&&j.length>1&&a>=j.length){p=0;C()}}};b.fancybox.cancel=function(){if(!h){h=true;b.event.trigger("fancybox-cancel");J();e&&b.isFunction(e.onCancel)&&e.onCancel(q,p,e);h=false}};b.fancybox.close=function(){function a(){x.fadeOut("fast");g.hide();b.event.trigger("fancybox-cleanup");i.empty();b.isFunction(c.onClosed)&&c.onClosed(j,n,c);j=e=[];n=p=0;c=e={};h=false}
|
41
|
+
if(!(h||g.is(":hidden"))){h=true;if(c&&b.isFunction(c.onCleanup))if(c.onCleanup(j,n,c)===false){h=false;return}J();b(z.add(A).add(B)).hide();b("#fancybox-title").remove();g.add(i).add(x).unbind();b(window).unbind("resize.fb scroll.fb");b(document).unbind("keydown.fb");i.css("overflow","hidden");if(c.transitionOut=="elastic"){k=Q();var d=g.position();l={top:d.top,left:d.left,width:g.width(),height:g.height()};if(c.opacity)l.opacity=1;y.prop=1;b(y).animate({prop:0},{duration:c.speedOut,easing:c.easingOut,
|
42
|
+
step:M,complete:a})}else g.fadeOut(c.transitionOut=="none"?0:c.speedOut,a)}};b.fancybox.resize=function(){var a,d;if(!(h||g.is(":hidden"))){h=true;a=i.wrapInner("<div style='overflow:auto'></div>").children();d=a.height();g.css({height:d+c.padding*2+v});i.css({height:d});a.replaceWith(a.children());b.fancybox.center()}};b.fancybox.center=function(){h=true;var a=K(),d=c.margin,f={};f.top=a[3]+(a[1]-(g.height()-v+40))*0.5;f.left=a[2]+(a[0]-(g.width()+40))*0.5;f.top=Math.max(a[3]+d,f.top);f.left=Math.max(a[2]+
|
43
|
+
d,f.left);g.css(f);h=false};b.fn.fancybox.defaults={padding:10,margin:20,opacity:false,modal:false,cyclic:false,scrolling:"auto",width:560,height:340,autoScale:true,autoDimensions:true,centerOnScroll:false,ajax:{},swf:{wmode:"transparent"},hideOnOverlayClick:true,hideOnContentClick:false,overlayShow:true,overlayOpacity:0.3,overlayColor:"#666",titleShow:true,titlePosition:"outside",titleFormat:null,transitionIn:"fade",transitionOut:"fade",speedIn:300,speedOut:300,changeSpeed:300,changeFade:"fast",
|
44
|
+
easingIn:"swing",easingOut:"swing",showCloseButton:true,showNavArrows:true,enableEscapeButton:true,onStart:null,onCancel:null,onComplete:null,onCleanup:null,onClosed:null};b(document).ready(function(){aa()})})(jQuery);
|
@@ -1,7 +1,7 @@
|
|
1
|
-
|
1
|
+
/*!
|
2
2
|
* jQuery Form Plugin
|
3
|
-
* version: 2.
|
4
|
-
* @requires jQuery v1.
|
3
|
+
* version: 2.43 (12-MAR-2010)
|
4
|
+
* @requires jQuery v1.3.2 or later
|
5
5
|
*
|
6
6
|
* Examples and documentation at: http://malsup.com/jquery/form/
|
7
7
|
* Dual licensed under the MIT and GPL licenses:
|
@@ -11,32 +11,32 @@
|
|
11
11
|
;(function($) {
|
12
12
|
|
13
13
|
/*
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
14
|
+
Usage Note:
|
15
|
+
-----------
|
16
|
+
Do not use both ajaxSubmit and ajaxForm on the same form. These
|
17
|
+
functions are intended to be exclusive. Use ajaxSubmit if you want
|
18
|
+
to bind your own submit handler to the form. For example,
|
19
|
+
|
20
|
+
$(document).ready(function() {
|
21
|
+
$('#myForm').bind('submit', function() {
|
22
|
+
$(this).ajaxSubmit({
|
23
|
+
target: '#output'
|
24
|
+
});
|
25
|
+
return false; // <-- important!
|
26
|
+
});
|
27
|
+
});
|
28
|
+
|
29
|
+
Use ajaxForm when you want the plugin to manage all the event binding
|
30
|
+
for you. For example,
|
31
|
+
|
32
|
+
$(document).ready(function() {
|
33
|
+
$('#myForm').ajaxForm({
|
34
|
+
target: '#output'
|
35
|
+
});
|
36
|
+
});
|
37
|
+
|
38
|
+
When using ajaxForm, the ajaxSubmit function will be invoked for you
|
39
|
+
at the appropriate time.
|
40
40
|
*/
|
41
41
|
|
42
42
|
/**
|
@@ -44,184 +44,193 @@
|
|
44
44
|
* an HTML form using AJAX.
|
45
45
|
*/
|
46
46
|
$.fn.ajaxSubmit = function(options) {
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
47
|
+
// fast fail if nothing selected (http://dev.jquery.com/ticket/2752)
|
48
|
+
if (!this.length) {
|
49
|
+
log('ajaxSubmit: skipping submit process - no element selected');
|
50
|
+
return this;
|
51
|
+
}
|
52
|
+
|
53
|
+
if (typeof options == 'function')
|
54
|
+
options = { success: options };
|
55
|
+
|
56
|
+
var url = $.trim(this.attr('action'));
|
57
|
+
if (url) {
|
58
|
+
// clean url (don't include hash vaue)
|
59
|
+
url = (url.match(/^([^#]+)/)||[])[1];
|
60
|
+
}
|
61
|
+
url = url || window.location.href || '';
|
62
|
+
|
63
|
+
options = $.extend({
|
64
|
+
url: url,
|
65
|
+
type: this.attr('method') || 'GET',
|
66
|
+
iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank'
|
67
|
+
}, options || {});
|
68
|
+
|
69
|
+
// hook for manipulating the form data before it is extracted;
|
70
|
+
// convenient for use with rich editors like tinyMCE or FCKEditor
|
71
|
+
var veto = {};
|
72
|
+
this.trigger('form-pre-serialize', [this, options, veto]);
|
73
|
+
if (veto.veto) {
|
74
|
+
log('ajaxSubmit: submit vetoed via form-pre-serialize trigger');
|
75
|
+
return this;
|
76
|
+
}
|
77
|
+
|
78
|
+
// provide opportunity to alter form data before it is serialized
|
79
|
+
if (options.beforeSerialize && options.beforeSerialize(this, options) === false) {
|
80
|
+
log('ajaxSubmit: submit aborted via beforeSerialize callback');
|
81
|
+
return this;
|
82
|
+
}
|
83
|
+
|
84
|
+
var a = this.formToArray(options.semantic);
|
85
|
+
if (options.data) {
|
86
|
+
options.extraData = options.data;
|
87
|
+
for (var n in options.data) {
|
88
|
+
if(options.data[n] instanceof Array) {
|
89
|
+
for (var k in options.data[n])
|
90
|
+
a.push( { name: n, value: options.data[n][k] } );
|
91
|
+
}
|
92
|
+
else
|
93
|
+
a.push( { name: n, value: options.data[n] } );
|
94
|
+
}
|
95
|
+
}
|
96
|
+
|
97
|
+
// give pre-submit callback an opportunity to abort the submit
|
98
|
+
if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) {
|
99
|
+
log('ajaxSubmit: submit aborted via beforeSubmit callback');
|
100
|
+
return this;
|
101
|
+
}
|
102
|
+
|
103
|
+
// fire vetoable 'validate' event
|
104
|
+
this.trigger('form-submit-validate', [a, this, options, veto]);
|
105
|
+
if (veto.veto) {
|
106
|
+
log('ajaxSubmit: submit vetoed via form-submit-validate trigger');
|
107
|
+
return this;
|
108
|
+
}
|
109
|
+
|
110
|
+
var q = $.param(a);
|
111
|
+
|
112
|
+
if (options.type.toUpperCase() == 'GET') {
|
113
|
+
options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
|
114
|
+
options.data = null; // data is null for 'get'
|
115
|
+
}
|
116
|
+
else
|
117
|
+
options.data = q; // data is the query string for 'post'
|
118
|
+
|
119
|
+
var $form = this, callbacks = [];
|
120
|
+
if (options.resetForm) callbacks.push(function() { $form.resetForm(); });
|
121
|
+
if (options.clearForm) callbacks.push(function() { $form.clearForm(); });
|
122
|
+
|
123
|
+
// perform a load on the target only if dataType is not provided
|
124
|
+
if (!options.dataType && options.target) {
|
125
|
+
var oldSuccess = options.success || function(){};
|
126
|
+
callbacks.push(function(data) {
|
127
|
+
var fn = options.replaceTarget ? 'replaceWith' : 'html';
|
128
|
+
$(options.target)[fn](data).each(oldSuccess, arguments);
|
129
|
+
});
|
130
|
+
}
|
131
|
+
else if (options.success)
|
132
|
+
callbacks.push(options.success);
|
133
|
+
|
134
|
+
options.success = function(data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg
|
135
|
+
for (var i=0, max=callbacks.length; i < max; i++)
|
136
|
+
callbacks[i].apply(options, [data, status, xhr || $form, $form]);
|
137
|
+
};
|
138
|
+
|
139
|
+
// are there files to upload?
|
140
|
+
var files = $('input:file', this).fieldValue();
|
141
|
+
var found = false;
|
142
|
+
for (var j=0; j < files.length; j++)
|
143
|
+
if (files[j])
|
144
|
+
found = true;
|
145
|
+
|
146
|
+
var multipart = false;
|
147
|
+
// var mp = 'multipart/form-data';
|
148
|
+
// multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp);
|
149
|
+
|
150
|
+
// options.iframe allows user to force iframe mode
|
151
|
+
// 06-NOV-09: now defaulting to iframe mode if file input is detected
|
152
|
+
if ((files.length && options.iframe !== false) || options.iframe || found || multipart) {
|
153
|
+
// hack to fix Safari hang (thanks to Tim Molendijk for this)
|
154
|
+
// see: http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d
|
155
|
+
if (options.closeKeepAlive)
|
156
|
+
$.get(options.closeKeepAlive, fileUpload);
|
157
|
+
else
|
158
|
+
fileUpload();
|
159
|
+
}
|
151
160
|
else
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
var s =
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
161
|
+
$.ajax(options);
|
162
|
+
|
163
|
+
// fire 'notify' event
|
164
|
+
this.trigger('form-submit-notify', [this, options]);
|
165
|
+
return this;
|
166
|
+
|
167
|
+
|
168
|
+
// private function for handling file uploads (hat tip to YAHOO!)
|
169
|
+
function fileUpload() {
|
170
|
+
var form = $form[0];
|
171
|
+
|
172
|
+
if ($(':input[name=submit]', form).length) {
|
173
|
+
alert('Error: Form elements must not be named "submit".');
|
174
|
+
return;
|
175
|
+
}
|
176
|
+
|
177
|
+
var opts = $.extend({}, $.ajaxSettings, options);
|
178
|
+
var s = $.extend(true, {}, $.extend(true, {}, $.ajaxSettings), opts);
|
179
|
+
|
180
|
+
var id = 'jqFormIO' + (new Date().getTime());
|
181
|
+
var $io = $('<iframe id="' + id + '" name="' + id + '" src="'+ opts.iframeSrc +'" onload="(jQuery(this).data(\'form-plugin-onload\'))()" />');
|
182
|
+
var io = $io[0];
|
183
|
+
|
184
|
+
$io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
|
185
|
+
|
186
|
+
var xhr = { // mock object
|
187
|
+
aborted: 0,
|
188
|
+
responseText: null,
|
189
|
+
responseXML: null,
|
190
|
+
status: 0,
|
191
|
+
statusText: 'n/a',
|
192
|
+
getAllResponseHeaders: function() {},
|
193
|
+
getResponseHeader: function() {},
|
194
|
+
setRequestHeader: function() {},
|
195
|
+
abort: function() {
|
196
|
+
this.aborted = 1;
|
197
|
+
$io.attr('src', opts.iframeSrc); // abort op in progress
|
198
|
+
}
|
199
|
+
};
|
200
|
+
|
201
|
+
var g = opts.global;
|
202
|
+
// trigger ajax global events so that activity/block indicators work like normal
|
203
|
+
if (g && ! $.active++) $.event.trigger("ajaxStart");
|
204
|
+
if (g) $.event.trigger("ajaxSend", [xhr, opts]);
|
196
205
|
|
197
206
|
if (s.beforeSend && s.beforeSend(xhr, s) === false) {
|
198
|
-
s.global &&
|
207
|
+
s.global && $.active--;
|
208
|
+
return;
|
209
|
+
}
|
210
|
+
if (xhr.aborted)
|
199
211
|
return;
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
setTimeout(function() {
|
223
|
-
// make sure form attrs are set
|
224
|
-
var t = $form.attr('target'), a = $form.attr('action');
|
212
|
+
|
213
|
+
var cbInvoked = false;
|
214
|
+
var timedOut = 0;
|
215
|
+
|
216
|
+
// add submitting element to data if we know it
|
217
|
+
var sub = form.clk;
|
218
|
+
if (sub) {
|
219
|
+
var n = sub.name;
|
220
|
+
if (n && !sub.disabled) {
|
221
|
+
opts.extraData = opts.extraData || {};
|
222
|
+
opts.extraData[n] = sub.value;
|
223
|
+
if (sub.type == "image") {
|
224
|
+
opts.extraData[n+'.x'] = form.clk_x;
|
225
|
+
opts.extraData[n+'.y'] = form.clk_y;
|
226
|
+
}
|
227
|
+
}
|
228
|
+
}
|
229
|
+
|
230
|
+
// take a breath so that pending repaints get some cpu time before the upload starts
|
231
|
+
function doSubmit() {
|
232
|
+
// make sure form attrs are set
|
233
|
+
var t = $form.attr('target'), a = $form.attr('action');
|
225
234
|
|
226
235
|
// update form attrs in IE friendly way
|
227
236
|
form.setAttribute('target',id);
|
@@ -230,112 +239,134 @@ $.fn.ajaxSubmit = function(options) {
|
|
230
239
|
if (form.getAttribute('action') != opts.url)
|
231
240
|
form.setAttribute('action', opts.url);
|
232
241
|
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
242
|
+
// ie borks in some cases when setting encoding
|
243
|
+
if (! opts.skipEncodingOverride) {
|
244
|
+
$form.attr({
|
245
|
+
encoding: 'multipart/form-data',
|
246
|
+
enctype: 'multipart/form-data'
|
247
|
+
});
|
248
|
+
}
|
249
|
+
|
250
|
+
// support timout
|
251
|
+
if (opts.timeout)
|
252
|
+
setTimeout(function() { timedOut = true; cb(); }, opts.timeout);
|
253
|
+
|
254
|
+
// add "extra" data to form if provided in options
|
255
|
+
var extraInputs = [];
|
256
|
+
try {
|
257
|
+
if (opts.extraData)
|
258
|
+
for (var n in opts.extraData)
|
259
|
+
extraInputs.push(
|
260
|
+
$('<input type="hidden" name="'+n+'" value="'+opts.extraData[n]+'" />')
|
261
|
+
.appendTo(form)[0]);
|
262
|
+
|
263
|
+
// add iframe to doc and submit the form
|
264
|
+
$io.appendTo('body');
|
265
|
+
$io.data('form-plugin-onload', cb);
|
266
|
+
form.submit();
|
267
|
+
}
|
268
|
+
finally {
|
269
|
+
// reset attrs and remove "extra" input elements
|
261
270
|
form.setAttribute('action',a);
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
271
|
+
t ? form.setAttribute('target', t) : $form.removeAttr('target');
|
272
|
+
$(extraInputs).remove();
|
273
|
+
}
|
274
|
+
};
|
275
|
+
|
276
|
+
if (opts.forceSync)
|
277
|
+
doSubmit();
|
278
|
+
else
|
279
|
+
setTimeout(doSubmit, 10); // this lets dom updates render
|
280
|
+
|
281
|
+
var domCheckCount = 100;
|
282
|
+
|
283
|
+
function cb() {
|
284
|
+
if (cbInvoked)
|
285
|
+
return;
|
286
|
+
|
287
|
+
var ok = true;
|
288
|
+
try {
|
289
|
+
if (timedOut) throw 'timeout';
|
290
|
+
// extract the server response from the iframe
|
291
|
+
var data, doc;
|
292
|
+
|
293
|
+
doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document;
|
294
|
+
|
295
|
+
var isXml = opts.dataType == 'xml' || doc.XMLDocument || $.isXMLDoc(doc);
|
296
|
+
log('isXml='+isXml);
|
297
|
+
if (!isXml && (doc.body == null || doc.body.innerHTML == '')) {
|
298
|
+
if (--domCheckCount) {
|
299
|
+
// in some browsers (Opera) the iframe DOM is not always traversable when
|
300
|
+
// the onload callback fires, so we loop a bit to accommodate
|
301
|
+
log('requeing onLoad callback, DOM not available');
|
302
|
+
setTimeout(cb, 250);
|
303
|
+
return;
|
304
|
+
}
|
305
|
+
log('Could not access iframe DOM after 100 tries.');
|
306
|
+
return;
|
307
|
+
}
|
308
|
+
|
309
|
+
log('response detected');
|
310
|
+
cbInvoked = true;
|
311
|
+
xhr.responseText = doc.body ? doc.body.innerHTML : null;
|
312
|
+
xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
|
313
|
+
xhr.getResponseHeader = function(header){
|
314
|
+
var headers = {'content-type': opts.dataType};
|
315
|
+
return headers[header];
|
316
|
+
};
|
317
|
+
|
318
|
+
if (opts.dataType == 'json' || opts.dataType == 'script') {
|
319
|
+
// see if user embedded response in textarea
|
320
|
+
var ta = doc.getElementsByTagName('textarea')[0];
|
321
|
+
if (ta)
|
322
|
+
xhr.responseText = ta.value;
|
323
|
+
else {
|
324
|
+
// account for browsers injecting pre around json response
|
325
|
+
var pre = doc.getElementsByTagName('pre')[0];
|
326
|
+
if (pre)
|
327
|
+
xhr.responseText = pre.innerHTML;
|
328
|
+
}
|
329
|
+
}
|
330
|
+
else if (opts.dataType == 'xml' && !xhr.responseXML && xhr.responseText != null) {
|
331
|
+
xhr.responseXML = toXml(xhr.responseText);
|
332
|
+
}
|
333
|
+
data = $.httpData(xhr, opts.dataType);
|
334
|
+
}
|
335
|
+
catch(e){
|
336
|
+
log('error caught:',e);
|
337
|
+
ok = false;
|
338
|
+
xhr.error = e;
|
339
|
+
$.handleError(opts, xhr, 'error', e);
|
340
|
+
}
|
341
|
+
|
342
|
+
// ordering of these callbacks/triggers is odd, but that's how $.ajax does it
|
343
|
+
if (ok) {
|
344
|
+
opts.success(data, 'success');
|
345
|
+
if (g) $.event.trigger("ajaxSuccess", [xhr, opts]);
|
346
|
+
}
|
347
|
+
if (g) $.event.trigger("ajaxComplete", [xhr, opts]);
|
348
|
+
if (g && ! --$.active) $.event.trigger("ajaxStop");
|
349
|
+
if (opts.complete) opts.complete(xhr, ok ? 'success' : 'error');
|
350
|
+
|
351
|
+
// clean up
|
352
|
+
setTimeout(function() {
|
353
|
+
$io.removeData('form-plugin-onload');
|
354
|
+
$io.remove();
|
355
|
+
xhr.responseXML = null;
|
356
|
+
}, 100);
|
357
|
+
};
|
358
|
+
|
359
|
+
function toXml(s, doc) {
|
360
|
+
if (window.ActiveXObject) {
|
361
|
+
doc = new ActiveXObject('Microsoft.XMLDOM');
|
362
|
+
doc.async = 'false';
|
363
|
+
doc.loadXML(s);
|
364
|
+
}
|
365
|
+
else
|
366
|
+
doc = (new DOMParser()).parseFromString(s, 'text/xml');
|
367
|
+
return (doc && doc.documentElement && doc.documentElement.tagName != 'parsererror') ? doc : null;
|
368
|
+
};
|
369
|
+
};
|
339
370
|
};
|
340
371
|
|
341
372
|
/**
|
@@ -344,9 +375,9 @@ $.fn.ajaxSubmit = function(options) {
|
|
344
375
|
* The advantages of using this method instead of ajaxSubmit() are:
|
345
376
|
*
|
346
377
|
* 1: This method will include coordinates for <input type="image" /> elements (if the element
|
347
|
-
*
|
378
|
+
* is used to submit the form).
|
348
379
|
* 2. This method will include the submit element's name/value data (for the element that was
|
349
|
-
*
|
380
|
+
* used to submit the form).
|
350
381
|
* 3. This method binds the submit() method to the form for you.
|
351
382
|
*
|
352
383
|
* The options argument for ajaxForm works exactly as it does for ajaxSubmit. ajaxForm merely
|
@@ -354,40 +385,42 @@ $.fn.ajaxSubmit = function(options) {
|
|
354
385
|
* the form itself.
|
355
386
|
*/
|
356
387
|
$.fn.ajaxForm = function(options) {
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
388
|
+
return this.ajaxFormUnbind().bind('submit.form-plugin', function(e) {
|
389
|
+
e.preventDefault();
|
390
|
+
$(this).ajaxSubmit(options);
|
391
|
+
}).bind('click.form-plugin', function(e) {
|
392
|
+
var target = e.target;
|
393
|
+
var $el = $(target);
|
394
|
+
if (!($el.is(":submit,input:image"))) {
|
395
|
+
// is this a child element of the submit el? (ex: a span within a button)
|
396
|
+
var t = $el.closest(':submit');
|
397
|
+
if (t.length == 0)
|
398
|
+
return;
|
399
|
+
target = t[0];
|
400
|
+
}
|
401
|
+
var form = this;
|
402
|
+
form.clk = target;
|
403
|
+
if (target.type == 'image') {
|
404
|
+
if (e.offsetX != undefined) {
|
405
|
+
form.clk_x = e.offsetX;
|
406
|
+
form.clk_y = e.offsetY;
|
407
|
+
} else if (typeof $.fn.offset == 'function') { // try to use dimensions plugin
|
408
|
+
var offset = $el.offset();
|
409
|
+
form.clk_x = e.pageX - offset.left;
|
410
|
+
form.clk_y = e.pageY - offset.top;
|
411
|
+
} else {
|
412
|
+
form.clk_x = e.pageX - target.offsetLeft;
|
413
|
+
form.clk_y = e.pageY - target.offsetTop;
|
414
|
+
}
|
415
|
+
}
|
416
|
+
// clear form vars
|
417
|
+
setTimeout(function() { form.clk = form.clk_x = form.clk_y = null; }, 100);
|
418
|
+
});
|
382
419
|
};
|
383
420
|
|
384
421
|
// ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
|
385
422
|
$.fn.ajaxFormUnbind = function() {
|
386
|
-
|
387
|
-
return this.each(function() {
|
388
|
-
$(":submit,input:image", this).unbind('click.form-plugin');
|
389
|
-
});
|
390
|
-
|
423
|
+
return this.unbind('submit.form-plugin click.form-plugin');
|
391
424
|
};
|
392
425
|
|
393
426
|
/**
|
@@ -402,44 +435,44 @@ $.fn.ajaxFormUnbind = function() {
|
|
402
435
|
* ajaxSubmit() and ajaxForm() methods.
|
403
436
|
*/
|
404
437
|
$.fn.formToArray = function(semantic) {
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
438
|
+
var a = [];
|
439
|
+
if (this.length == 0) return a;
|
440
|
+
|
441
|
+
var form = this[0];
|
442
|
+
var els = semantic ? form.getElementsByTagName('*') : form.elements;
|
443
|
+
if (!els) return a;
|
444
|
+
for(var i=0, max=els.length; i < max; i++) {
|
445
|
+
var el = els[i];
|
446
|
+
var n = el.name;
|
447
|
+
if (!n) continue;
|
448
|
+
|
449
|
+
if (semantic && form.clk && el.type == "image") {
|
450
|
+
// handle image inputs on the fly when semantic == true
|
451
|
+
if(!el.disabled && form.clk == el) {
|
452
|
+
a.push({name: n, value: $(el).val()});
|
453
|
+
a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
|
454
|
+
}
|
455
|
+
continue;
|
456
|
+
}
|
457
|
+
|
458
|
+
var v = $.fieldValue(el, true);
|
459
|
+
if (v && v.constructor == Array) {
|
460
|
+
for(var j=0, jmax=v.length; j < jmax; j++)
|
461
|
+
a.push({name: n, value: v[j]});
|
462
|
+
}
|
463
|
+
else if (v !== null && typeof v != 'undefined')
|
464
|
+
a.push({name: n, value: v});
|
465
|
+
}
|
466
|
+
|
467
|
+
if (!semantic && form.clk) {
|
468
|
+
// input type=='image' are not found in elements array! handle it here
|
469
|
+
var $input = $(form.clk), input = $input[0], n = input.name;
|
470
|
+
if (n && !input.disabled && input.type == 'image') {
|
471
|
+
a.push({name: n, value: $input.val()});
|
472
|
+
a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
|
473
|
+
}
|
474
|
+
}
|
475
|
+
return a;
|
443
476
|
};
|
444
477
|
|
445
478
|
/**
|
@@ -447,8 +480,8 @@ $.fn.formToArray = function(semantic) {
|
|
447
480
|
* in the format: name1=value1&name2=value2
|
448
481
|
*/
|
449
482
|
$.fn.formSerialize = function(semantic) {
|
450
|
-
|
451
|
-
|
483
|
+
//hand off to jQuery.param for proper encoding
|
484
|
+
return $.param(this.formToArray(semantic));
|
452
485
|
};
|
453
486
|
|
454
487
|
/**
|
@@ -456,32 +489,32 @@ $.fn.formSerialize = function(semantic) {
|
|
456
489
|
* This method will return a string in the format: name1=value1&name2=value2
|
457
490
|
*/
|
458
491
|
$.fn.fieldSerialize = function(successful) {
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
492
|
+
var a = [];
|
493
|
+
this.each(function() {
|
494
|
+
var n = this.name;
|
495
|
+
if (!n) return;
|
496
|
+
var v = $.fieldValue(this, successful);
|
497
|
+
if (v && v.constructor == Array) {
|
498
|
+
for (var i=0,max=v.length; i < max; i++)
|
499
|
+
a.push({name: n, value: v[i]});
|
500
|
+
}
|
501
|
+
else if (v !== null && typeof v != 'undefined')
|
502
|
+
a.push({name: this.name, value: v});
|
503
|
+
});
|
504
|
+
//hand off to jQuery.param for proper encoding
|
505
|
+
return $.param(a);
|
473
506
|
};
|
474
507
|
|
475
508
|
/**
|
476
509
|
* Returns the value(s) of the element in the matched set. For example, consider the following form:
|
477
510
|
*
|
478
511
|
* <form><fieldset>
|
479
|
-
*
|
480
|
-
*
|
481
|
-
*
|
482
|
-
*
|
483
|
-
*
|
484
|
-
*
|
512
|
+
* <input name="A" type="text" />
|
513
|
+
* <input name="A" type="text" />
|
514
|
+
* <input name="B" type="checkbox" value="B1" />
|
515
|
+
* <input name="B" type="checkbox" value="B2"/>
|
516
|
+
* <input name="C" type="radio" value="C1" />
|
517
|
+
* <input name="C" type="radio" value="C2" />
|
485
518
|
* </fieldset></form>
|
486
519
|
*
|
487
520
|
* var v = $(':text').fieldValue();
|
@@ -508,51 +541,51 @@ $.fn.fieldSerialize = function(successful) {
|
|
508
541
|
* for each element is returned.
|
509
542
|
*
|
510
543
|
* Note: This method *always* returns an array. If no valid value can be determined the
|
511
|
-
*
|
544
|
+
* array will be empty, otherwise it will contain one or more values.
|
512
545
|
*/
|
513
546
|
$.fn.fieldValue = function(successful) {
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
547
|
+
for (var val=[], i=0, max=this.length; i < max; i++) {
|
548
|
+
var el = this[i];
|
549
|
+
var v = $.fieldValue(el, successful);
|
550
|
+
if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length))
|
551
|
+
continue;
|
552
|
+
v.constructor == Array ? $.merge(val, v) : val.push(v);
|
553
|
+
}
|
554
|
+
return val;
|
522
555
|
};
|
523
556
|
|
524
557
|
/**
|
525
558
|
* Returns the value of the field element.
|
526
559
|
*/
|
527
560
|
$.fieldValue = function(el, successful) {
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
|
561
|
+
var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
|
562
|
+
if (typeof successful == 'undefined') successful = true;
|
563
|
+
|
564
|
+
if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
|
565
|
+
(t == 'checkbox' || t == 'radio') && !el.checked ||
|
566
|
+
(t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
|
567
|
+
tag == 'select' && el.selectedIndex == -1))
|
568
|
+
return null;
|
569
|
+
|
570
|
+
if (tag == 'select') {
|
571
|
+
var index = el.selectedIndex;
|
572
|
+
if (index < 0) return null;
|
573
|
+
var a = [], ops = el.options;
|
574
|
+
var one = (t == 'select-one');
|
575
|
+
var max = (one ? index+1 : ops.length);
|
576
|
+
for(var i=(one ? index : 0); i < max; i++) {
|
577
|
+
var op = ops[i];
|
578
|
+
if (op.selected) {
|
546
579
|
var v = op.value;
|
547
580
|
if (!v) // extra pain for IE...
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
581
|
+
v = (op.attributes && op.attributes['value'] && !(op.attributes['value'].specified)) ? op.text : op.value;
|
582
|
+
if (one) return v;
|
583
|
+
a.push(v);
|
584
|
+
}
|
585
|
+
}
|
586
|
+
return a;
|
587
|
+
}
|
588
|
+
return el.value;
|
556
589
|
};
|
557
590
|
|
558
591
|
/**
|
@@ -564,46 +597,46 @@ $.fieldValue = function(el, successful) {
|
|
564
597
|
* - button elements will *not* be effected
|
565
598
|
*/
|
566
599
|
$.fn.clearForm = function() {
|
567
|
-
|
568
|
-
|
569
|
-
|
600
|
+
return this.each(function() {
|
601
|
+
$('input,select,textarea', this).clearFields();
|
602
|
+
});
|
570
603
|
};
|
571
604
|
|
572
605
|
/**
|
573
606
|
* Clears the selected form elements.
|
574
607
|
*/
|
575
608
|
$.fn.clearFields = $.fn.clearInputs = function() {
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
|
584
|
-
|
609
|
+
return this.each(function() {
|
610
|
+
var t = this.type, tag = this.tagName.toLowerCase();
|
611
|
+
if (t == 'text' || t == 'password' || tag == 'textarea')
|
612
|
+
this.value = '';
|
613
|
+
else if (t == 'checkbox' || t == 'radio')
|
614
|
+
this.checked = false;
|
615
|
+
else if (tag == 'select')
|
616
|
+
this.selectedIndex = -1;
|
617
|
+
});
|
585
618
|
};
|
586
619
|
|
587
620
|
/**
|
588
621
|
* Resets the form data. Causes all form elements to be reset to their original value.
|
589
622
|
*/
|
590
623
|
$.fn.resetForm = function() {
|
591
|
-
|
592
|
-
|
593
|
-
|
594
|
-
|
595
|
-
|
596
|
-
|
624
|
+
return this.each(function() {
|
625
|
+
// guard against an input with the name of 'reset'
|
626
|
+
// note that IE reports the reset function as an 'object'
|
627
|
+
if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType))
|
628
|
+
this.reset();
|
629
|
+
});
|
597
630
|
};
|
598
631
|
|
599
632
|
/**
|
600
633
|
* Enables or disables any matching elements.
|
601
634
|
*/
|
602
635
|
$.fn.enable = function(b) {
|
603
|
-
|
604
|
-
|
605
|
-
|
606
|
-
|
636
|
+
if (b == undefined) b = true;
|
637
|
+
return this.each(function() {
|
638
|
+
this.disabled = !b;
|
639
|
+
});
|
607
640
|
};
|
608
641
|
|
609
642
|
/**
|
@@ -611,27 +644,32 @@ $.fn.enable = function(b) {
|
|
611
644
|
* selects/deselects and matching option elements.
|
612
645
|
*/
|
613
646
|
$.fn.selected = function(select) {
|
614
|
-
|
615
|
-
|
616
|
-
|
617
|
-
|
618
|
-
|
619
|
-
|
620
|
-
|
621
|
-
|
622
|
-
|
623
|
-
|
624
|
-
|
625
|
-
|
626
|
-
|
627
|
-
|
647
|
+
if (select == undefined) select = true;
|
648
|
+
return this.each(function() {
|
649
|
+
var t = this.type;
|
650
|
+
if (t == 'checkbox' || t == 'radio')
|
651
|
+
this.checked = select;
|
652
|
+
else if (this.tagName.toLowerCase() == 'option') {
|
653
|
+
var $sel = $(this).parent('select');
|
654
|
+
if (select && $sel[0] && $sel[0].type == 'select-one') {
|
655
|
+
// deselect all other options
|
656
|
+
$sel.find('option').selected(false);
|
657
|
+
}
|
658
|
+
this.selected = select;
|
659
|
+
}
|
660
|
+
});
|
628
661
|
};
|
629
662
|
|
630
663
|
// helper fn for console logging
|
631
664
|
// set $.fn.ajaxSubmit.debug to true to enable debug logging
|
632
665
|
function log() {
|
633
|
-
|
634
|
-
|
666
|
+
if ($.fn.ajaxSubmit.debug) {
|
667
|
+
var msg = '[jquery.form] ' + Array.prototype.join.call(arguments,'');
|
668
|
+
if (window.console && window.console.log)
|
669
|
+
window.console.log(msg);
|
670
|
+
else if (window.opera && window.opera.postError)
|
671
|
+
window.opera.postError(msg);
|
672
|
+
}
|
635
673
|
};
|
636
674
|
|
637
675
|
})(jQuery);
|