skyframe 0.0.1.beta

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.
Files changed (111) hide show
  1. data/lib/skyframe.rb +8 -0
  2. data/lib/skyframe/version.rb +3 -0
  3. data/stylesheets/_main.scss +1 -0
  4. data/templates/project/files/404.html +157 -0
  5. data/templates/project/files/CHANGELOG.md +19 -0
  6. data/templates/project/files/about.html +96 -0
  7. data/templates/project/files/apple-touch-icon-114x114-precomposed.png +0 -0
  8. data/templates/project/files/apple-touch-icon-144x144-precomposed.png +0 -0
  9. data/templates/project/files/apple-touch-icon-57x57-precomposed.png +0 -0
  10. data/templates/project/files/apple-touch-icon-72x72-precomposed.png +0 -0
  11. data/templates/project/files/apple-touch-icon-precomposed.png +0 -0
  12. data/templates/project/files/apple-touch-icon.png +0 -0
  13. data/templates/project/files/bg_direction_nav.png +0 -0
  14. data/templates/project/files/blog-details.html +255 -0
  15. data/templates/project/files/blog.html +157 -0
  16. data/templates/project/files/config.rb +28 -0
  17. data/templates/project/files/contact.html +158 -0
  18. data/templates/project/files/crossdomain.xml +15 -0
  19. data/templates/project/files/dummy-full.png +0 -0
  20. data/templates/project/files/dummy-square.png +0 -0
  21. data/templates/project/files/favicon.ico +0 -0
  22. data/templates/project/files/flash/video-js.swf +0 -0
  23. data/templates/project/files/forgot-password.html +101 -0
  24. data/templates/project/files/htaccess.txt +536 -0
  25. data/templates/project/files/humans.txt +18 -0
  26. data/templates/project/files/icon-gmap.png +0 -0
  27. data/templates/project/files/icon-search.png +0 -0
  28. data/templates/project/files/inc/breadcrumb.html +5 -0
  29. data/templates/project/files/inc/footer.html +37 -0
  30. data/templates/project/files/inc/header.html +20 -0
  31. data/templates/project/files/inc/js-bottom.html +21 -0
  32. data/templates/project/files/inc/js-top.html +10 -0
  33. data/templates/project/files/inc/main-nav.html +7 -0
  34. data/templates/project/files/logo.png +0 -0
  35. data/templates/project/files/logo@2x.png +0 -0
  36. data/templates/project/files/media/audio/dummy-audio.mp3 +0 -0
  37. data/templates/project/files/media/video/dummy-video.mp4 +0 -0
  38. data/templates/project/files/products.html +100 -0
  39. data/templates/project/files/readme.md +55 -0
  40. data/templates/project/files/robots.txt +3 -0
  41. data/templates/project/files/services.html +75 -0
  42. data/templates/project/files/sign-in.html +104 -0
  43. data/templates/project/files/sitemap.html +102 -0
  44. data/templates/project/files/video-js.png +0 -0
  45. data/templates/project/javascripts/libs/jquery-1.8.0.min.js +2 -0
  46. data/templates/project/javascripts/libs/jquery.validationEngine.js +1819 -0
  47. data/templates/project/javascripts/libs/languages/jquery.validationEngine-cz.js +156 -0
  48. data/templates/project/javascripts/libs/languages/jquery.validationEngine-da.js +135 -0
  49. data/templates/project/javascripts/libs/languages/jquery.validationEngine-de.js +139 -0
  50. data/templates/project/javascripts/libs/languages/jquery.validationEngine-en.js +192 -0
  51. data/templates/project/javascripts/libs/languages/jquery.validationEngine-es.js +137 -0
  52. data/templates/project/javascripts/libs/languages/jquery.validationEngine-et.js +139 -0
  53. data/templates/project/javascripts/libs/languages/jquery.validationEngine-fa.js +181 -0
  54. data/templates/project/javascripts/libs/languages/jquery.validationEngine-fi.js +111 -0
  55. data/templates/project/javascripts/libs/languages/jquery.validationEngine-fr.js +129 -0
  56. data/templates/project/javascripts/libs/languages/jquery.validationEngine-hr.js +177 -0
  57. data/templates/project/javascripts/libs/languages/jquery.validationEngine-hu.js +179 -0
  58. data/templates/project/javascripts/libs/languages/jquery.validationEngine-it.js +111 -0
  59. data/templates/project/javascripts/libs/languages/jquery.validationEngine-ja.js +149 -0
  60. data/templates/project/javascripts/libs/languages/jquery.validationEngine-nl.js +136 -0
  61. data/templates/project/javascripts/libs/languages/jquery.validationEngine-pl.js +140 -0
  62. data/templates/project/javascripts/libs/languages/jquery.validationEngine-pt.js +135 -0
  63. data/templates/project/javascripts/libs/languages/jquery.validationEngine-pt_BR.js +127 -0
  64. data/templates/project/javascripts/libs/languages/jquery.validationEngine-ro.js +177 -0
  65. data/templates/project/javascripts/libs/languages/jquery.validationEngine-ru.js +136 -0
  66. data/templates/project/javascripts/libs/languages/jquery.validationEngine-se.js +153 -0
  67. data/templates/project/javascripts/libs/languages/jquery.validationEngine-tr.js +156 -0
  68. data/templates/project/javascripts/libs/languages/jquery.validationEngine-vi.js +179 -0
  69. data/templates/project/javascripts/libs/languages/jquery.validationEngine-zh_CN.js +177 -0
  70. data/templates/project/javascripts/libs/languages/jquery.validationEngine-zh_TW.js +177 -0
  71. data/templates/project/javascripts/libs/modernizr-2.5.3.min.js +4 -0
  72. data/templates/project/javascripts/libs/respond.min.js +6 -0
  73. data/templates/project/javascripts/libs/selectivizr.js +560 -0
  74. data/templates/project/javascripts/plugins.js +83 -0
  75. data/templates/project/javascripts/script.js +282 -0
  76. data/templates/project/manifest.rb +136 -0
  77. data/templates/project/partials/_debug.scss +114 -0
  78. data/templates/project/partials/_functions.scss +10 -0
  79. data/templates/project/partials/_helpers.scss +86 -0
  80. data/templates/project/partials/_layout.scss +188 -0
  81. data/templates/project/partials/_media.scss +191 -0
  82. data/templates/project/partials/_misc.scss +103 -0
  83. data/templates/project/partials/_mixins.scss +140 -0
  84. data/templates/project/partials/_mods.scss +59 -0
  85. data/templates/project/partials/_normalize.scss +36 -0
  86. data/templates/project/partials/_print.scss +80 -0
  87. data/templates/project/partials/_type.scss +331 -0
  88. data/templates/project/partials/_vars.scss +114 -0
  89. data/templates/project/partials/mods/_mod-block.scss +96 -0
  90. data/templates/project/partials/mods/_mod-breadcrumb.scss +103 -0
  91. data/templates/project/partials/mods/_mod-carousel.scss +108 -0
  92. data/templates/project/partials/mods/_mod-footer.scss +199 -0
  93. data/templates/project/partials/mods/_mod-form.scss +319 -0
  94. data/templates/project/partials/mods/_mod-header.scss +291 -0
  95. data/templates/project/partials/mods/_mod-intro.scss +98 -0
  96. data/templates/project/partials/mods/_mod-layouts.scss +135 -0
  97. data/templates/project/partials/mods/_mod-main-nav.scss +143 -0
  98. data/templates/project/partials/mods/_mod-map.scss +107 -0
  99. data/templates/project/partials/mods/_mod-msg.scss +119 -0
  100. data/templates/project/partials/mods/_mod-paging.scss +101 -0
  101. data/templates/project/partials/mods/_mod-sitemap.scss +132 -0
  102. data/templates/project/partials/mods/_mod-split-form.scss +98 -0
  103. data/templates/project/partials/mods/_mod-strip.scss +118 -0
  104. data/templates/project/partials/mods/_mod-table.scss +118 -0
  105. data/templates/project/partials/mods/_mod-widget.scss +103 -0
  106. data/templates/project/partials/plugins/_flexslider.scss +82 -0
  107. data/templates/project/partials/plugins/_validation-engine.scss +137 -0
  108. data/templates/project/partials/plugins/_video-js.scss +616 -0
  109. data/templates/project/partials/sass-template.scss +103 -0
  110. data/templates/project/screen.scss +2 -0
  111. metadata +220 -0
@@ -0,0 +1,102 @@
1
+ <!doctype html>
2
+ <!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7" lang="en"> <![endif]-->
3
+ <!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8" lang="en"> <![endif]-->
4
+ <!--[if IE 8]> <html class="no-js lt-ie9" lang="en"> <![endif]-->
5
+ <!-- Consider adding a manifest.appcache: h5bp.com/d/Offline -->
6
+ <!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
7
+ <head>
8
+ <meta charset="utf-8">
9
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
10
+
11
+ <title>Skyframe v0.0.1(Alpha) - Sitemap</title>
12
+ <meta name="description" content="">
13
+ <meta name="viewport" content="width=device-width">
14
+ <link rel="stylesheet" href="css/screen.css">
15
+ <!--#include virtual="inc/js-top.html" -->
16
+ </head>
17
+ <body>
18
+
19
+ <!--[if lt IE 7]>
20
+ <p class="chromeframe">You are using an outdated browser. <a href="http://browsehappy.com/">Upgrade your browser today</a> or <a href="http://www.google.com/chromeframe/?redirect=true">install Google Chrome Frame</a> to better experience this site.</p>
21
+ <![endif]-->
22
+
23
+ <div class="container">
24
+
25
+ <header class="mod-header" id="header"><!--#include virtual="inc/header.html" --></header>
26
+
27
+ <nav class="mod-main-nav" id="main-nav"><!--#include virtual="inc/main-nav.html" --></nav>
28
+
29
+ <div class="mod-breadcrumb" id="breadcrumb"><!--#include virtual="inc/breadcrumb.html" --></div>
30
+
31
+
32
+ <div class="page-wrapper" id="page-wrapper" role="main">
33
+
34
+
35
+ <article class="l-main" id="main">
36
+
37
+ <section class="mod-content">
38
+
39
+ <div class="mod-sitemap">
40
+ <ul>
41
+ <li><a href="#">Link</a>
42
+ <ul>
43
+ <li><a href="#">Link</a></li>
44
+ <li><a href="#">Link</a>
45
+ <ul>
46
+ <li><a href="#">Link</a></li>
47
+ <li><a href="#">Link</a></li>
48
+ <li><a href="#">Link</a></li>
49
+ <li><a href="#">Link</a></li>
50
+ </ul>
51
+ </li>
52
+ <li><a href="#">Link</a></li>
53
+ <li><a href="#">Link</a></li>
54
+ </ul>
55
+ </li>
56
+ <li><a href="#">Link</a>
57
+ <ul>
58
+ <li><a href="#">Link</a></li>
59
+ <li><a href="#">Link</a>
60
+ <ul>
61
+ <li><a href="#">Link</a></li>
62
+ <li><a href="#">Link</a></li>
63
+ <li><a href="#">Link</a></li>
64
+ <li><a href="#">Link</a></li>
65
+ </ul>
66
+ </li>
67
+ <li><a href="#">Link</a></li>
68
+ <li><a href="#">Link</a></li>
69
+ </ul>
70
+ </li>
71
+ <li><a href="#">Link</a>
72
+ <ul>
73
+ <li><a href="#">Link</a></li>
74
+ <li><a href="#">Link</a>
75
+ <ul>
76
+ <li><a href="#">Link</a></li>
77
+ <li><a href="#">Link</a></li>
78
+ <li><a href="#">Link</a></li>
79
+ <li><a href="#">Link</a></li>
80
+ </ul>
81
+ </li>
82
+ <li><a href="#">Link</a></li>
83
+ <li><a href="#">Link</a></li>
84
+ </ul>
85
+ </li>
86
+ </ul>
87
+ </div>
88
+
89
+ </section><!-- /.mod-content -->
90
+
91
+ </article><!-- /.l-main -->
92
+
93
+ </div><!-- /#main-->
94
+
95
+ <footer class="mod-footer" id="footer"><!--#include virtual="inc/footer.html" --></footer>
96
+
97
+ </div><!-- /.container -->
98
+
99
+ <!--#include virtual="inc/js-bottom.html" -->
100
+
101
+ </body>
102
+ </html>
@@ -0,0 +1,2 @@
1
+ /*! jQuery v@1.8.0 jquery.com | jquery.org/license */
2
+ (function(a,b){function G(a){var b=F[a]={};return p.each(a.split(s),function(a,c){b[c]=!0}),b}function J(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(I,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:+d+""===d?+d:H.test(d)?p.parseJSON(d):d}catch(f){}p.data(a,c,d)}else d=b}return d}function K(a){var b;for(b in a){if(b==="data"&&p.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function ba(){return!1}function bb(){return!0}function bh(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function bi(a,b){do a=a[b];while(a&&a.nodeType!==1);return a}function bj(a,b,c){b=b||0;if(p.isFunction(b))return p.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return p.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=p.grep(a,function(a){return a.nodeType===1});if(be.test(b))return p.filter(b,d,!c);b=p.filter(b,d)}return p.grep(a,function(a,d){return p.inArray(a,b)>=0===c})}function bk(a){var b=bl.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function bC(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function bD(a,b){if(b.nodeType!==1||!p.hasData(a))return;var c,d,e,f=p._data(a),g=p._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;d<e;d++)p.event.add(b,c,h[c][d])}g.data&&(g.data=p.extend({},g.data))}function bE(a,b){var c;if(b.nodeType!==1)return;b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase(),c==="object"?(b.parentNode&&(b.outerHTML=a.outerHTML),p.support.html5Clone&&a.innerHTML&&!p.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):c==="input"&&bv.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):c==="option"?b.selected=a.defaultSelected:c==="input"||c==="textarea"?b.defaultValue=a.defaultValue:c==="script"&&b.text!==a.text&&(b.text=a.text),b.removeAttribute(p.expando)}function bF(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bG(a){bv.test(a.type)&&(a.defaultChecked=a.checked)}function bX(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=bV.length;while(e--){b=bV[e]+c;if(b in a)return b}return d}function bY(a,b){return a=b||a,p.css(a,"display")==="none"||!p.contains(a.ownerDocument,a)}function bZ(a,b){var c,d,e=[],f=0,g=a.length;for(;f<g;f++){c=a[f];if(!c.style)continue;e[f]=p._data(c,"olddisplay"),b?(!e[f]&&c.style.display==="none"&&(c.style.display=""),c.style.display===""&&bY(c)&&(e[f]=p._data(c,"olddisplay",cb(c.nodeName)))):(d=bH(c,"display"),!e[f]&&d!=="none"&&p._data(c,"olddisplay",d))}for(f=0;f<g;f++){c=a[f];if(!c.style)continue;if(!b||c.style.display==="none"||c.style.display==="")c.style.display=b?e[f]||"":"none"}return a}function b$(a,b,c){var d=bO.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function b_(a,b,c,d){var e=c===(d?"border":"content")?4:b==="width"?1:0,f=0;for(;e<4;e+=2)c==="margin"&&(f+=p.css(a,c+bU[e],!0)),d?(c==="content"&&(f-=parseFloat(bH(a,"padding"+bU[e]))||0),c!=="margin"&&(f-=parseFloat(bH(a,"border"+bU[e]+"Width"))||0)):(f+=parseFloat(bH(a,"padding"+bU[e]))||0,c!=="padding"&&(f+=parseFloat(bH(a,"border"+bU[e]+"Width"))||0));return f}function ca(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=!0,f=p.support.boxSizing&&p.css(a,"boxSizing")==="border-box";if(d<=0){d=bH(a,b);if(d<0||d==null)d=a.style[b];if(bP.test(d))return d;e=f&&(p.support.boxSizingReliable||d===a.style[b]),d=parseFloat(d)||0}return d+b_(a,b,c||(f?"border":"content"),e)+"px"}function cb(a){if(bR[a])return bR[a];var b=p("<"+a+">").appendTo(e.body),c=b.css("display");b.remove();if(c==="none"||c===""){bI=e.body.appendChild(bI||p.extend(e.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!bJ||!bI.createElement)bJ=(bI.contentWindow||bI.contentDocument).document,bJ.write("<!doctype html><html><body>"),bJ.close();b=bJ.body.appendChild(bJ.createElement(a)),c=bH(b,"display"),e.body.removeChild(bI)}return bR[a]=c,c}function ch(a,b,c,d){var e;if(p.isArray(b))p.each(b,function(b,e){c||cd.test(a)?d(a,e):ch(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&p.type(b)==="object")for(e in b)ch(a+"["+e+"]",b[e],c,d);else d(a,b)}function cy(a){return function(b,c){typeof b!="string"&&(c=b,b="*");var d,e,f,g=b.toLowerCase().split(s),h=0,i=g.length;if(p.isFunction(c))for(;h<i;h++)d=g[h],f=/^\+/.test(d),f&&(d=d.substr(1)||"*"),e=a[d]=a[d]||[],e[f?"unshift":"push"](c)}}function cz(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h,i=a[f],j=0,k=i?i.length:0,l=a===cu;for(;j<k&&(l||!h);j++)h=i[j](c,d,e),typeof h=="string"&&(!l||g[h]?h=b:(c.dataTypes.unshift(h),h=cz(a,c,d,e,h,g)));return(l||!h)&&!g["*"]&&(h=cz(a,c,d,e,"*",g)),h}function cA(a,c){var d,e,f=p.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((f[d]?a:e||(e={}))[d]=c[d]);e&&p.extend(!0,a,e)}function cB(a,c,d){var e,f,g,h,i=a.contents,j=a.dataTypes,k=a.responseFields;for(f in k)f in d&&(c[k[f]]=d[f]);while(j[0]==="*")j.shift(),e===b&&(e=a.mimeType||c.getResponseHeader("content-type"));if(e)for(f in i)if(i[f]&&i[f].test(e)){j.unshift(f);break}if(j[0]in d)g=j[0];else{for(f in d){if(!j[0]||a.converters[f+" "+j[0]]){g=f;break}h||(h=f)}g=g||h}if(g)return g!==j[0]&&j.unshift(g),d[g]}function cC(a,b){var c,d,e,f,g=a.dataTypes.slice(),h=g[0],i={},j=0;a.dataFilter&&(b=a.dataFilter(b,a.dataType));if(g[1])for(c in a.converters)i[c.toLowerCase()]=a.converters[c];for(;e=g[++j];)if(e!=="*"){if(h!=="*"&&h!==e){c=i[h+" "+e]||i["* "+e];if(!c)for(d in i){f=d.split(" ");if(f[1]===e){c=i[h+" "+f[0]]||i["* "+f[0]];if(c){c===!0?c=i[d]:i[d]!==!0&&(e=f[0],g.splice(j--,0,e));break}}}if(c!==!0)if(c&&a["throws"])b=c(b);else try{b=c(b)}catch(k){return{state:"parsererror",error:c?k:"No conversion from "+h+" to "+e}}}h=e}return{state:"success",data:b}}function cK(){try{return new a.XMLHttpRequest}catch(b){}}function cL(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function cT(){return setTimeout(function(){cM=b},0),cM=p.now()}function cU(a,b){p.each(b,function(b,c){var d=(cS[b]||[]).concat(cS["*"]),e=0,f=d.length;for(;e<f;e++)if(d[e].call(a,b,c))return})}function cV(a,b,c){var d,e=0,f=0,g=cR.length,h=p.Deferred().always(function(){delete i.elem}),i=function(){var b=cM||cT(),c=Math.max(0,j.startTime+j.duration-b),d=1-(c/j.duration||0),e=0,f=j.tweens.length;for(;e<f;e++)j.tweens[e].run(d);return h.notifyWith(a,[j,d,c]),d<1&&f?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:p.extend({},b),opts:p.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:cM||cT(),duration:c.duration,tweens:[],createTween:function(b,c,d){var e=p.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(e),e},stop:function(b){var c=0,d=b?j.tweens.length:0;for(;c<d;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;cW(k,j.opts.specialEasing);for(;e<g;e++){d=cR[e].call(j,a,k,j.opts);if(d)return d}return cU(j,k),p.isFunction(j.opts.start)&&j.opts.start.call(a,j),p.fx.timer(p.extend(i,{anim:j,queue:j.opts.queue,elem:a})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}function cW(a,b){var c,d,e,f,g;for(c in a){d=p.camelCase(c),e=b[d],f=a[c],p.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=p.cssHooks[d];if(g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}}function cX(a,b,c){var d,e,f,g,h,i,j,k,l=this,m=a.style,n={},o=[],q=a.nodeType&&bY(a);c.queue||(j=p._queueHooks(a,"fx"),j.unqueued==null&&(j.unqueued=0,k=j.empty.fire,j.empty.fire=function(){j.unqueued||k()}),j.unqueued++,l.always(function(){l.always(function(){j.unqueued--,p.queue(a,"fx").length||j.empty.fire()})})),a.nodeType===1&&("height"in b||"width"in b)&&(c.overflow=[m.overflow,m.overflowX,m.overflowY],p.css(a,"display")==="inline"&&p.css(a,"float")==="none"&&(!p.support.inlineBlockNeedsLayout||cb(a.nodeName)==="inline"?m.display="inline-block":m.zoom=1)),c.overflow&&(m.overflow="hidden",p.support.shrinkWrapBlocks||l.done(function(){m.overflow=c.overflow[0],m.overflowX=c.overflow[1],m.overflowY=c.overflow[2]}));for(d in b){f=b[d];if(cO.exec(f)){delete b[d];if(f===(q?"hide":"show"))continue;o.push(d)}}g=o.length;if(g){h=p._data(a,"fxshow")||p._data(a,"fxshow",{}),q?p(a).show():l.done(function(){p(a).hide()}),l.done(function(){var b;p.removeData(a,"fxshow",!0);for(b in n)p.style(a,b,n[b])});for(d=0;d<g;d++)e=o[d],i=l.createTween(e,q?h[e]:0),n[e]=h[e]||p.style(a,e),e in h||(h[e]=i.start,q&&(i.end=i.start,i.start=e==="width"||e==="height"?1:0))}}function cY(a,b,c,d,e){return new cY.prototype.init(a,b,c,d,e)}function cZ(a,b){var c,d={height:a},e=0;for(;e<4;e+=2-b)c=bU[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function c_(a){return p.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}var c,d,e=a.document,f=a.location,g=a.navigator,h=a.jQuery,i=a.$,j=Array.prototype.push,k=Array.prototype.slice,l=Array.prototype.indexOf,m=Object.prototype.toString,n=Object.prototype.hasOwnProperty,o=String.prototype.trim,p=function(a,b){return new p.fn.init(a,b,c)},q=/[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,r=/\S/,s=/\s+/,t=r.test("Â ")?/^[\s\xA0]+|[\s\xA0]+$/g:/^\s+|\s+$/g,u=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,y=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,z=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,A=/^-ms-/,B=/-([\da-z])/gi,C=function(a,b){return(b+"").toUpperCase()},D=function(){e.addEventListener?(e.removeEventListener("DOMContentLoaded",D,!1),p.ready()):e.readyState==="complete"&&(e.detachEvent("onreadystatechange",D),p.ready())},E={};p.fn=p.prototype={constructor:p,init:function(a,c,d){var f,g,h,i;if(!a)return this;if(a.nodeType)return this.context=this[0]=a,this.length=1,this;if(typeof a=="string"){a.charAt(0)==="<"&&a.charAt(a.length-1)===">"&&a.length>=3?f=[null,a,null]:f=u.exec(a);if(f&&(f[1]||!c)){if(f[1])return c=c instanceof p?c[0]:c,i=c&&c.nodeType?c.ownerDocument||c:e,a=p.parseHTML(f[1],i,!0),v.test(f[1])&&p.isPlainObject(c)&&this.attr.call(a,c,!0),p.merge(this,a);g=e.getElementById(f[2]);if(g&&g.parentNode){if(g.id!==f[2])return d.find(a);this.length=1,this[0]=g}return this.context=e,this.selector=a,this}return!c||c.jquery?(c||d).find(a):this.constructor(c).find(a)}return p.isFunction(a)?d.ready(a):(a.selector!==b&&(this.selector=a.selector,this.context=a.context),p.makeArray(a,this))},selector:"",jquery:"1.8.0",length:0,size:function(){return this.length},toArray:function(){return k.call(this)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=p.merge(this.constructor(),a);return d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")"),d},each:function(a,b){return p.each(this,a,b)},ready:function(a){return p.ready.promise().done(a),this},eq:function(a){return a=+a,a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(k.apply(this,arguments),"slice",k.call(arguments).join(","))},map:function(a){return this.pushStack(p.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:j,sort:[].sort,splice:[].splice},p.fn.init.prototype=p.fn,p.extend=p.fn.extend=function(){var a,c,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;typeof h=="boolean"&&(k=h,h=arguments[1]||{},i=2),typeof h!="object"&&!p.isFunction(h)&&(h={}),j===i&&(h=this,--i);for(;i<j;i++)if((a=arguments[i])!=null)for(c in a){d=h[c],e=a[c];if(h===e)continue;k&&e&&(p.isPlainObject(e)||(f=p.isArray(e)))?(f?(f=!1,g=d&&p.isArray(d)?d:[]):g=d&&p.isPlainObject(d)?d:{},h[c]=p.extend(k,g,e)):e!==b&&(h[c]=e)}return h},p.extend({noConflict:function(b){return a.$===p&&(a.$=i),b&&a.jQuery===p&&(a.jQuery=h),p},isReady:!1,readyWait:1,holdReady:function(a){a?p.readyWait++:p.ready(!0)},ready:function(a){if(a===!0?--p.readyWait:p.isReady)return;if(!e.body)return setTimeout(p.ready,1);p.isReady=!0;if(a!==!0&&--p.readyWait>0)return;d.resolveWith(e,[p]),p.fn.trigger&&p(e).trigger("ready").off("ready")},isFunction:function(a){return p.type(a)==="function"},isArray:Array.isArray||function(a){return p.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):E[m.call(a)]||"object"},isPlainObject:function(a){if(!a||p.type(a)!=="object"||a.nodeType||p.isWindow(a))return!1;try{if(a.constructor&&!n.call(a,"constructor")&&!n.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||n.call(a,d)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},error:function(a){throw new Error(a)},parseHTML:function(a,b,c){var d;return!a||typeof a!="string"?null:(typeof b=="boolean"&&(c=b,b=0),b=b||e,(d=v.exec(a))?[b.createElement(d[1])]:(d=p.buildFragment([a],b,c?null:[]),p.merge([],(d.cacheable?p.clone(d.fragment):d.fragment).childNodes)))},parseJSON:function(b){if(!b||typeof b!="string")return null;b=p.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(w.test(b.replace(y,"@").replace(z,"]").replace(x,"")))return(new Function("return "+b))();p.error("Invalid JSON: "+b)},parseXML:function(c){var d,e;if(!c||typeof c!="string")return null;try{a.DOMParser?(e=new DOMParser,d=e.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(f){d=b}return(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&p.error("Invalid XML: "+c),d},noop:function(){},globalEval:function(b){b&&r.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(A,"ms-").replace(B,C)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var e,f=0,g=a.length,h=g===b||p.isFunction(a);if(d){if(h){for(e in a)if(c.apply(a[e],d)===!1)break}else for(;f<g;)if(c.apply(a[f++],d)===!1)break}else if(h){for(e in a)if(c.call(a[e],e,a[e])===!1)break}else for(;f<g;)if(c.call(a[f],f,a[f++])===!1)break;return a},trim:o?function(a){return a==null?"":o.call(a)}:function(a){return a==null?"":a.toString().replace(t,"")},makeArray:function(a,b){var c,d=b||[];return a!=null&&(c=p.type(a),a.length==null||c==="string"||c==="function"||c==="regexp"||p.isWindow(a)?j.call(d,a):p.merge(d,a)),d},inArray:function(a,b,c){var d;if(b){if(l)return l.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=c.length,e=a.length,f=0;if(typeof d=="number")for(;f<d;f++)a[e++]=c[f];else while(c[f]!==b)a[e++]=c[f++];return a.length=e,a},grep:function(a,b,c){var d,e=[],f=0,g=a.length;c=!!c;for(;f<g;f++)d=!!b(a[f],f),c!==d&&e.push(a[f]);return e},map:function(a,c,d){var e,f,g=[],h=0,i=a.length,j=a instanceof p||i!==b&&typeof i=="number"&&(i>0&&a[0]&&a[i-1]||i===0||p.isArray(a));if(j)for(;h<i;h++)e=c(a[h],h,d),e!=null&&(g[g.length]=e);else for(f in a)e=c(a[f],f,d),e!=null&&(g[g.length]=e);return g.concat.apply([],g)},guid:1,proxy:function(a,c){var d,e,f;return typeof c=="string"&&(d=a[c],c=a,a=d),p.isFunction(a)?(e=k.call(arguments,2),f=function(){return a.apply(c,e.concat(k.call(arguments)))},f.guid=a.guid=a.guid||f.guid||p.guid++,f):b},access:function(a,c,d,e,f,g,h){var i,j=d==null,k=0,l=a.length;if(d&&typeof d=="object"){for(k in d)p.access(a,c,k,d[k],1,g,e);f=1}else if(e!==b){i=h===b&&p.isFunction(e),j&&(i?(i=c,c=function(a,b,c){return i.call(p(a),c)}):(c.call(a,e),c=null));if(c)for(;k<l;k++)c(a[k],d,i?e.call(a[k],k,c(a[k],d)):e,h);f=1}return f?a:j?c.call(a):l?c(a[0],d):g},now:function(){return(new Date).getTime()}}),p.ready.promise=function(b){if(!d){d=p.Deferred();if(e.readyState==="complete"||e.readyState!=="loading"&&e.addEventListener)setTimeout(p.ready,1);else if(e.addEventListener)e.addEventListener("DOMContentLoaded",D,!1),a.addEventListener("load",p.ready,!1);else{e.attachEvent("onreadystatechange",D),a.attachEvent("onload",p.ready);var c=!1;try{c=a.frameElement==null&&e.documentElement}catch(f){}c&&c.doScroll&&function g(){if(!p.isReady){try{c.doScroll("left")}catch(a){return setTimeout(g,50)}p.ready()}}()}}return d.promise(b)},p.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){E["[object "+b+"]"]=b.toLowerCase()}),c=p(e);var F={};p.Callbacks=function(a){a=typeof a=="string"?F[a]||G(a):p.extend({},a);var c,d,e,f,g,h,i=[],j=!a.once&&[],k=function(b){c=a.memory&&b,d=!0,h=f||0,f=0,g=i.length,e=!0;for(;i&&h<g;h++)if(i[h].apply(b[0],b[1])===!1&&a.stopOnFalse){c=!1;break}e=!1,i&&(j?j.length&&k(j.shift()):c?i=[]:l.disable())},l={add:function(){if(i){var b=i.length;(function d(b){p.each(b,function(b,c){p.isFunction(c)&&(!a.unique||!l.has(c))?i.push(c):c&&c.length&&d(c)})})(arguments),e?g=i.length:c&&(f=b,k(c))}return this},remove:function(){return i&&p.each(arguments,function(a,b){var c;while((c=p.inArray(b,i,c))>-1)i.splice(c,1),e&&(c<=g&&g--,c<=h&&h--)}),this},has:function(a){return p.inArray(a,i)>-1},empty:function(){return i=[],this},disable:function(){return i=j=c=b,this},disabled:function(){return!i},lock:function(){return j=b,c||l.disable(),this},locked:function(){return!j},fireWith:function(a,b){return b=b||[],b=[a,b.slice?b.slice():b],i&&(!d||j)&&(e?j.push(b):k(b)),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!d}};return l},p.extend({Deferred:function(a){var b=[["resolve","done",p.Callbacks("once memory"),"resolved"],["reject","fail",p.Callbacks("once memory"),"rejected"],["notify","progress",p.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return p.Deferred(function(c){p.each(b,function(b,d){var f=d[0],g=a[b];e[d[1]](p.isFunction(g)?function(){var a=g.apply(this,arguments);a&&p.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f+"With"](this===e?c:this,[a])}:c[f])}),a=null}).promise()},promise:function(a){return typeof a=="object"?p.extend(a,d):d}},e={};return d.pipe=d.then,p.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[a^1][2].disable,b[2][2].lock),e[f[0]]=g.fire,e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=k.call(arguments),d=c.length,e=d!==1||a&&p.isFunction(a.promise)?d:0,f=e===1?a:p.Deferred(),g=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?k.call(arguments):d,c===h?f.notifyWith(b,c):--e||f.resolveWith(b,c)}},h,i,j;if(d>1){h=new Array(d),i=new Array(d),j=new Array(d);for(;b<d;b++)c[b]&&p.isFunction(c[b].promise)?c[b].promise().done(g(b,j,c)).fail(f.reject).progress(g(b,i,h)):--e}return e||f.resolveWith(j,c),f.promise()}}),p.support=function(){var b,c,d,f,g,h,i,j,k,l,m,n=e.createElement("div");n.setAttribute("className","t"),n.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",c=n.getElementsByTagName("*"),d=n.getElementsByTagName("a")[0],d.style.cssText="top:1px;float:left;opacity:.5";if(!c||!c.length||!d)return{};f=e.createElement("select"),g=f.appendChild(e.createElement("option")),h=n.getElementsByTagName("input")[0],b={leadingWhitespace:n.firstChild.nodeType===3,tbody:!n.getElementsByTagName("tbody").length,htmlSerialize:!!n.getElementsByTagName("link").length,style:/top/.test(d.getAttribute("style")),hrefNormalized:d.getAttribute("href")==="/a",opacity:/^0.5/.test(d.style.opacity),cssFloat:!!d.style.cssFloat,checkOn:h.value==="on",optSelected:g.selected,getSetAttribute:n.className!=="t",enctype:!!e.createElement("form").enctype,html5Clone:e.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",boxModel:e.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},h.checked=!0,b.noCloneChecked=h.cloneNode(!0).checked,f.disabled=!0,b.optDisabled=!g.disabled;try{delete n.test}catch(o){b.deleteExpando=!1}!n.addEventListener&&n.attachEvent&&n.fireEvent&&(n.attachEvent("onclick",m=function(){b.noCloneEvent=!1}),n.cloneNode(!0).fireEvent("onclick"),n.detachEvent("onclick",m)),h=e.createElement("input"),h.value="t",h.setAttribute("type","radio"),b.radioValue=h.value==="t",h.setAttribute("checked","checked"),h.setAttribute("name","t"),n.appendChild(h),i=e.createDocumentFragment(),i.appendChild(n.lastChild),b.checkClone=i.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=h.checked,i.removeChild(h),i.appendChild(n);if(n.attachEvent)for(k in{submit:!0,change:!0,focusin:!0})j="on"+k,l=j in n,l||(n.setAttribute(j,"return;"),l=typeof n[j]=="function"),b[k+"Bubbles"]=l;return p(function(){var c,d,f,g,h="padding:0;margin:0;border:0;display:block;overflow:hidden;",i=e.getElementsByTagName("body")[0];if(!i)return;c=e.createElement("div"),c.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",i.insertBefore(c,i.firstChild),d=e.createElement("div"),c.appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",f=d.getElementsByTagName("td"),f[0].style.cssText="padding:0;margin:0;border:0;display:none",l=f[0].offsetHeight===0,f[0].style.display="",f[1].style.display="none",b.reliableHiddenOffsets=l&&f[0].offsetHeight===0,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",b.boxSizing=d.offsetWidth===4,b.doesNotIncludeMarginInBodyOffset=i.offsetTop!==1,a.getComputedStyle&&(b.pixelPosition=(a.getComputedStyle(d,null)||{}).top!=="1%",b.boxSizingReliable=(a.getComputedStyle(d,null)||{width:"4px"}).width==="4px",g=e.createElement("div"),g.style.cssText=d.style.cssText=h,g.style.marginRight=g.style.width="0",d.style.width="1px",d.appendChild(g),b.reliableMarginRight=!parseFloat((a.getComputedStyle(g,null)||{}).marginRight)),typeof d.style.zoom!="undefined"&&(d.innerHTML="",d.style.cssText=h+"width:1px;padding:1px;display:inline;zoom:1",b.inlineBlockNeedsLayout=d.offsetWidth===3,d.style.display="block",d.style.overflow="visible",d.innerHTML="<div></div>",d.firstChild.style.width="5px",b.shrinkWrapBlocks=d.offsetWidth!==3,c.style.zoom=1),i.removeChild(c),c=d=f=g=null}),i.removeChild(n),c=d=f=g=h=i=n=null,b}();var H=/^(?:\{.*\}|\[.*\])$/,I=/([A-Z])/g;p.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(p.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){return a=a.nodeType?p.cache[a[p.expando]]:a[p.expando],!!a&&!K(a)},data:function(a,c,d,e){if(!p.acceptData(a))return;var f,g,h=p.expando,i=typeof c=="string",j=a.nodeType,k=j?p.cache:a,l=j?a[h]:a[h]&&h;if((!l||!k[l]||!e&&!k[l].data)&&i&&d===b)return;l||(j?a[h]=l=p.deletedIds.pop()||++p.uuid:l=h),k[l]||(k[l]={},j||(k[l].toJSON=p.noop));if(typeof c=="object"||typeof c=="function")e?k[l]=p.extend(k[l],c):k[l].data=p.extend(k[l].data,c);return f=k[l],e||(f.data||(f.data={}),f=f.data),d!==b&&(f[p.camelCase(c)]=d),i?(g=f[c],g==null&&(g=f[p.camelCase(c)])):g=f,g},removeData:function(a,b,c){if(!p.acceptData(a))return;var d,e,f,g=a.nodeType,h=g?p.cache:a,i=g?a[p.expando]:p.expando;if(!h[i])return;if(b){d=c?h[i]:h[i].data;if(d){p.isArray(b)||(b in d?b=[b]:(b=p.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,f=b.length;e<f;e++)delete d[b[e]];if(!(c?K:p.isEmptyObject)(d))return}}if(!c){delete h[i].data;if(!K(h[i]))return}g?p.cleanData([a],!0):p.support.deleteExpando||h!=h.window?delete h[i]:h[i]=null},_data:function(a,b,c){return p.data(a,b,c,!0)},acceptData:function(a){var b=a.nodeName&&p.noData[a.nodeName.toLowerCase()];return!b||b!==!0&&a.getAttribute("classid")===b}}),p.fn.extend({data:function(a,c){var d,e,f,g,h,i=this[0],j=0,k=null;if(a===b){if(this.length){k=p.data(i);if(i.nodeType===1&&!p._data(i,"parsedAttrs")){f=i.attributes;for(h=f.length;j<h;j++)g=f[j].name,g.indexOf("data-")===0&&(g=p.camelCase(g.substring(5)),J(i,g,k[g]));p._data(i,"parsedAttrs",!0)}}return k}return typeof a=="object"?this.each(function(){p.data(this,a)}):(d=a.split(".",2),d[1]=d[1]?"."+d[1]:"",e=d[1]+"!",p.access(this,function(c){if(c===b)return k=this.triggerHandler("getData"+e,[d[0]]),k===b&&i&&(k=p.data(i,a),k=J(i,a,k)),k===b&&d[1]?this.data(d[0]):k;d[1]=c,this.each(function(){var b=p(this);b.triggerHandler("setData"+e,d),p.data(this,a,c),b.triggerHandler("changeData"+e,d)})},null,c,arguments.length>1,null,!1))},removeData:function(a){return this.each(function(){p.removeData(this,a)})}}),p.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=p._data(a,b),c&&(!d||p.isArray(c)?d=p._data(a,b,p.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=p.queue(a,b),d=c.shift(),e=p._queueHooks(a,b),f=function(){p.dequeue(a,b)};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),delete e.stop,d.call(a,f,e)),!c.length&&e&&e.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return p._data(a,c)||p._data(a,c,{empty:p.Callbacks("once memory").add(function(){p.removeData(a,b+"queue",!0),p.removeData(a,c,!0)})})}}),p.fn.extend({queue:function(a,c){var d=2;return typeof a!="string"&&(c=a,a="fx",d--),arguments.length<d?p.queue(this[0],a):c===b?this:this.each(function(){var b=p.queue(this,a,c);p._queueHooks(this,a),a==="fx"&&b[0]!=="inprogress"&&p.dequeue(this,a)})},dequeue:function(a){return this.each(function(){p.dequeue(this,a)})},delay:function(a,b){return a=p.fx?p.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){var d,e=1,f=p.Deferred(),g=this,h=this.length,i=function(){--e||f.resolveWith(g,[g])};typeof a!="string"&&(c=a,a=b),a=a||"fx";while(h--)(d=p._data(g[h],a+"queueHooks"))&&d.empty&&(e++,d.empty.add(i));return i(),f.promise(c)}});var L,M,N,O=/[\t\r\n]/g,P=/\r/g,Q=/^(?:button|input)$/i,R=/^(?:button|input|object|select|textarea)$/i,S=/^a(?:rea|)$/i,T=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,U=p.support.getSetAttribute;p.fn.extend({attr:function(a,b){return p.access(this,p.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){p.removeAttr(this,a)})},prop:function(a,b){return p.access(this,p.prop,a,b,arguments.length>1)},removeProp:function(a){return a=p.propFix[a]||a,this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,f,g,h;if(p.isFunction(a))return this.each(function(b){p(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(s);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{f=" "+e.className+" ";for(g=0,h=b.length;g<h;g++)~f.indexOf(" "+b[g]+" ")||(f+=b[g]+" ");e.className=p.trim(f)}}}return this},removeClass:function(a){var c,d,e,f,g,h,i;if(p.isFunction(a))return this.each(function(b){p(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(s);for(h=0,i=this.length;h<i;h++){e=this[h];if(e.nodeType===1&&e.className){d=(" "+e.className+" ").replace(O," ");for(f=0,g=c.length;f<g;f++)while(d.indexOf(" "+c[f]+" ")>-1)d=d.replace(" "+c[f]+" "," ");e.className=a?p.trim(d):""}}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";return p.isFunction(a)?this.each(function(c){p(this).toggleClass(a.call(this,c,this.className,b),b)}):this.each(function(){if(c==="string"){var e,f=0,g=p(this),h=b,i=a.split(s);while(e=i[f++])h=d?h:!g.hasClass(e),g[h?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&p._data(this,"__className__",this.className),this.className=this.className||a===!1?"":p._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(O," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,f=this[0];if(!arguments.length){if(f)return c=p.valHooks[f.type]||p.valHooks[f.nodeName.toLowerCase()],c&&"get"in c&&(d=c.get(f,"value"))!==b?d:(d=f.value,typeof d=="string"?d.replace(P,""):d==null?"":d);return}return e=p.isFunction(a),this.each(function(d){var f,g=p(this);if(this.nodeType!==1)return;e?f=a.call(this,d,g.val()):f=a,f==null?f="":typeof f=="number"?f+="":p.isArray(f)&&(f=p.map(f,function(a){return a==null?"":a+""})),c=p.valHooks[this.type]||p.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,f,"value")===b)this.value=f})}}),p.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,f=a.selectedIndex,g=[],h=a.options,i=a.type==="select-one";if(f<0)return null;c=i?f:0,d=i?f+1:h.length;for(;c<d;c++){e=h[c];if(e.selected&&(p.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!p.nodeName(e.parentNode,"optgroup"))){b=p(e).val();if(i)return b;g.push(b)}}return i&&!g.length&&h.length?p(h[f]).val():g},set:function(a,b){var c=p.makeArray(b);return p(a).find("option").each(function(){this.selected=p.inArray(p(this).val(),c)>=0}),c.length||(a.selectedIndex=-1),c}}},attrFn:{},attr:function(a,c,d,e){var f,g,h,i=a.nodeType;if(!a||i===3||i===8||i===2)return;if(e&&p.isFunction(p.fn[c]))return p(a)[c](d);if(typeof a.getAttribute=="undefined")return p.prop(a,c,d);h=i!==1||!p.isXMLDoc(a),h&&(c=c.toLowerCase(),g=p.attrHooks[c]||(T.test(c)?M:L));if(d!==b){if(d===null){p.removeAttr(a,c);return}return g&&"set"in g&&h&&(f=g.set(a,d,c))!==b?f:(a.setAttribute(c,""+d),d)}return g&&"get"in g&&h&&(f=g.get(a,c))!==null?f:(f=a.getAttribute(c),f===null?b:f)},removeAttr:function(a,b){var c,d,e,f,g=0;if(b&&a.nodeType===1){d=b.split(s);for(;g<d.length;g++)e=d[g],e&&(c=p.propFix[e]||e,f=T.test(e),f||p.attr(a,e,""),a.removeAttribute(U?e:c),f&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(Q.test(a.nodeName)&&a.parentNode)p.error("type property can't be changed");else if(!p.support.radioValue&&b==="radio"&&p.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}},value:{get:function(a,b){return L&&p.nodeName(a,"button")?L.get(a,b):b in a?a.value:null},set:function(a,b,c){if(L&&p.nodeName(a,"button"))return L.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,f,g,h=a.nodeType;if(!a||h===3||h===8||h===2)return;return g=h!==1||!p.isXMLDoc(a),g&&(c=p.propFix[c]||c,f=p.propHooks[c]),d!==b?f&&"set"in f&&(e=f.set(a,d,c))!==b?e:a[c]=d:f&&"get"in f&&(e=f.get(a,c))!==null?e:a[c]},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):R.test(a.nodeName)||S.test(a.nodeName)&&a.href?0:b}}}}),M={get:function(a,c){var d,e=p.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;return b===!1?p.removeAttr(a,c):(d=p.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase())),c}},U||(N={name:!0,id:!0,coords:!0},L=p.valHooks.button={get:function(a,c){var d;return d=a.getAttributeNode(c),d&&(N[c]?d.value!=="":d.specified)?d.value:b},set:function(a,b,c){var d=a.getAttributeNode(c);return d||(d=e.createAttribute(c),a.setAttributeNode(d)),d.value=b+""}},p.each(["width","height"],function(a,b){p.attrHooks[b]=p.extend(p.attrHooks[b],{set:function(a,c){if(c==="")return a.setAttribute(b,"auto"),c}})}),p.attrHooks.contenteditable={get:L.get,set:function(a,b,c){b===""&&(b="false"),L.set(a,b,c)}}),p.support.hrefNormalized||p.each(["href","src","width","height"],function(a,c){p.attrHooks[c]=p.extend(p.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),p.support.style||(p.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),p.support.optSelected||(p.propHooks.selected=p.extend(p.propHooks.selected,{get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}})),p.support.enctype||(p.propFix.enctype="encoding"),p.support.checkOn||p.each(["radio","checkbox"],function(){p.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),p.each(["radio","checkbox"],function(){p.valHooks[this]=p.extend(p.valHooks[this],{set:function(a,b){if(p.isArray(b))return a.checked=p.inArray(p(a).val(),b)>=0}})});var V=/^(?:textarea|input|select)$/i,W=/^([^\.]*|)(?:\.(.+)|)$/,X=/(?:^|\s)hover(\.\S+|)\b/,Y=/^key/,Z=/^(?:mouse|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=function(a){return p.event.special.hover?a:a.replace(X,"mouseenter$1 mouseleave$1")};p.event={add:function(a,c,d,e,f){var g,h,i,j,k,l,m,n,o,q,r;if(a.nodeType===3||a.nodeType===8||!c||!d||!(g=p._data(a)))return;d.handler&&(o=d,d=o.handler,f=o.selector),d.guid||(d.guid=p.guid++),i=g.events,i||(g.events=i={}),h=g.handle,h||(g.handle=h=function(a){return typeof p!="undefined"&&(!a||p.event.triggered!==a.type)?p.event.dispatch.apply(h.elem,arguments):b},h.elem=a),c=p.trim(_(c)).split(" ");for(j=0;j<c.length;j++){k=W.exec(c[j])||[],l=k[1],m=(k[2]||"").split(".").sort(),r=p.event.special[l]||{},l=(f?r.delegateType:r.bindType)||l,r=p.event.special[l]||{},n=p.extend({type:l,origType:k[1],data:e,handler:d,guid:d.guid,selector:f,namespace:m.join(".")},o),q=i[l];if(!q){q=i[l]=[],q.delegateCount=0;if(!r.setup||r.setup.call(a,e,m,h)===!1)a.addEventListener?a.addEventListener(l,h,!1):a.attachEvent&&a.attachEvent("on"+l,h)}r.add&&(r.add.call(a,n),n.handler.guid||(n.handler.guid=d.guid)),f?q.splice(q.delegateCount++,0,n):q.push(n),p.event.global[l]=!0}a=null},global:{},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,q,r=p.hasData(a)&&p._data(a);if(!r||!(m=r.events))return;b=p.trim(_(b||"")).split(" ");for(f=0;f<b.length;f++){g=W.exec(b[f])||[],h=i=g[1],j=g[2];if(!h){for(h in m)p.event.remove(a,h+b[f],c,d,!0);continue}n=p.event.special[h]||{},h=(d?n.delegateType:n.bindType)||h,o=m[h]||[],k=o.length,j=j?new RegExp("(^|\\.)"+j.split(".").sort().join("\\.(?:.*\\.|)")+"(\\.|$)"):null;for(l=0;l<o.length;l++)q=o[l],(e||i===q.origType)&&(!c||c.guid===q.guid)&&(!j||j.test(q.namespace))&&(!d||d===q.selector||d==="**"&&q.selector)&&(o.splice(l--,1),q.selector&&o.delegateCount--,n.remove&&n.remove.call(a,q));o.length===0&&k!==o.length&&((!n.teardown||n.teardown.call(a,j,r.handle)===!1)&&p.removeEvent(a,h,r.handle),delete m[h])}p.isEmptyObject(m)&&(delete r.handle,p.removeData(a,"events",!0))},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,f,g){if(!f||f.nodeType!==3&&f.nodeType!==8){var h,i,j,k,l,m,n,o,q,r,s=c.type||c,t=[];if($.test(s+p.event.triggered))return;s.indexOf("!")>=0&&(s=s.slice(0,-1),i=!0),s.indexOf(".")>=0&&(t=s.split("."),s=t.shift(),t.sort());if((!f||p.event.customEvent[s])&&!p.event.global[s])return;c=typeof c=="object"?c[p.expando]?c:new p.Event(s,c):new p.Event(s),c.type=s,c.isTrigger=!0,c.exclusive=i,c.namespace=t.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+t.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,m=s.indexOf(":")<0?"on"+s:"";if(!f){h=p.cache;for(j in h)h[j].events&&h[j].events[s]&&p.event.trigger(c,d,h[j].handle.elem,!0);return}c.result=b,c.target||(c.target=f),d=d!=null?p.makeArray(d):[],d.unshift(c),n=p.event.special[s]||{};if(n.trigger&&n.trigger.apply(f,d)===!1)return;q=[[f,n.bindType||s]];if(!g&&!n.noBubble&&!p.isWindow(f)){r=n.delegateType||s,k=$.test(r+s)?f:f.parentNode;for(l=f;k;k=k.parentNode)q.push([k,r]),l=k;l===(f.ownerDocument||e)&&q.push([l.defaultView||l.parentWindow||a,r])}for(j=0;j<q.length&&!c.isPropagationStopped();j++)k=q[j][0],c.type=q[j][1],o=(p._data(k,"events")||{})[c.type]&&p._data(k,"handle"),o&&o.apply(k,d),o=m&&k[m],o&&p.acceptData(k)&&o.apply(k,d)===!1&&c.preventDefault();return c.type=s,!g&&!c.isDefaultPrevented()&&(!n._default||n._default.apply(f.ownerDocument,d)===!1)&&(s!=="click"||!p.nodeName(f,"a"))&&p.acceptData(f)&&m&&f[s]&&(s!=="focus"&&s!=="blur"||c.target.offsetWidth!==0)&&!p.isWindow(f)&&(l=f[m],l&&(f[m]=null),p.event.triggered=s,f[s](),p.event.triggered=b,l&&(f[m]=l)),c.result}return},dispatch:function(c){c=p.event.fix(c||a.event);var d,e,f,g,h,i,j,k,l,m,n,o=(p._data(this,"events")||{})[c.type]||[],q=o.delegateCount,r=[].slice.call(arguments),s=!c.exclusive&&!c.namespace,t=p.event.special[c.type]||{},u=[];r[0]=c,c.delegateTarget=this;if(t.preDispatch&&t.preDispatch.call(this,c)===!1)return;if(q&&(!c.button||c.type!=="click")){g=p(this),g.context=this;for(f=c.target;f!=this;f=f.parentNode||this)if(f.disabled!==!0||c.type!=="click"){i={},k=[],g[0]=f;for(d=0;d<q;d++)l=o[d],m=l.selector,i[m]===b&&(i[m]=g.is(m)),i[m]&&k.push(l);k.length&&u.push({elem:f,matches:k})}}o.length>q&&u.push({elem:this,matches:o.slice(q)});for(d=0;d<u.length&&!c.isPropagationStopped();d++){j=u[d],c.currentTarget=j.elem;for(e=0;e<j.matches.length&&!c.isImmediatePropagationStopped();e++){l=j.matches[e];if(s||!c.namespace&&!l.namespace||c.namespace_re&&c.namespace_re.test(l.namespace))c.data=l.data,c.handleObj=l,h=((p.event.special[l.origType]||{}).handle||l.handler).apply(j.elem,r),h!==b&&(c.result=h,h===!1&&(c.preventDefault(),c.stopPropagation()))}}return t.postDispatch&&t.postDispatch.call(this,c),c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,c){var d,f,g,h=c.button,i=c.fromElement;return a.pageX==null&&c.clientX!=null&&(d=a.target.ownerDocument||e,f=d.documentElement,g=d.body,a.pageX=c.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=c.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?c.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0),a}},fix:function(a){if(a[p.expando])return a;var b,c,d=a,f=p.event.fixHooks[a.type]||{},g=f.props?this.props.concat(f.props):this.props;a=p.Event(d);for(b=g.length;b;)c=g[--b],a[c]=d[c];return a.target||(a.target=d.srcElement||e),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,f.filter?f.filter(a,d):a},special:{ready:{setup:p.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){p.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=p.extend(new p.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?p.event.trigger(e,null,b):p.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},p.event.handle=p.event.dispatch,p.removeEvent=e.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]=="undefined"&&(a[d]=null),a.detachEvent(d,c))},p.Event=function(a,b){if(this instanceof p.Event)a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?bb:ba):this.type=a,b&&p.extend(this,b),this.timeStamp=a&&a.timeStamp||p.now(),this[p.expando]=!0;else return new p.Event(a,b)},p.Event.prototype={preventDefault:function(){this.isDefaultPrevented=bb;var a=this.originalEvent;if(!a)return;a.preventDefault?a.preventDefault():a.returnValue=!1},stopPropagation:function(){this.isPropagationStopped=bb;var a=this.originalEvent;if(!a)return;a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=bb,this.stopPropagation()},isDefaultPrevented:ba,isPropagationStopped:ba,isImmediatePropagationStopped:ba},p.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){p.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj,g=f.selector;if(!e||e!==d&&!p.contains(d,e))a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b;return c}}}),p.support.submitBubbles||(p.event.special.submit={setup:function(){if(p.nodeName(this,"form"))return!1;p.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=p.nodeName(c,"input")||p.nodeName(c,"button")?c.form:b;d&&!p._data(d,"_submit_attached")&&(p.event.add(d,"submit._submit",function(a){a._submit_bubble=!0}),p._data(d,"_submit_attached",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&p.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){if(p.nodeName(this,"form"))return!1;p.event.remove(this,"._submit")}}),p.support.changeBubbles||(p.event.special.change={setup:function(){if(V.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")p.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),p.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),p.event.simulate("change",this,a,!0)});return!1}p.event.add(this,"beforeactivate._change",function(a){var b=a.target;V.test(b.nodeName)&&!p._data(b,"_change_attached")&&(p.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&p.event.simulate("change",this.parentNode,a,!0)}),p._data(b,"_change_attached",!0))})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){return p.event.remove(this,"._change"),V.test(this.nodeName)}}),p.support.focusinBubbles||p.each({focus:"focusin",blur:"focusout"},function(a,b){var c=0,d=function(a){p.event.simulate(b,a.target,p.event.fix(a),!0)};p.event.special[b]={setup:function(){c++===0&&e.addEventListener(a,d,!0)},teardown:function(){--c===0&&e.removeEventListener(a,d,!0)}}}),p.fn.extend({on:function(a,c,d,e,f){var g,h;if(typeof a=="object"){typeof c!="string"&&(d=d||c,c=b);for(h in a)this.on(h,c,d,a[h],f);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=ba;else if(!e)return this;return f===1&&(g=e,e=function(a){return p().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=p.guid++)),this.each(function(){p.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,c,d){var e,f;if(a&&a.preventDefault&&a.handleObj)return e=a.handleObj,p(a.delegateTarget).off(e.namespace?e.origType+"."+e.namespace:e.origType,e.selector,e.handler),this;if(typeof a=="object"){for(f in a)this.off(f,c,a[f]);return this}if(c===!1||typeof c=="function")d=c,c=b;return d===!1&&(d=ba),this.each(function(){p.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){return p(this.context).on(a,this.selector,b,c),this},die:function(a,b){return p(this.context).off(a,this.selector||"**",b),this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a||"**",c)},trigger:function(a,b){return this.each(function(){p.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return p.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||p.guid++,d=0,e=function(c){var e=(p._data(this,"lastToggle"+a.guid)||0)%d;return p._data(this,"lastToggle"+a.guid,e+1),c.preventDefault(),b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),p.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){p.fn[b]=function(a,c){return c==null&&(c=a,a=null),arguments.length>0?this.on(b,null,a,c):this.trigger(b)},Y.test(b)&&(p.event.fixHooks[b]=p.event.keyHooks),Z.test(b)&&(p.event.fixHooks[b]=p.event.mouseHooks)}),function(a,b){function bd(a,b,c,d){var e=0,f=b.length;for(;e<f;e++)Z(a,b[e],c,d)}function be(a,b,c,d,e,f){var g,h=$.setFilters[b.toLowerCase()];return h||Z.error(b),(a||!(g=e))&&bd(a||"*",d,g=[],e),g.length>0?h(g,c,f):[]}function bf(a,c,d,e,f){var g,h,i,j,k,l,m,n,p=0,q=f.length,s=L.POS,t=new RegExp("^"+s.source+"(?!"+r+")","i"),u=function(){var a=1,c=arguments.length-2;for(;a<c;a++)arguments[a]===b&&(g[a]=b)};for(;p<q;p++){s.exec(""),a=f[p],j=[],i=0,k=e;while(g=s.exec(a)){n=s.lastIndex=g.index+g[0].length;if(n>i){m=a.slice(i,g.index),i=n,l=[c],B.test(m)&&(k&&(l=k),k=e);if(h=H.test(m))m=m.slice(0,-5).replace(B,"$&*");g.length>1&&g[0].replace(t,u),k=be(m,g[1],g[2],l,k,h)}}k?(j=j.concat(k),(m=a.slice(i))&&m!==")"?B.test(m)?bd(m,j,d,e):Z(m,c,d,e?e.concat(k):k):o.apply(d,j)):Z(a,c,d,e)}return q===1?d:Z.uniqueSort(d)}function bg(a,b,c){var d,e,f,g=[],i=0,j=D.exec(a),k=!j.pop()&&!j.pop(),l=k&&a.match(C)||[""],m=$.preFilter,n=$.filter,o=!c&&b!==h;for(;(e=l[i])!=null&&k;i++){g.push(d=[]),o&&(e=" "+e);while(e){k=!1;if(j=B.exec(e))e=e.slice(j[0].length),k=d.push({part:j.pop().replace(A," "),captures:j});for(f in n)(j=L[f].exec(e))&&(!m[f]||(j=m[f](j,b,c)))&&(e=e.slice(j.shift().length),k=d.push({part:f,captures:j}));if(!k)break}}return k||Z.error(a),g}function bh(a,b,e){var f=b.dir,g=m++;return a||(a=function(a){return a===e}),b.first?function(b,c){while(b=b[f])if(b.nodeType===1)return a(b,c)&&b}:function(b,e){var h,i=g+"."+d,j=i+"."+c;while(b=b[f])if(b.nodeType===1){if((h=b[q])===j)return b.sizset;if(typeof h=="string"&&h.indexOf(i)===0){if(b.sizset)return b}else{b[q]=j;if(a(b,e))return b.sizset=!0,b;b.sizset=!1}}}}function bi(a,b){return a?function(c,d){var e=b(c,d);return e&&a(e===!0?c:e,d)}:b}function bj(a,b,c){var d,e,f=0;for(;d=a[f];f++)$.relative[d.part]?e=bh(e,$.relative[d.part],b):(d.captures.push(b,c),e=bi(e,$.filter[d.part].apply(null,d.captures)));return e}function bk(a){return function(b,c){var d,e=0;for(;d=a[e];e++)if(d(b,c))return!0;return!1}}var c,d,e,f,g,h=a.document,i=h.documentElement,j="undefined",k=!1,l=!0,m=0,n=[].slice,o=[].push,q=("sizcache"+Math.random()).replace(".",""),r="[\\x20\\t\\r\\n\\f]",s="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",t=s.replace("w","w#"),u="([*^$|!~]?=)",v="\\["+r+"*("+s+")"+r+"*(?:"+u+r+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+t+")|)|)"+r+"*\\]",w=":("+s+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|((?:[^,]|\\\\,|(?:,(?=[^\\[]*\\]))|(?:,(?=[^\\(]*\\))))*))\\)|)",x=":(nth|eq|gt|lt|first|last|even|odd)(?:\\((\\d*)\\)|)(?=[^-]|$)",y=r+"*([\\x20\\t\\r\\n\\f>+~])"+r+"*",z="(?=[^\\x20\\t\\r\\n\\f])(?:\\\\.|"+v+"|"+w.replace(2,7)+"|[^\\\\(),])+",A=new RegExp("^"+r+"+|((?:^|[^\\\\])(?:\\\\.)*)"+r+"+$","g"),B=new RegExp("^"+y),C=new RegExp(z+"?(?="+r+"*,|$)","g"),D=new RegExp("^(?:(?!,)(?:(?:^|,)"+r+"*"+z+")*?|"+r+"*(.*?))(\\)|$)"),E=new RegExp(z.slice(19,-6)+"\\x20\\t\\r\\n\\f>+~])+|"+y,"g"),F=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,G=/[\x20\t\r\n\f]*[+~]/,H=/:not\($/,I=/h\d/i,J=/input|select|textarea|button/i,K=/\\(?!\\)/g,L={ID:new RegExp("^#("+s+")"),CLASS:new RegExp("^\\.("+s+")"),NAME:new RegExp("^\\[name=['\"]?("+s+")['\"]?\\]"),TAG:new RegExp("^("+s.replace("[-","[-\\*")+")"),ATTR:new RegExp("^"+v),PSEUDO:new RegExp("^"+w),CHILD:new RegExp("^:(only|nth|last|first)-child(?:\\("+r+"*(even|odd|(([+-]|)(\\d*)n|)"+r+"*(?:([+-]|)"+r+"*(\\d+)|))"+r+"*\\)|)","i"),POS:new RegExp(x,"ig"),needsContext:new RegExp("^"+r+"*[>+~]|"+x,"i")},M={},N=[],O={},P=[],Q=function(a){return a.sizzleFilter=!0,a},R=function(a){return function(b){return b.nodeName.toLowerCase()==="input"&&b.type===a}},S=function(a){return function(b){var c=b.nodeName.toLowerCase();return(c==="input"||c==="button")&&b.type===a}},T=function(a){var b=!1,c=h.createElement("div");try{b=a(c)}catch(d){}return c=null,b},U=T(function(a){a.innerHTML="<select></select>";var b=typeof a.lastChild.getAttribute("multiple");return b!=="boolean"&&b!=="string"}),V=T(function(a){a.id=q+0,a.innerHTML="<a name='"+q+"'></a><div name='"+q+"'></div>",i.insertBefore(a,i.firstChild);var b=h.getElementsByName&&h.getElementsByName(q).length===2+h.getElementsByName(q+0).length;return g=!h.getElementById(q),i.removeChild(a),b}),W=T(function(a){return a.appendChild(h.createComment("")),a.getElementsByTagName("*").length===0}),X=T(function(a){return a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!==j&&a.firstChild.getAttribute("href")==="#"}),Y=T(function(a){return a.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",!a.getElementsByClassName||a.getElementsByClassName("e").length===0?!1:(a.lastChild.className="e",a.getElementsByClassName("e").length!==1)}),Z=function(a,b,c,d){c=c||[],b=b||h;var e,f,g,i,j=b.nodeType;if(j!==1&&j!==9)return[];if(!a||typeof a!="string")return c;g=ba(b);if(!g&&!d)if(e=F.exec(a))if(i=e[1]){if(j===9){f=b.getElementById(i);if(!f||!f.parentNode)return c;if(f.id===i)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(i))&&bb(b,f)&&f.id===i)return c.push(f),c}else{if(e[2])return o.apply(c,n.call(b.getElementsByTagName(a),0)),c;if((i=e[3])&&Y&&b.getElementsByClassName)return o.apply(c,n.call(b.getElementsByClassName(i),0)),c}return bm(a,b,c,d,g)},$=Z.selectors={cacheLength:50,match:L,order:["ID","TAG"],attrHandle:{},createPseudo:Q,find:{ID:g?function(a,b,c){if(typeof b.getElementById!==j&&!c){var d=b.getElementById(a);return d&&d.parentNode?[d]:[]}}:function(a,c,d){if(typeof c.getElementById!==j&&!d){var e=c.getElementById(a);return e?e.id===a||typeof e.getAttributeNode!==j&&e.getAttributeNode("id").value===a?[e]:b:[]}},TAG:W?function(a,b){if(typeof b.getElementsByTagName!==j)return b.getElementsByTagName(a)}:function(a,b){var c=b.getElementsByTagName(a);if(a==="*"){var d,e=[],f=0;for(;d=c[f];f++)d.nodeType===1&&e.push(d);return e}return c}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(K,""),a[3]=(a[4]||a[5]||"").replace(K,""),a[2]==="~="&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),a[1]==="nth"?(a[2]||Z.error(a[0]),a[3]=+(a[3]?a[4]+(a[5]||1):2*(a[2]==="even"||a[2]==="odd")),a[4]=+(a[6]+a[7]||a[2]==="odd")):a[2]&&Z.error(a[0]),a},PSEUDO:function(a){var b,c=a[4];return L.CHILD.test(a[0])?null:(c&&(b=D.exec(c))&&b.pop()&&(a[0]=a[0].slice(0,b[0].length-c.length-1),c=b[0].slice(0,-1)),a.splice(2,3,c||a[3]),a)}},filter:{ID:g?function(a){return a=a.replace(K,""),function(b){return b.getAttribute("id")===a}}:function(a){return a=a.replace(K,""),function(b){var c=typeof b.getAttributeNode!==j&&b.getAttributeNode("id");return c&&c.value===a}},TAG:function(a){return a==="*"?function(){return!0}:(a=a.replace(K,"").toLowerCase(),function(b){return b.nodeName&&b.nodeName.toLowerCase()===a})},CLASS:function(a){var b=M[a];return b||(b=M[a]=new RegExp("(^|"+r+")"+a+"("+r+"|$)"),N.push(a),N.length>$.cacheLength&&delete M[N.shift()]),function(a){return b.test(a.className||typeof a.getAttribute!==j&&a.getAttribute("class")||"")}},ATTR:function(a,b,c){return b?function(d){var e=Z.attr(d,a),f=e+"";if(e==null)return b==="!=";switch(b){case"=":return f===c;case"!=":return f!==c;case"^=":return c&&f.indexOf(c)===0;case"*=":return c&&f.indexOf(c)>-1;case"$=":return c&&f.substr(f.length-c.length)===c;case"~=":return(" "+f+" ").indexOf(c)>-1;case"|=":return f===c||f.substr(0,c.length+1)===c+"-"}}:function(b){return Z.attr(b,a)!=null}},CHILD:function(a,b,c,d){if(a==="nth"){var e=m++;return function(a){var b,f,g=0,h=a;if(c===1&&d===0)return!0;b=a.parentNode;if(b&&(b[q]!==e||!a.sizset)){for(h=b.firstChild;h;h=h.nextSibling)if(h.nodeType===1){h.sizset=++g;if(h===a)break}b[q]=e}return f=a.sizset-d,c===0?f===0:f%c===0&&f/c>=0}}return function(b){var c=b;switch(a){case"only":case"first":while(c=c.previousSibling)if(c.nodeType===1)return!1;if(a==="first")return!0;c=b;case"last":while(c=c.nextSibling)if(c.nodeType===1)return!1;return!0}}},PSEUDO:function(a,b,c,d){var e=$.pseudos[a]||$.pseudos[a.toLowerCase()];return e||Z.error("unsupported pseudo: "+a),e.sizzleFilter?e(b,c,d):e}},pseudos:{not:Q(function(a,b,c){var d=bl(a.replace(A,"$1"),b,c);return function(a){return!d(a)}}),enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&!!a.checked||b==="option"&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},parent:function(a){return!$.pseudos.empty(a)},empty:function(a){var b;a=a.firstChild;while(a){if(a.nodeName>"@"||(b=a.nodeType)===3||b===4)return!1;a=a.nextSibling}return!0},contains:Q(function(a){return function(b){return(b.textContent||b.innerText||bc(b)).indexOf(a)>-1}}),has:Q(function(a){return function(b){return Z(a,b).length>0}}),header:function(a){return I.test(a.nodeName)},text:function(a){var b,c;return a.nodeName.toLowerCase()==="input"&&(b=a.type)==="text"&&((c=a.getAttribute("type"))==null||c.toLowerCase()===b)},radio:R("radio"),checkbox:R("checkbox"),file:R("file"),password:R("password"),image:R("image"),submit:S("submit"),reset:S("reset"),button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&a.type==="button"||b==="button"},input:function(a){return J.test(a.nodeName)},focus:function(a){var b=a.ownerDocument;return a===b.activeElement&&(!b.hasFocus||b.hasFocus())&&(!!a.type||!!a.href)},active:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b,c){return c?a.slice(1):[a[0]]},last:function(a,b,c){var d=a.pop();return c?a:[d]},even:function(a,b,c){var d=[],e=c?1:0,f=a.length;for(;e<f;e=e+2)d.push(a[e]);return d},odd:function(a,b,c){var d=[],e=c?0:1,f=a.length;for(;e<f;e=e+2)d.push(a[e]);return d},lt:function(a,b,c){return c?a.slice(+b):a.slice(0,+b)},gt:function(a,b,c){return c?a.slice(0,+b+1):a.slice(+b+1)},eq:function(a,b,c){var d=a.splice(+b,1);return c?a:d}}};$.setFilters.nth=$.setFilters.eq,$.filters=$.pseudos,X||($.attrHandle={href:function(a){return a.getAttribute("href",2)},type:function(a){return a.getAttribute("type")}}),V&&($.order.push("NAME"),$.find.NAME=function(a,b){if(typeof b.getElementsByName!==j)return b.getElementsByName(a)}),Y&&($.order.splice(1,0,"CLASS"),$.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!==j&&!c)return b.getElementsByClassName(a)});try{n.call(i.childNodes,0)[0].nodeType}catch(_){n=function(a){var b,c=[];for(;b=this[a];a++)c.push(b);return c}}var ba=Z.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?b.nodeName!=="HTML":!1},bb=Z.contains=i.compareDocumentPosition?function(a,b){return!!(a.compareDocumentPosition(b)&16)}:i.contains?function(a,b){var c=a.nodeType===9?a.documentElement:a,d=b.parentNode;return a===d||!!(d&&d.nodeType===1&&c.contains&&c.contains(d))}:function(a,b){while(b=b.parentNode)if(b===a)return!0;return!1},bc=Z.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(e===1||e===9||e===11){if(typeof a.textContent=="string")return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=bc(a)}else if(e===3||e===4)return a.nodeValue}else for(;b=a[d];d++)c+=bc(b);return c};Z.attr=function(a,b){var c,d=ba(a);return d||(b=b.toLowerCase()),$.attrHandle[b]?$.attrHandle[b](a):U||d?a.getAttribute(b):(c=a.getAttributeNode(b),c?typeof a[b]=="boolean"?a[b]?b:null:c.specified?c.value:null:null)},Z.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},[0,0].sort(function(){return l=0}),i.compareDocumentPosition?e=function(a,b){return a===b?(k=!0,0):(!a.compareDocumentPosition||!b.compareDocumentPosition?a.compareDocumentPosition:a.compareDocumentPosition(b)&4)?-1:1}:(e=function(a,b){if(a===b)return k=!0,0;if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],g=[],h=a.parentNode,i=b.parentNode,j=h;if(h===i)return f(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)g.unshift(j),j=j.parentNode;c=e.length,d=g.length;for(var l=0;l<c&&l<d;l++)if(e[l]!==g[l])return f(e[l],g[l]);return l===c?f(a,g[l],-1):f(e[l],b,1)},f=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),Z.uniqueSort=function(a){var b,c=1;if(e){k=l,a.sort(e);if(k)for(;b=a[c];c++)b===a[c-1]&&a.splice(c--,1)}return a};var bl=Z.compile=function(a,b,c){var d,e,f,g=O[a];if(g&&g.context===b)return g;e=bg(a,b,c);for(f=0;d=e[f];f++)e[f]=bj(d,b,c);return g=O[a]=bk(e),g.context=b,g.runs=g.dirruns=0,P.push(a),P.length>$.cacheLength&&delete O[P.shift()],g};Z.matches=function(a,b){return Z(a,null,null,b)},Z.matchesSelector=function(a,b){return Z(b,null,null,[a]).length>0};var bm=function(a,b,e,f,g){a=a.replace(A,"$1");var h,i,j,k,l,m,p,q,r,s=a.match(C),t=a.match(E),u=b.nodeType;if(L.POS.test(a))return bf(a,b,e,f,s);if(f)h=n.call(f,0);else if(s&&s.length===1){if(t.length>1&&u===9&&!g&&(s=L.ID.exec(t[0]))){b=$.find.ID(s[1],b,g)[0];if(!b)return e;a=a.slice(t.shift().length)}q=(s=G.exec(t[0]))&&!s.index&&b.parentNode||b,r=t.pop(),m=r.split(":not")[0];for(j=0,k=$.order.length;j<k;j++){p=$.order[j];if(s=L[p].exec(m)){h=$.find[p]((s[1]||"").replace(K,""),q,g);if(h==null)continue;m===r&&(a=a.slice(0,a.length-r.length)+m.replace(L[p],""),a||o.apply(e,n.call(h,0)));break}}}if(a){i=bl(a,b,g),d=i.dirruns++,h==null&&(h=$.find.TAG("*",G.test(a)&&b.parentNode||b));for(j=0;l=h[j];j++)c=i.runs++,i(l,b)&&e.push(l)}return e};h.querySelectorAll&&function(){var a,b=bm,c=/'|\\/g,d=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,e=[],f=[":active"],g=i.matchesSelector||i.mozMatchesSelector||i.webkitMatchesSelector||i.oMatchesSelector||i.msMatchesSelector;T(function(a){a.innerHTML="<select><option selected></option></select>",a.querySelectorAll("[selected]").length||e.push("\\["+r+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),a.querySelectorAll(":checked").length||e.push(":checked")}),T(function(a){a.innerHTML="<p test=''></p>",a.querySelectorAll("[test^='']").length&&e.push("[*^$]="+r+"*(?:\"\"|'')"),a.innerHTML="<input type='hidden'>",a.querySelectorAll(":enabled").length||e.push(":enabled",":disabled")}),e=e.length&&new RegExp(e.join("|")),bm=function(a,d,f,g,h){if(!g&&!h&&(!e||!e.test(a)))if(d.nodeType===9)try{return o.apply(f,n.call(d.querySelectorAll(a),0)),f}catch(i){}else if(d.nodeType===1&&d.nodeName.toLowerCase()!=="object"){var j=d.getAttribute("id"),k=j||q,l=G.test(a)&&d.parentNode||d;j?k=k.replace(c,"\\$&"):d.setAttribute("id",k);try{return o.apply(f,n.call(l.querySelectorAll(a.replace(C,"[id='"+k+"'] $&")),0)),f}catch(i){}finally{j||d.removeAttribute("id")}}return b(a,d,f,g,h)},g&&(T(function(b){a=g.call(b,"div");try{g.call(b,"[test!='']:sizzle"),f.push($.match.PSEUDO)}catch(c){}}),f=new RegExp(f.join("|")),Z.matchesSelector=function(b,c){c=c.replace(d,"='$1']");if(!ba(b)&&!f.test(c)&&(!e||!e.test(c)))try{var h=g.call(b,c);if(h||a||b.document&&b.document.nodeType!==11)return h}catch(i){}return Z(c,null,null,[b]).length>0})}(),Z.attr=p.attr,p.find=Z,p.expr=Z.selectors,p.expr[":"]=p.expr.pseudos,p.unique=Z.uniqueSort,p.text=Z.getText,p.isXMLDoc=Z.isXML,p.contains=Z.contains}(a);var bc=/Until$/,bd=/^(?:parents|prev(?:Until|All))/,be=/^.[^:#\[\.,]*$/,bf=p.expr.match.needsContext,bg={children:!0,contents:!0,next:!0,prev:!0};p.fn.extend({find:function(a){var b,c,d,e,f,g,h=this;if(typeof a!="string")return p(a).filter(function(){for(b=0,c=h.length;b<c;b++)if(p.contains(h[b],this))return!0});g=this.pushStack("","find",a);for(b=0,c=this.length;b<c;b++){d=g.length,p.find(a,this[b],g);if(b>0)for(e=d;e<g.length;e++)for(f=0;f<d;f++)if(g[f]===g[e]){g.splice(e--,1);break}}return g},has:function(a){var b,c=p(a,this),d=c.length;return this.filter(function(){for(b=0;b<d;b++)if(p.contains(this,c[b]))return!0})},not:function(a){return this.pushStack(bj(this,a,!1),"not",a)},filter:function(a){return this.pushStack(bj(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?bf.test(a)?p(a,this.context).index(this[0])>=0:p.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c,d=0,e=this.length,f=[],g=bf.test(a)||typeof a!="string"?p(a,b||this.context):0;for(;d<e;d++){c=this[d];while(c&&c.ownerDocument&&c!==b&&c.nodeType!==11){if(g?g.index(c)>-1:p.find.matchesSelector(c,a)){f.push(c);break}c=c.parentNode}}return f=f.length>1?p.unique(f):f,this.pushStack(f,"closest",a)},index:function(a){return a?typeof a=="string"?p.inArray(this[0],p(a)):p.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(a,b){var c=typeof a=="string"?p(a,b):p.makeArray(a&&a.nodeType?[a]:a),d=p.merge(this.get(),c);return this.pushStack(bh(c[0])||bh(d[0])?d:p.unique(d))},addBack:function(a){return this.add(a==null?this.prevObject:this.prevObject.filter(a))}}),p.fn.andSelf=p.fn.addBack,p.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return p.dir(a,"parentNode")},parentsUntil:function(a,b,c){return p.dir(a,"parentNode",c)},next:function(a){return bi(a,"nextSibling")},prev:function(a){return bi(a,"previousSibling")},nextAll:function(a){return p.dir(a,"nextSibling")},prevAll:function(a){return p.dir(a,"previousSibling")},nextUntil:function(a,b,c){return p.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return p.dir(a,"previousSibling",c)},siblings:function(a){return p.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return p.sibling(a.firstChild)},contents:function(a){return p.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:p.merge([],a.childNodes)}},function(a,b){p.fn[a]=function(c,d){var e=p.map(this,b,c);return bc.test(a)||(d=c),d&&typeof d=="string"&&(e=p.filter(d,e)),e=this.length>1&&!bg[a]?p.unique(e):e,this.length>1&&bd.test(a)&&(e=e.reverse()),this.pushStack(e,a,k.call(arguments).join(","))}}),p.extend({filter:function(a,b,c){return c&&(a=":not("+a+")"),b.length===1?p.find.matchesSelector(b[0],a)?[b[0]]:[]:p.find.matches(a,b)},dir:function(a,c,d){var e=[],f=a[c];while(f&&f.nodeType!==9&&(d===b||f.nodeType!==1||!p(f).is(d)))f.nodeType===1&&e.push(f),f=f[c];return e},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var bl="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",bm=/ jQuery\d+="(?:null|\d+)"/g,bn=/^\s+/,bo=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bp=/<([\w:]+)/,bq=/<tbody/i,br=/<|&#?\w+;/,bs=/<(?:script|style|link)/i,bt=/<(?:script|object|embed|option|style)/i,bu=new RegExp("<(?:"+bl+")[\\s/>]","i"),bv=/^(?:checkbox|radio)$/,bw=/checked\s*(?:[^=]|=\s*.checked.)/i,bx=/\/(java|ecma)script/i,by=/^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,bz={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bA=bk(e),bB=bA.appendChild(e.createElement("div"));bz.optgroup=bz.option,bz.tbody=bz.tfoot=bz.colgroup=bz.caption=bz.thead,bz.th=bz.td,p.support.htmlSerialize||(bz._default=[1,"X<div>","</div>"]),p.fn.extend({text:function(a){return p.access(this,function(a){return a===b?p.text(this):this.empty().append((this[0]&&this[0].ownerDocument||e).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(p.isFunction(a))return this.each(function(b){p(this).wrapAll(a.call(this,b))});if(this[0]){var b=p(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return p.isFunction(a)?this.each(function(b){p(this).wrapInner(a.call(this,b))}):this.each(function(){var b=p(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=p.isFunction(a);return this.each(function(c){p(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){p.nodeName(this,"body")||p(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(a,this.firstChild)})},before:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(a,this),"before",this.selector)}},after:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(this,a),"after",this.selector)}},remove:function(a,b){var c,d=0;for(;(c=this[d])!=null;d++)if(!a||p.filter(a,[c]).length)!b&&c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),p.cleanData([c])),c.parentNode&&c.parentNode.removeChild(c);return this},empty:function(){var a,b=0;for(;(a=this[b])!=null;b++){a.nodeType===1&&p.cleanData(a.getElementsByTagName("*"));while(a.firstChild)a.removeChild(a.firstChild)}return this},clone:function(a,b){return a=a==null?!1:a,b=b==null?a:b,this.map(function(){return p.clone(this,a,b)})},html:function(a){return p.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(bm,""):b;if(typeof a=="string"&&!bs.test(a)&&(p.support.htmlSerialize||!bu.test(a))&&(p.support.leadingWhitespace||!bn.test(a))&&!bz[(bp.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(bo,"<$1></$2>");try{for(;d<e;d++)c=this[d]||{},c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),c.innerHTML=a);c=0}catch(f){}}c&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(a){return bh(this[0])?this.length?this.pushStack(p(p.isFunction(a)?a():a),"replaceWith",a):this:p.isFunction(a)?this.each(function(b){var c=p(this),d=c.html();c.replaceWith(a.call(this,b,d))}):(typeof a!="string"&&(a=p(a).detach()),this.each(function(){var b=this.nextSibling,c=this.parentNode;p(this).remove(),b?p(b).before(a):p(c).append(a)}))},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){a=[].concat.apply([],a);var e,f,g,h,i=0,j=a[0],k=[],l=this.length;if(!p.support.checkClone&&l>1&&typeof j=="string"&&bw.test(j))return this.each(function(){p(this).domManip(a,c,d)});if(p.isFunction(j))return this.each(function(e){var f=p(this);a[0]=j.call(this,e,c?f.html():b),f.domManip(a,c,d)});if(this[0]){e=p.buildFragment(a,this,k),g=e.fragment,f=g.firstChild,g.childNodes.length===1&&(g=f);if(f){c=c&&p.nodeName(f,"tr");for(h=e.cacheable||l-1;i<l;i++)d.call(c&&p.nodeName(this[i],"table")?bC(this[i],"tbody"):this[i],i===h?g:p.clone(g,!0,!0))}g=f=null,k.length&&p.each(k,function(a,b){b.src?p.ajax?p.ajax({url:b.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):p.error("no ajax"):p.globalEval((b.text||b.textContent||b.innerHTML||"").replace(by,"")),b.parentNode&&b.parentNode.removeChild(b)})}return this}}),p.buildFragment=function(a,c,d){var f,g,h,i=a[0];return c=c||e,c=(c[0]||c).ownerDocument||c[0]||c,typeof c.createDocumentFragment=="undefined"&&(c=e),a.length===1&&typeof i=="string"&&i.length<512&&c===e&&i.charAt(0)==="<"&&!bt.test(i)&&(p.support.checkClone||!bw.test(i))&&(p.support.html5Clone||!bu.test(i))&&(g=!0,f=p.fragments[i],h=f!==b),f||(f=c.createDocumentFragment(),p.clean(a,c,f,d),g&&(p.fragments[i]=h&&f)),{fragment:f,cacheable:g}},p.fragments={},p.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){p.fn[a]=function(c){var d,e=0,f=[],g=p(c),h=g.length,i=this.length===1&&this[0].parentNode;if((i==null||i&&i.nodeType===11&&i.childNodes.length===1)&&h===1)return g[b](this[0]),this;for(;e<h;e++)d=(e>0?this.clone(!0):this).get(),p(g[e])[b](d),f=f.concat(d);return this.pushStack(f,a,g.selector)}}),p.extend({clone:function(a,b,c){var d,e,f,g;p.support.html5Clone||p.isXMLDoc(a)||!bu.test("<"+a.nodeName+">")?g=a.cloneNode(!0):(bB.innerHTML=a.outerHTML,bB.removeChild(g=bB.firstChild));if((!p.support.noCloneEvent||!p.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!p.isXMLDoc(a)){bE(a,g),d=bF(a),e=bF(g);for(f=0;d[f];++f)e[f]&&bE(d[f],e[f])}if(b){bD(a,g);if(c){d=bF(a),e=bF(g);for(f=0;d[f];++f)bD(d[f],e[f])}}return d=e=null,g},clean:function(a,b,c,d){var f,g,h,i,j,k,l,m,n,o,q,r,s=0,t=[];if(!b||typeof b.createDocumentFragment=="undefined")b=e;for(g=b===e&&bA;(h=a[s])!=null;s++){typeof h=="number"&&(h+="");if(!h)continue;if(typeof h=="string")if(!br.test(h))h=b.createTextNode(h);else{g=g||bk(b),l=l||g.appendChild(b.createElement("div")),h=h.replace(bo,"<$1></$2>"),i=(bp.exec(h)||["",""])[1].toLowerCase(),j=bz[i]||bz._default,k=j[0],l.innerHTML=j[1]+h+j[2];while(k--)l=l.lastChild;if(!p.support.tbody){m=bq.test(h),n=i==="table"&&!m?l.firstChild&&l.firstChild.childNodes:j[1]==="<table>"&&!m?l.childNodes:[];for(f=n.length-1;f>=0;--f)p.nodeName(n[f],"tbody")&&!n[f].childNodes.length&&n[f].parentNode.removeChild(n[f])}!p.support.leadingWhitespace&&bn.test(h)&&l.insertBefore(b.createTextNode(bn.exec(h)[0]),l.firstChild),h=l.childNodes,l=g.lastChild}h.nodeType?t.push(h):t=p.merge(t,h)}l&&(g.removeChild(l),h=l=g=null);if(!p.support.appendChecked)for(s=0;(h=t[s])!=null;s++)p.nodeName(h,"input")?bG(h):typeof h.getElementsByTagName!="undefined"&&p.grep(h.getElementsByTagName("input"),bG);if(c){q=function(a){if(!a.type||bx.test(a.type))return d?d.push(a.parentNode?a.parentNode.removeChild(a):a):c.appendChild(a)};for(s=0;(h=t[s])!=null;s++)if(!p.nodeName(h,"script")||!q(h))c.appendChild(h),typeof h.getElementsByTagName!="undefined"&&(r=p.grep(p.merge([],h.getElementsByTagName("script")),q),t.splice.apply(t,[s+1,0].concat(r)),s+=r.length)}return t},cleanData:function(a,b){var c,d,e,f,g=0,h=p.expando,i=p.cache,j=p.support.deleteExpando,k=p.event.special;for(;(e=a[g])!=null;g++)if(b||p.acceptData(e)){d=e[h],c=d&&i[d];if(c){if(c.events)for(f in c.events)k[f]?p.event.remove(e,f):p.removeEvent(e,f,c.handle);i[d]&&(delete i[d],j?delete e[h]:e.removeAttribute?e.removeAttribute(h):e[h]=null,p.deletedIds.push(d))}}}}),function(){var a,b;p.uaMatch=function(a){a=a.toLowerCase();var b=/(chrome)[ \/]([\w.]+)/.exec(a)||/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||a.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},a=p.uaMatch(g.userAgent),b={},a.browser&&(b[a.browser]=!0,b.version=a.version),b.webkit&&(b.safari=!0),p.browser=b,p.sub=function(){function a(b,c){return new a.fn.init(b,c)}p.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function c(c,d){return d&&d instanceof p&&!(d instanceof a)&&(d=a(d)),p.fn.init.call(this,c,d,b)},a.fn.init.prototype=a.fn;var b=a(e);return a}}();var bH,bI,bJ,bK=/alpha\([^)]*\)/i,bL=/opacity=([^)]*)/,bM=/^(top|right|bottom|left)$/,bN=/^margin/,bO=new RegExp("^("+q+")(.*)$","i"),bP=new RegExp("^("+q+")(?!px)[a-z%]+$","i"),bQ=new RegExp("^([-+])=("+q+")","i"),bR={},bS={position:"absolute",visibility:"hidden",display:"block"},bT={letterSpacing:0,fontWeight:400,lineHeight:1},bU=["Top","Right","Bottom","Left"],bV=["Webkit","O","Moz","ms"],bW=p.fn.toggle;p.fn.extend({css:function(a,c){return p.access(this,function(a,c,d){return d!==b?p.style(a,c,d):p.css(a,c)},a,c,arguments.length>1)},show:function(){return bZ(this,!0)},hide:function(){return bZ(this)},toggle:function(a,b){var c=typeof a=="boolean";return p.isFunction(a)&&p.isFunction(b)?bW.apply(this,arguments):this.each(function(){(c?a:bY(this))?p(this).show():p(this).hide()})}}),p.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bH(a,"opacity");return c===""?"1":c}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":p.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!a||a.nodeType===3||a.nodeType===8||!a.style)return;var f,g,h,i=p.camelCase(c),j=a.style;c=p.cssProps[i]||(p.cssProps[i]=bX(j,i)),h=p.cssHooks[c]||p.cssHooks[i];if(d===b)return h&&"get"in h&&(f=h.get(a,!1,e))!==b?f:j[c];g=typeof d,g==="string"&&(f=bQ.exec(d))&&(d=(f[1]+1)*f[2]+parseFloat(p.css(a,c)),g="number");if(d==null||g==="number"&&isNaN(d))return;g==="number"&&!p.cssNumber[i]&&(d+="px");if(!h||!("set"in h)||(d=h.set(a,d,e))!==b)try{j[c]=d}catch(k){}},css:function(a,c,d,e){var f,g,h,i=p.camelCase(c);return c=p.cssProps[i]||(p.cssProps[i]=bX(a.style,i)),h=p.cssHooks[c]||p.cssHooks[i],h&&"get"in h&&(f=h.get(a,!0,e)),f===b&&(f=bH(a,c)),f==="normal"&&c in bT&&(f=bT[c]),d||e!==b?(g=parseFloat(f),d||p.isNumeric(g)?g||0:f):f},swap:function(a,b,c){var d,e,f={};for(e in b)f[e]=a.style[e],a.style[e]=b[e];d=c.call(a);for(e in b)a.style[e]=f[e];return d}}),a.getComputedStyle?bH=function(a,b){var c,d,e,f,g=getComputedStyle(a,null),h=a.style;return g&&(c=g[b],c===""&&!p.contains(a.ownerDocument.documentElement,a)&&(c=p.style(a,b)),bP.test(c)&&bN.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=c,c=g.width,h.width=d,h.minWidth=e,h.maxWidth=f)),c}:e.documentElement.currentStyle&&(bH=function(a,b){var c,d,e=a.currentStyle&&a.currentStyle[b],f=a.style;return e==null&&f&&f[b]&&(e=f[b]),bP.test(e)&&!bM.test(b)&&(c=f.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":e,e=f.pixelLeft+"px",f.left=c,d&&(a.runtimeStyle.left=d)),e===""?"auto":e}),p.each(["height","width"],function(a,b){p.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0||bH(a,"display")!=="none"?ca(a,b,d):p.swap(a,bS,function(){return ca(a,b,d)})},set:function(a,c,d){return b$(a,c,d?b_(a,b,d,p.support.boxSizing&&p.css(a,"boxSizing")==="border-box"):0)}}}),p.support.opacity||(p.cssHooks.opacity={get:function(a,b){return bL.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=p.isNumeric(b)?"alpha(opacity="+b*100+")":"",f=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&p.trim(f.replace(bK,""))===""&&c.removeAttribute){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bK.test(f)?f.replace(bK,e):f+" "+e}}),p(function(){p.support.reliableMarginRight||(p.cssHooks.marginRight={get:function(a,b){return p.swap(a,{display:"inline-block"},function(){if(b)return bH(a,"marginRight")})}}),!p.support.pixelPosition&&p.fn.position&&p.each(["top","left"],function(a,b){p.cssHooks[b]={get:function(a,c){if(c){var d=bH(a,b);return bP.test(d)?p(a).position()[b]+"px":d}}}})}),p.expr&&p.expr.filters&&(p.expr.filters.hidden=function(a){return a.offsetWidth===0&&a.offsetHeight===0||!p.support.reliableHiddenOffsets&&(a.style&&a.style.display||bH(a,"display"))==="none"},p.expr.filters.visible=function(a){return!p.expr.filters.hidden(a)}),p.each({margin:"",padding:"",border:"Width"},function(a,b){p.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bU[d]+b]=e[d]||e[d-2]||e[0];return f}},bN.test(a)||(p.cssHooks[a+b].set=b$)});var cc=/%20/g,cd=/\[\]$/,ce=/\r?\n/g,cf=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,cg=/^(?:select|textarea)/i;p.fn.extend({serialize:function(){return p.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?p.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||cg.test(this.nodeName)||cf.test(this.type))}).map(function(a,b){var c=p(this).val();return c==null?null:p.isArray(c)?p.map(c,function(a,c){return{name:b.name,value:a.replace(ce,"\r\n")}}):{name:b.name,value:c.replace(ce,"\r\n")}}).get()}}),p.param=function(a,c){var d,e=[],f=function(a,b){b=p.isFunction(b)?b():b==null?"":b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=p.ajaxSettings&&p.ajaxSettings.traditional);if(p.isArray(a)||a.jquery&&!p.isPlainObject(a))p.each(a,function(){f(this.name,this.value)});else for(d in a)ch(d,a[d],c,f);return e.join("&").replace(cc,"+")};var ci,cj,ck=/#.*$/,cl=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,cm=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,cn=/^(?:GET|HEAD)$/,co=/^\/\//,cp=/\?/,cq=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,cr=/([?&])_=[^&]*/,cs=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,ct=p.fn.load,cu={},cv={},cw=["*/"]+["*"];try{ci=f.href}catch(cx){ci=e.createElement("a"),ci.href="",ci=ci.href}cj=cs.exec(ci.toLowerCase())||[],p.fn.load=function(a,c,d){if(typeof a!="string"&&ct)return ct.apply(this,arguments);if(!this.length)return this;var e,f,g,h=this,i=a.indexOf(" ");return i>=0&&(e=a.slice(i,a.length),a=a.slice(0,i)),p.isFunction(c)?(d=c,c=b):typeof c=="object"&&(f="POST"),p.ajax({url:a,type:f,dataType:"html",data:c,complete:function(a,b){d&&h.each(d,g||[a.responseText,b,a])}}).done(function(a){g=arguments,h.html(e?p("<div>").append(a.replace(cq,"")).find(e):a)}),this},p.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){p.fn[b]=function(a){return this.on(b,a)}}),p.each(["get","post"],function(a,c){p[c]=function(a,d,e,f){return p.isFunction(d)&&(f=f||e,e=d,d=b),p.ajax({type:c,url:a,data:d,success:e,dataType:f})}}),p.extend({getScript:function(a,c){return p.get(a,b,c,"script")},getJSON:function(a,b,c){return p.get(a,b,c,"json")},ajaxSetup:function(a,b){return b?cA(a,p.ajaxSettings):(b=a,a=p.ajaxSettings),cA(a,b),a},ajaxSettings:{url:ci,isLocal:cm.test(cj[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":cw},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":p.parseJSON,"text xml":p.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:cy(cu),ajaxTransport:cy(cv),ajax:function(a,c){function y(a,c,f,i){var k,s,t,u,w,y=c;if(v===2)return;v=2,h&&clearTimeout(h),g=b,e=i||"",x.readyState=a>0?4:0,f&&(u=cB(l,x,f));if(a>=200&&a<300||a===304)l.ifModified&&(w=x.getResponseHeader("Last-Modified"),w&&(p.lastModified[d]=w),w=x.getResponseHeader("Etag"),w&&(p.etag[d]=w)),a===304?(y="notmodified",k=!0):(k=cC(l,u),y=k.state,s=k.data,t=k.error,k=!t);else{t=y;if(!y||a)y="error",a<0&&(a=0)}x.status=a,x.statusText=""+(c||y),k?o.resolveWith(m,[s,y,x]):o.rejectWith(m,[x,y,t]),x.statusCode(r),r=b,j&&n.trigger("ajax"+(k?"Success":"Error"),[x,l,k?s:t]),q.fireWith(m,[x,y]),j&&(n.trigger("ajaxComplete",[x,l]),--p.active||p.event.trigger("ajaxStop"))}typeof a=="object"&&(c=a,a=b),c=c||{};var d,e,f,g,h,i,j,k,l=p.ajaxSetup({},c),m=l.context||l,n=m!==l&&(m.nodeType||m instanceof p)?p(m):p.event,o=p.Deferred(),q=p.Callbacks("once memory"),r=l.statusCode||{},t={},u={},v=0,w="canceled",x={readyState:0,setRequestHeader:function(a,b){if(!v){var c=a.toLowerCase();a=u[c]=u[c]||a,t[a]=b}return this},getAllResponseHeaders:function(){return v===2?e:null},getResponseHeader:function(a){var c;if(v===2){if(!f){f={};while(c=cl.exec(e))f[c[1].toLowerCase()]=c[2]}c=f[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){return v||(l.mimeType=a),this},abort:function(a){return a=a||w,g&&g.abort(a),y(0,a),this}};o.promise(x),x.success=x.done,x.error=x.fail,x.complete=q.add,x.statusCode=function(a){if(a){var b;if(v<2)for(b in a)r[b]=[r[b],a[b]];else b=a[x.status],x.always(b)}return this},l.url=((a||l.url)+"").replace(ck,"").replace(co,cj[1]+"//"),l.dataTypes=p.trim(l.dataType||"*").toLowerCase().split(s),l.crossDomain==null&&(i=cs.exec(l.url.toLowerCase()),l.crossDomain=!(!i||i[1]==cj[1]&&i[2]==cj[2]&&(i[3]||(i[1]==="http:"?80:443))==(cj[3]||(cj[1]==="http:"?80:443)))),l.data&&l.processData&&typeof l.data!="string"&&(l.data=p.param(l.data,l.traditional)),cz(cu,l,c,x);if(v===2)return x;j=l.global,l.type=l.type.toUpperCase(),l.hasContent=!cn.test(l.type),j&&p.active++===0&&p.event.trigger("ajaxStart");if(!l.hasContent){l.data&&(l.url+=(cp.test(l.url)?"&":"?")+l.data,delete l.data),d=l.url;if(l.cache===!1){var z=p.now(),A=l.url.replace(cr,"$1_="+z);l.url=A+(A===l.url?(cp.test(l.url)?"&":"?")+"_="+z:"")}}(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&x.setRequestHeader("Content-Type",l.contentType),l.ifModified&&(d=d||l.url,p.lastModified[d]&&x.setRequestHeader("If-Modified-Since",p.lastModified[d]),p.etag[d]&&x.setRequestHeader("If-None-Match",p.etag[d])),x.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+(l.dataTypes[0]!=="*"?", "+cw+"; q=0.01":""):l.accepts["*"]);for(k in l.headers)x.setRequestHeader(k,l.headers[k]);if(!l.beforeSend||l.beforeSend.call(m,x,l)!==!1&&v!==2){w="abort";for(k in{success:1,error:1,complete:1})x[k](l[k]);g=cz(cv,l,c,x);if(!g)y(-1,"No Transport");else{x.readyState=1,j&&n.trigger("ajaxSend",[x,l]),l.async&&l.timeout>0&&(h=setTimeout(function(){x.abort("timeout")},l.timeout));try{v=1,g.send(t,y)}catch(B){if(v<2)y(-1,B);else throw B}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var cD=[],cE=/\?/,cF=/(=)\?(?=&|$)|\?\?/,cG=p.now();p.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=cD.pop()||p.expando+"_"+cG++;return this[a]=!0,a}}),p.ajaxPrefilter("json jsonp",function(c,d,e){var f,g,h,i=c.data,j=c.url,k=c.jsonp!==!1,l=k&&cF.test(j),m=k&&!l&&typeof i=="string"&&!(c.contentType||"").indexOf("application/x-www-form-urlencoded")&&cF.test(i);if(c.dataTypes[0]==="jsonp"||l||m)return f=c.jsonpCallback=p.isFunction(c.jsonpCallback)?c.jsonpCallback():c.jsonpCallback,g=a[f],l?c.url=j.replace(cF,"$1"+f):m?c.data=i.replace(cF,"$1"+f):k&&(c.url+=(cE.test(j)?"&":"?")+c.jsonp+"="+f),c.converters["script json"]=function(){return h||p.error(f+" was not called"),h[0]},c.dataTypes[0]="json",a[f]=function(){h=arguments},e.always(function(){a[f]=g,c[f]&&(c.jsonpCallback=d.jsonpCallback,cD.push(f)),h&&p.isFunction(g)&&g(h[0]),h=g=b}),"script"}),p.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){return p.globalEval(a),a}}}),p.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),p.ajaxTransport("script",function(a){if(a.crossDomain){var c,d=e.head||e.getElementsByTagName("head")[0]||e.documentElement;return{send:function(f,g){c=e.createElement("script"),c.async="async",a.scriptCharset&&(c.charset=a.scriptCharset),c.src=a.url,c.onload=c.onreadystatechange=function(a,e){if(e||!c.readyState||/loaded|complete/.test(c.readyState))c.onload=c.onreadystatechange=null,d&&c.parentNode&&d.removeChild(c),c=b,e||g(200,"success")},d.insertBefore(c,d.firstChild)},abort:function(){c&&c.onload(0,1)}}}});var cH,cI=a.ActiveXObject?function(){for(var a in cH)cH[a](0,1)}:!1,cJ=0;p.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&cK()||cL()}:cK,function(a){p.extend(p.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(p.ajaxSettings.xhr()),p.support.ajax&&p.ajaxTransport(function(c){if(!c.crossDomain||p.support.cors){var d;return{send:function(e,f){var g,h,i=c.xhr();c.username?i.open(c.type,c.url,c.async,c.username,c.password):i.open(c.type,c.url,c.async);if(c.xhrFields)for(h in c.xhrFields)i[h]=c.xhrFields[h];c.mimeType&&i.overrideMimeType&&i.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(h in e)i.setRequestHeader(h,e[h])}catch(j){}i.send(c.hasContent&&c.data||null),d=function(a,e){var h,j,k,l,m;try{if(d&&(e||i.readyState===4)){d=b,g&&(i.onreadystatechange=p.noop,cI&&delete cH[g]);if(e)i.readyState!==4&&i.abort();else{h=i.status,k=i.getAllResponseHeaders(),l={},m=i.responseXML,m&&m.documentElement&&(l.xml=m);try{l.text=i.responseText}catch(a){}try{j=i.statusText}catch(n){j=""}!h&&c.isLocal&&!c.crossDomain?h=l.text?200:404:h===1223&&(h=204)}}}catch(o){e||f(-1,o)}l&&f(h,j,l,k)},c.async?i.readyState===4?setTimeout(d,0):(g=++cJ,cI&&(cH||(cH={},p(a).unload(cI)),cH[g]=d),i.onreadystatechange=d):d()},abort:function(){d&&d(0,1)}}}});var cM,cN,cO=/^(?:toggle|show|hide)$/,cP=new RegExp("^(?:([-+])=|)("+q+")([a-z%]*)$","i"),cQ=/queueHooks$/,cR=[cX],cS={"*":[function(a,b){var c,d,e,f=this.createTween(a,b),g=cP.exec(b),h=f.cur(),i=+h||0,j=1;if(g){c=+g[2],d=g[3]||(p.cssNumber[a]?"":"px");if(d!=="px"&&i){i=p.css(f.elem,a,!0)||c||1;do e=j=j||".5",i=i/j,p.style(f.elem,a,i+d),j=f.cur()/h;while(j!==1&&j!==e)}f.unit=d,f.start=i,f.end=g[1]?i+(g[1]+1)*c:c}return f}]};p.Animation=p.extend(cV,{tweener:function(a,b){p.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");var c,d=0,e=a.length;for(;d<e;d++)c=a[d],cS[c]=cS[c]||[],cS[c].unshift(b)},prefilter:function(a,b){b?cR.unshift(a):cR.push(a)}}),p.Tween=cY,cY.prototype={constructor:cY,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(p.cssNumber[c]?"":"px")},cur:function(){var a=cY.propHooks[this.prop];return a&&a.get?a.get(this):cY.propHooks._default.get(this)},run:function(a){var b,c=cY.propHooks[this.prop];return this.pos=b=p.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration),this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):cY.propHooks._default.set(this),this}},cY.prototype.init.prototype=cY.prototype,cY.propHooks={_default:{get:function(a){var b;return a.elem[a.prop]==null||!!a.elem.style&&a.elem.style[a.prop]!=null?(b=p.css(a.elem,a.prop,!1,""),!b||b==="auto"?0:b):a.elem[a.prop]},set:function(a){p.fx.step[a.prop]?p.fx.step[a.prop](a):a.elem.style&&(a.elem.style[p.cssProps[a.prop]]!=null||p.cssHooks[a.prop])?p.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},cY.propHooks.scrollTop=cY.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},p.each(["toggle","show","hide"],function(a,b){var c=p.fn[b];p.fn[b]=function(d,e,f){return d==null||typeof d=="boolean"||!a&&p.isFunction(d)&&p.isFunction(e)?c.apply(this,arguments):this.animate(cZ(b,!0),d,e,f)}}),p.fn.extend({fadeTo:function(a,b,c,d){return this.filter(bY).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=p.isEmptyObject(a),f=p.speed(b,c,d),g=function(){var b=cV(this,p.extend({},a),f);e&&b.stop(!0)};return e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,c,d){var e=function(a){var b=a.stop;delete a.stop,b(d)};return typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,c=a!=null&&a+"queueHooks",f=p.timers,g=p._data(this);if(c)g[c]&&g[c].stop&&e(g[c]);else for(c in g)g[c]&&g[c].stop&&cQ.test(c)&&e(g[c]);for(c=f.length;c--;)f[c].elem===this&&(a==null||f[c].queue===a)&&(f[c].anim.stop(d),b=!1,f.splice(c,1));(b||!d)&&p.dequeue(this,a)})}}),p.each({slideDown:cZ("show"),slideUp:cZ("hide"),slideToggle:cZ("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){p.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),p.speed=function(a,b,c){var d=a&&typeof a=="object"?p.extend({},a):{complete:c||!c&&b||p.isFunction(a)&&a,duration:a,easing:c&&b||b&&!p.isFunction(b)&&b};d.duration=p.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in p.fx.speeds?p.fx.speeds[d.duration]:p.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";return d.old=d.complete,d.complete=function(){p.isFunction(d.old)&&d.old.call(this),d.queue&&p.dequeue(this,d.queue)},d},p.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},p.timers=[],p.fx=cY.prototype.init,p.fx.tick=function(){var a,b=p.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||p.fx.stop()},p.fx.timer=function(a){a()&&p.timers.push(a)&&!cN&&(cN=setInterval(p.fx.tick,p.fx.interval))},p.fx.interval=13,p.fx.stop=function(){clearInterval(cN),cN=null},p.fx.speeds={slow:600,fast:200,_default:400},p.fx.step={},p.expr&&p.expr.filters&&(p.expr.filters.animated=function(a){return p.grep(p.timers,function(b){return a===b.elem}).length});var c$=/^(?:body|html)$/i;p.fn.offset=function(a){if(arguments.length)return a===b?this:this.each(function(b){p.offset.setOffset(this,a,b)});var c,d,e,f,g,h,i,j,k,l,m=this[0],n=m&&m.ownerDocument;if(!n)return;return(e=n.body)===m?p.offset.bodyOffset(m):(d=n.documentElement,p.contains(d,m)?(c=m.getBoundingClientRect(),f=c_(n),g=d.clientTop||e.clientTop||0,h=d.clientLeft||e.clientLeft||0,i=f.pageYOffset||d.scrollTop,j=f.pageXOffset||d.scrollLeft,k=c.top+i-g,l=c.left+j-h,{top:k,left:l}):{top:0,left:0})},p.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;return p.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(p.css(a,"marginTop"))||0,c+=parseFloat(p.css(a,"marginLeft"))||0),{top:b,left:c}},setOffset:function(a,b,c){var d=p.css(a,"position");d==="static"&&(a.style.position="relative");var e=p(a),f=e.offset(),g=p.css(a,"top"),h=p.css(a,"left"),i=(d==="absolute"||d==="fixed")&&p.inArray("auto",[g,h])>-1,j={},k={},l,m;i?(k=e.position(),l=k.top,m=k.left):(l=parseFloat(g)||0,m=parseFloat(h)||0),p.isFunction(b)&&(b=b.call(a,c,f)),b.top!=null&&(j.top=b.top-f.top+l),b.left!=null&&(j.left=b.left-f.left+m),"using"in b?b.using.call(a,j):e.css(j)}},p.fn.extend({position:function(){if(!this[0])return;var a=this[0],b=this.offsetParent(),c=this.offset(),d=c$.test(b[0].nodeName)?{top:0,left:0}:b.offset();return c.top-=parseFloat(p.css(a,"marginTop"))||0,c.left-=parseFloat(p.css(a,"marginLeft"))||0,d.top+=parseFloat(p.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(p.css(b[0],"borderLeftWidth"))||0,{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||e.body;while(a&&!c$.test(a.nodeName)&&p.css(a,"position")==="static")a=a.offsetParent;return a||e.body})}}),p.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);p.fn[a]=function(e){return p.access(this,function(a,e,f){var g=c_(a);if(f===b)return g?c in g?g[c]:g.document.documentElement[e]:a[e];g?g.scrollTo(d?p(g).scrollLeft():f,d?f:p(g).scrollTop()):a[e]=f},a,e,arguments.length,null)}}),p.each({Height:"height",Width:"width"},function(a,c){p.each({padding:"inner"+a,content:c,"":"outer"+a},function(d,e){p.fn[e]=function(e,f){var g=arguments.length&&(d||typeof e!="boolean"),h=d||(e===!0||f===!0?"margin":"border");return p.access(this,function(c,d,e){var f;return p.isWindow(c)?c.document.documentElement["client"+a]:c.nodeType===9?(f=c.documentElement,Math.max(c.body["scroll"+a],f["scroll"+a],c.body["offset"+a],f["offset"+a],f["client"+a])):e===b?p.css(c,d,e,h):p.style(c,d,e,h)},c,g?e:b,g)}})}),a.jQuery=a.$=p,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return p})})(window);
@@ -0,0 +1,1819 @@
1
+ /*
2
+ * Inline Form Validation Engine 2.6, jQuery plugin
3
+ *
4
+ * Copyright(c) 2010, Cedric Dugas
5
+ * http://www.position-absolute.com
6
+ *
7
+ * 2.0 Rewrite by Olivier Refalo
8
+ * http://www.crionics.com
9
+ *
10
+ * Form validation engine allowing custom regex rules to be added.
11
+ * Licensed under the MIT License
12
+ */
13
+ (function($) {
14
+
15
+ "use strict";
16
+
17
+ var methods = {
18
+
19
+ /**
20
+ * Kind of the constructor, called before any action
21
+ * @param {Map} user options
22
+ */
23
+ init: function(options) {
24
+ var form = this;
25
+ if (!form.data('jqv') || form.data('jqv') == null ) {
26
+ options = methods._saveOptions(form, options);
27
+ // bind all formError elements to close on click
28
+ $(".formError").live("click", function() {
29
+ $(this).fadeOut(150, function() {
30
+ // remove prompt once invisible
31
+ $(this).parent('.formErrorOuter').remove();
32
+ $(this).remove();
33
+ });
34
+ });
35
+ }
36
+ return this;
37
+ },
38
+ /**
39
+ * Attachs jQuery.validationEngine to form.submit and field.blur events
40
+ * Takes an optional params: a list of options
41
+ * ie. jQuery("#formID1").validationEngine('attach', {promptPosition : "centerRight"});
42
+ */
43
+ attach: function(userOptions) {
44
+
45
+ if(!$(this).is("form")) {
46
+ alert("Sorry, jqv.attach() only applies to a form");
47
+ return this;
48
+ }
49
+
50
+ var form = this;
51
+ var options;
52
+
53
+ if(userOptions)
54
+ options = methods._saveOptions(form, userOptions);
55
+ else
56
+ options = form.data('jqv');
57
+
58
+ options.validateAttribute = (form.find("[data-validation-engine*=validate]").length) ? "data-validation-engine" : "class";
59
+ if (options.binded) {
60
+
61
+ // bind fields
62
+ form.find("["+options.validateAttribute+"*=validate]").not("[type=checkbox]").not("[type=radio]").not(".datepicker").bind(options.validationEventTrigger, methods._onFieldEvent);
63
+ form.find("["+options.validateAttribute+"*=validate][type=checkbox],["+options.validateAttribute+"*=validate][type=radio]").bind("click", methods._onFieldEvent);
64
+ form.find("["+options.validateAttribute+"*=validate][class*=datepicker]").bind(options.validationEventTrigger,{"delay": 300}, methods._onFieldEvent);
65
+ }
66
+ if (options.autoPositionUpdate) {
67
+ $(window).bind("resize", {
68
+ "noAnimation": true,
69
+ "formElem": form
70
+ }, methods.updatePromptsPosition);
71
+ }
72
+ // bind form.submit
73
+ form.bind("submit", methods._onSubmitEvent);
74
+ return this;
75
+ },
76
+ /**
77
+ * Unregisters any bindings that may point to jQuery.validaitonEngine
78
+ */
79
+ detach: function() {
80
+
81
+ if(!$(this).is("form")) {
82
+ alert("Sorry, jqv.detach() only applies to a form");
83
+ return this;
84
+ }
85
+
86
+ var form = this;
87
+ var options = form.data('jqv');
88
+
89
+ // unbind fields
90
+ form.find("["+options.validateAttribute+"*=validate]").not("[type=checkbox]").unbind(options.validationEventTrigger, methods._onFieldEvent);
91
+ form.find("["+options.validateAttribute+"*=validate][type=checkbox],[class*=validate][type=radio]").unbind("click", methods._onFieldEvent);
92
+
93
+ // unbind form.submit
94
+ form.unbind("submit", methods.onAjaxFormComplete);
95
+
96
+ // unbind live fields (kill)
97
+ form.find("["+options.validateAttribute+"*=validate]").not("[type=checkbox]").die(options.validationEventTrigger, methods._onFieldEvent);
98
+ form.find("["+options.validateAttribute+"*=validate][type=checkbox]").die("click", methods._onFieldEvent);
99
+
100
+ // unbind form.submit
101
+ form.die("submit", methods.onAjaxFormComplete);
102
+ form.removeData('jqv');
103
+
104
+ if (options.autoPositionUpdate)
105
+ $(window).unbind("resize", methods.updatePromptsPosition);
106
+
107
+ return this;
108
+ },
109
+ /**
110
+ * Validates either a form or a list of fields, shows prompts accordingly.
111
+ * Note: There is no ajax form validation with this method, only field ajax validation are evaluated
112
+ *
113
+ * @return true if the form validates, false if it fails
114
+ */
115
+ validate: function() {
116
+ if($(this).is("form"))
117
+ return methods._validateFields(this);
118
+ else {
119
+ // field validation
120
+ var form = $(this).closest('form');
121
+ var options = form.data('jqv');
122
+ var r = methods._validateField($(this), options);
123
+
124
+ if (options.onSuccess && options.InvalidFields.length == 0)
125
+ options.onSuccess();
126
+ else if (options.onFailure && options.InvalidFields.length > 0)
127
+ options.onFailure();
128
+
129
+ return r;
130
+ }
131
+ },
132
+ /**
133
+ * Redraw prompts position, useful when you change the DOM state when validating
134
+ */
135
+ updatePromptsPosition: function(event) {
136
+
137
+ if (event && this == window) {
138
+ var form = event.data.formElem;
139
+ var noAnimation = event.data.noAnimation;
140
+ }
141
+ else
142
+ var form = $(this.closest('form'));
143
+
144
+ var options = form.data('jqv');
145
+ // No option, take default one
146
+ form.find('['+options.validateAttribute+'*=validate]').not(":disabled").each(function(){
147
+ var field = $(this);
148
+ var prompt = methods._getPrompt(field);
149
+ var promptText = $(prompt).find(".formErrorContent").html();
150
+
151
+ if(prompt)
152
+ methods._updatePrompt(field, $(prompt), promptText, undefined, false, options, noAnimation);
153
+ });
154
+ return this;
155
+ },
156
+ /**
157
+ * Displays a prompt on a element.
158
+ * Note that the element needs an id!
159
+ *
160
+ * @param {String} promptText html text to display type
161
+ * @param {String} type the type of bubble: 'pass' (green), 'load' (black) anything else (red)
162
+ * @param {String} possible values topLeft, topRight, bottomLeft, centerRight, bottomRight
163
+ */
164
+ showPrompt: function(promptText, type, promptPosition, showArrow) {
165
+
166
+ var form = this.closest('form');
167
+ var options = form.data('jqv');
168
+ // No option, take default one
169
+ if(!options)
170
+ options = methods._saveOptions(this, options);
171
+ if(promptPosition)
172
+ options.promptPosition=promptPosition;
173
+ options.showArrow = showArrow==true;
174
+
175
+ methods._showPrompt(this, promptText, type, false, options);
176
+ return this;
177
+ },
178
+ /**
179
+ * Closes form error prompts, CAN be invidual
180
+ */
181
+ hide: function() {
182
+ var form = $(this).closest('form');
183
+ if(form.length == 0)
184
+ return this;
185
+ var options = form.data('jqv');
186
+ var closingtag;
187
+ if($(this).is("form")) {
188
+ closingtag = "parentForm"+methods._getClassName($(this).attr("id"));
189
+ } else {
190
+ closingtag = methods._getClassName($(this).attr("id")) +"formError";
191
+ }
192
+ $('.'+closingtag).fadeTo(options.fadeDuration, 0.3, function() {
193
+ $(this).parent('.formErrorOuter').remove();
194
+ $(this).remove();
195
+ });
196
+ return this;
197
+ },
198
+ /**
199
+ * Closes all error prompts on the page
200
+ */
201
+ hideAll: function() {
202
+
203
+ var form = this;
204
+ var options = form.data('jqv');
205
+ var duration = options ? options.fadeDuration:0.3;
206
+ $('.formError').fadeTo(duration, 0.3, function() {
207
+ $(this).parent('.formErrorOuter').remove();
208
+ $(this).remove();
209
+ });
210
+ return this;
211
+ },
212
+ /**
213
+ * Typically called when user exists a field using tab or a mouse click, triggers a field
214
+ * validation
215
+ */
216
+ _onFieldEvent: function(event) {
217
+ var field = $(this);
218
+ var form = field.closest('form');
219
+ var options = form.data('jqv');
220
+ options.eventTrigger = "field";
221
+ // validate the current field
222
+ window.setTimeout(function() {
223
+ methods._validateField(field, options);
224
+ if (options.InvalidFields.length == 0 && options.onSuccess) {
225
+ options.onSuccess();
226
+ } else if (options.InvalidFields.length > 0 && options.onFailure) {
227
+ options.onFailure();
228
+ }
229
+ }, (event.data) ? event.data.delay : 0);
230
+
231
+ },
232
+ /**
233
+ * Called when the form is submited, shows prompts accordingly
234
+ *
235
+ * @param {jqObject}
236
+ * form
237
+ * @return false if form submission needs to be cancelled
238
+ */
239
+ _onSubmitEvent: function() {
240
+ var form = $(this);
241
+ var options = form.data('jqv');
242
+ options.eventTrigger = "submit";
243
+
244
+ // validate each field
245
+ // (- skip field ajax validation, not necessary IF we will perform an ajax form validation)
246
+ var r=methods._validateFields(form);
247
+
248
+ if (r && options.ajaxFormValidation) {
249
+ methods._validateFormWithAjax(form, options);
250
+ // cancel form auto-submission - process with async call onAjaxFormComplete
251
+ return false;
252
+ }
253
+
254
+ if(options.onValidationComplete) {
255
+ // !! ensures that an undefined return is interpreted as return false but allows a onValidationComplete() to possibly return true and have form continue processing
256
+ return !!options.onValidationComplete(form, r);
257
+ }
258
+ return r;
259
+ },
260
+ /**
261
+ * Return true if the ajax field validations passed so far
262
+ * @param {Object} options
263
+ * @return true, is all ajax validation passed so far (remember ajax is async)
264
+ */
265
+ _checkAjaxStatus: function(options) {
266
+ var status = true;
267
+ $.each(options.ajaxValidCache, function(key, value) {
268
+ if (!value) {
269
+ status = false;
270
+ // break the each
271
+ return false;
272
+ }
273
+ });
274
+ return status;
275
+ },
276
+
277
+ /**
278
+ * Return true if the ajax field is validated
279
+ * @param {String} fieldid
280
+ * @param {Object} options
281
+ * @return true, if validation passed, false if false or doesn't exist
282
+ */
283
+ _checkAjaxFieldStatus: function(fieldid, options) {
284
+ return options.ajaxValidCache[fieldid] == true;
285
+ },
286
+ /**
287
+ * Validates form fields, shows prompts accordingly
288
+ *
289
+ * @param {jqObject}
290
+ * form
291
+ * @param {skipAjaxFieldValidation}
292
+ * boolean - when set to true, ajax field validation is skipped, typically used when the submit button is clicked
293
+ *
294
+ * @return true if form is valid, false if not, undefined if ajax form validation is done
295
+ */
296
+ _validateFields: function(form) {
297
+ var options = form.data('jqv');
298
+
299
+ // this variable is set to true if an error is found
300
+ var errorFound = false;
301
+
302
+ // Trigger hook, start validation
303
+ form.trigger("jqv.form.validating");
304
+ // first, evaluate status of non ajax fields
305
+ var first_err=null;
306
+ form.find('['+options.validateAttribute+'*=validate]').not(":disabled").each( function() {
307
+ var field = $(this);
308
+ var names = [];
309
+ if ($.inArray(field.attr('name'), names) < 0) {
310
+ errorFound |= methods._validateField(field, options);
311
+ if (errorFound && first_err==null)
312
+ if (field.is(":hidden") && options.prettySelect)
313
+ first_err = field = form.find("#" + options.usePrefix + field.attr('id') + options.useSuffix);
314
+ else
315
+ first_err=field;
316
+ if (options.doNotShowAllErrosOnSubmit)
317
+ return false;
318
+ names.push(field.attr('name'));
319
+ }
320
+ });
321
+
322
+ // second, check to see if all ajax calls completed ok
323
+ // errorFound |= !methods._checkAjaxStatus(options);
324
+
325
+ // third, check status and scroll the container accordingly
326
+ form.trigger("jqv.form.result", [errorFound]);
327
+
328
+ if (errorFound) {
329
+ if (options.scroll) {
330
+ var destination=first_err.offset().top;
331
+ var fixleft = first_err.offset().left;
332
+
333
+ //prompt positioning adjustment support. Usage: positionType:Xshift,Yshift (for ex.: bottomLeft:+20 or bottomLeft:-20,+10)
334
+ var positionType=options.promptPosition;
335
+ if (typeof(positionType)=='string' && positionType.indexOf(":")!=-1)
336
+ positionType=positionType.substring(0,positionType.indexOf(":"));
337
+
338
+ if (positionType!="bottomRight" && positionType!="bottomLeft") {
339
+ var prompt_err= methods._getPrompt(first_err);
340
+ destination=prompt_err.offset().top;
341
+ }
342
+
343
+ // get the position of the first error, there should be at least one, no need to check this
344
+ //var destination = form.find(".formError:not('.greenPopup'):first").offset().top;
345
+ if (options.isOverflown) {
346
+ var overflowDIV = $(options.overflownDIV);
347
+ if(!overflowDIV.length) return false;
348
+ var scrollContainerScroll = overflowDIV.scrollTop();
349
+ var scrollContainerPos = -parseInt(overflowDIV.offset().top);
350
+
351
+ destination += scrollContainerScroll + scrollContainerPos - 5;
352
+ var scrollContainer = $(options.overflownDIV + ":not(:animated)");
353
+
354
+ scrollContainer.animate({ scrollTop: destination }, 1100, function(){
355
+ if(options.focusFirstField) first_err.focus();
356
+ });
357
+ } else {
358
+ $("html:not(:animated),body:not(:animated)").animate({
359
+ scrollTop: destination,
360
+ scrollLeft: fixleft
361
+ }, 1100, function(){
362
+ if(options.focusFirstField) first_err.focus();
363
+ });
364
+ }
365
+
366
+ } else if(options.focusFirstField)
367
+ first_err.focus();
368
+ return false;
369
+ }
370
+ return true;
371
+ },
372
+ /**
373
+ * This method is called to perform an ajax form validation.
374
+ * During this process all the (field, value) pairs are sent to the server which returns a list of invalid fields or true
375
+ *
376
+ * @param {jqObject} form
377
+ * @param {Map} options
378
+ */
379
+ _validateFormWithAjax: function(form, options) {
380
+
381
+ var data = form.serialize();
382
+ var type = (options.ajaxmethod) ? options.ajaxmethod : "GET";
383
+ var url = (options.ajaxFormValidationURL) ? options.ajaxFormValidationURL : form.attr("action");
384
+ var dataType = (options.dataType) ? options.dataType : "json";
385
+ $.ajax({
386
+ type: type,
387
+ url: url,
388
+ cache: false,
389
+ dataType: dataType,
390
+ data: data,
391
+ form: form,
392
+ methods: methods,
393
+ options: options,
394
+ beforeSend: function() {
395
+ return options.onBeforeAjaxFormValidation(form, options);
396
+ },
397
+ error: function(data, transport) {
398
+ methods._ajaxError(data, transport);
399
+ },
400
+ success: function(json) {
401
+ if (json !== true) {
402
+ // getting to this case doesn't necessary means that the form is invalid
403
+ // the server may return green or closing prompt actions
404
+ // this flag helps figuring it out
405
+ var errorInForm=false;
406
+ for (var i = 0; i < json.length; i++) {
407
+ var value = json[i];
408
+
409
+ var errorFieldId = value[0];
410
+ var errorField = $($("#" + errorFieldId)[0]);
411
+
412
+ // make sure we found the element
413
+ if (errorField.length == 1) {
414
+
415
+ // promptText or selector
416
+ var msg = value[2];
417
+ // if the field is valid
418
+ if (value[1] == true) {
419
+
420
+ if (msg == "" || !msg){
421
+ // if for some reason, status==true and error="", just close the prompt
422
+ methods._closePrompt(errorField);
423
+ } else {
424
+ // the field is valid, but we are displaying a green prompt
425
+ if (options.allrules[msg]) {
426
+ var txt = options.allrules[msg].alertTextOk;
427
+ if (txt)
428
+ msg = txt;
429
+ }
430
+ methods._showPrompt(errorField, msg, "pass", false, options, true);
431
+ }
432
+ } else {
433
+ // the field is invalid, show the red error prompt
434
+ errorInForm|=true;
435
+ if (options.allrules[msg]) {
436
+ var txt = options.allrules[msg].alertText;
437
+ if (txt)
438
+ msg = txt;
439
+ }
440
+ methods._showPrompt(errorField, msg, "", false, options, true);
441
+ }
442
+ }
443
+ }
444
+ options.onAjaxFormComplete(!errorInForm, form, json, options);
445
+ } else
446
+ options.onAjaxFormComplete(true, form, "", options);
447
+ }
448
+ });
449
+
450
+ },
451
+ /**
452
+ * Validates field, shows prompts accordingly
453
+ *
454
+ * @param {jqObject}
455
+ * field
456
+ * @param {Array[String]}
457
+ * field's validation rules
458
+ * @param {Map}
459
+ * user options
460
+ * @return false if field is valid (It is inversed for *fields*, it return false on validate and true on errors.)
461
+ */
462
+ _validateField: function(field, options, skipAjaxValidation) {
463
+ if (!field.attr("id")) {
464
+ field.attr("id", "form-validation-field-" + $.validationEngine.fieldIdCounter);
465
+ ++$.validationEngine.fieldIdCounter;
466
+ }
467
+
468
+ if (field.is(":hidden") && !options.prettySelect || field.parent().is(":hidden"))
469
+ return false;
470
+
471
+ var rulesParsing = field.attr(options.validateAttribute);
472
+ var getRules = /validate\[(.*)\]/.exec(rulesParsing);
473
+
474
+ if (!getRules)
475
+ return false;
476
+ var str = getRules[1];
477
+ var rules = str.split(/\[|,|\]/);
478
+
479
+ // true if we ran the ajax validation, tells the logic to stop messing with prompts
480
+ var isAjaxValidator = false;
481
+ var fieldName = field.attr("name");
482
+ var promptText = "";
483
+ var promptType = "";
484
+ var required = false;
485
+ options.isError = false;
486
+ options.showArrow = true;
487
+
488
+ var form = $(field.closest("form"));
489
+
490
+ for (var i = 0; i < rules.length; i++) {
491
+ // Fix for adding spaces in the rules
492
+ rules[i] = rules[i].replace(" ", "");
493
+ var errorMsg = undefined;
494
+ switch (rules[i]) {
495
+
496
+ case "required":
497
+ required = true;
498
+ errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._required);
499
+ break;
500
+ case "custom":
501
+ errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._custom);
502
+ break;
503
+ case "groupRequired":
504
+ // Check is its the first of group, if not, reload validation with first field
505
+ // AND continue normal validation on present field
506
+ var classGroup = "["+options.validateAttribute+"*=" +rules[i + 1] +"]";
507
+ var firstOfGroup = form.find(classGroup).eq(0);
508
+ if(firstOfGroup[0] != field[0]){
509
+ methods._validateField(firstOfGroup, options, skipAjaxValidation);
510
+ options.showArrow = true;
511
+ continue;
512
+ }
513
+ errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._groupRequired);
514
+ if(errorMsg) required = true;
515
+ options.showArrow = false;
516
+ break;
517
+ case "ajax":
518
+ // AJAX defaults to returning it's loading message
519
+ errorMsg = methods._ajax(field, rules, i, options);
520
+ if (errorMsg) {
521
+ promptType = "load";
522
+ }
523
+ break;
524
+ case "minSize":
525
+ errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._minSize);
526
+ break;
527
+ case "maxSize":
528
+ errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._maxSize);
529
+ break;
530
+ case "min":
531
+ errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._min);
532
+ break;
533
+ case "max":
534
+ errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._max);
535
+ break;
536
+ case "past":
537
+ errorMsg = methods._getErrorMessage(form, field,rules[i], rules, i, options, methods._past);
538
+ break;
539
+ case "future":
540
+ errorMsg = methods._getErrorMessage(form, field,rules[i], rules, i, options, methods._future);
541
+ break;
542
+ case "dateRange":
543
+ var classGroup = "["+options.validateAttribute+"*=" + rules[i + 1] + "]";
544
+ options.firstOfGroup = form.find(classGroup).eq(0);
545
+ options.secondOfGroup = form.find(classGroup).eq(1);
546
+
547
+ //if one entry out of the pair has value then proceed to run through validation
548
+ if (options.firstOfGroup[0].value || options.secondOfGroup[0].value) {
549
+ errorMsg = methods._getErrorMessage(form, field,rules[i], rules, i, options, methods._dateRange);
550
+ }
551
+ if (errorMsg) required = true;
552
+ options.showArrow = false;
553
+ break;
554
+
555
+ case "dateTimeRange":
556
+ var classGroup = "["+options.validateAttribute+"*=" + rules[i + 1] + "]";
557
+ options.firstOfGroup = form.find(classGroup).eq(0);
558
+ options.secondOfGroup = form.find(classGroup).eq(1);
559
+
560
+ //if one entry out of the pair has value then proceed to run through validation
561
+ if (options.firstOfGroup[0].value || options.secondOfGroup[0].value) {
562
+ errorMsg = methods._getErrorMessage(form, field,rules[i], rules, i, options, methods._dateTimeRange);
563
+ }
564
+ if (errorMsg) required = true;
565
+ options.showArrow = false;
566
+ break;
567
+ case "maxCheckbox":
568
+ field = $(form.find("input[name='" + fieldName + "']"));
569
+ errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._maxCheckbox);
570
+ break;
571
+ case "minCheckbox":
572
+ field = $(form.find("input[name='" + fieldName + "']"));
573
+ errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._minCheckbox);
574
+ break;
575
+ case "equals":
576
+ errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._equals);
577
+ break;
578
+ case "funcCall":
579
+ errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._funcCall);
580
+ break;
581
+ case "creditCard":
582
+ errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._creditCard);
583
+ break;
584
+ case "condRequired":
585
+ errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._condRequired);
586
+ if (errorMsg !== undefined) {
587
+ required = true;
588
+ }
589
+ break;
590
+
591
+ default:
592
+ }
593
+ if (errorMsg !== undefined) {
594
+ promptText += errorMsg + "<br/>";
595
+ options.isError = true;
596
+ }
597
+
598
+ //if option set, stop checking validation rules after one error is found
599
+ if(options.showOneMessage === true && options.isError === true)
600
+ break;
601
+ }
602
+ // If the rules required is not added, an empty field is not validated
603
+ if(!required && field.val().length < 1) options.isError = false;
604
+
605
+ // Hack for radio/checkbox group button, the validation go into the
606
+ // first radio/checkbox of the group
607
+ var fieldType = field.prop("type");
608
+
609
+ if ((fieldType == "radio" || fieldType == "checkbox") && form.find("input[name='" + fieldName + "']").size() > 1) {
610
+ field = $(form.find("input[name='" + fieldName + "'][type!=hidden]:first"));
611
+ options.showArrow = false;
612
+ }
613
+
614
+ if(field.is(":hidden") && options.prettySelect) {
615
+ field = form.find("#" + options.usePrefix + field.attr('id') + options.useSuffix);
616
+ }
617
+
618
+ if (options.isError){
619
+ methods._showPrompt(field, promptText, promptType, false, options);
620
+ }else{
621
+ if (!isAjaxValidator) methods._closePrompt(field);
622
+ }
623
+
624
+ if (!isAjaxValidator) {
625
+ field.trigger("jqv.field.result", [field, options.isError, promptText]);
626
+ }
627
+
628
+ /* Record error */
629
+ var errindex = $.inArray(field[0], options.InvalidFields);
630
+ if (errindex == -1) {
631
+ if (options.isError)
632
+ options.InvalidFields.push(field[0]);
633
+ } else if (!options.isError) {
634
+ options.InvalidFields.splice(errindex, 1);
635
+ }
636
+
637
+ return options.isError;
638
+ },
639
+ /********************
640
+ * _getErrorMessage
641
+ *
642
+ * @param form
643
+ * @param field
644
+ * @param rule
645
+ * @param rules
646
+ * @param i
647
+ * @param options
648
+ * @param originalValidationMethod
649
+ * @return {*}
650
+ * @private
651
+ */
652
+ _getErrorMessage:function (form, field, rule, rules, i, options, originalValidationMethod) {
653
+ // If we are using the custon validation type, build the index for the rule.
654
+ // Otherwise if we are doing a function call, make the call and return the object
655
+ // that is passed back.
656
+ var beforeChangeRule = rule;
657
+ if (rule == "custom") {
658
+ var custom_validation_type_index = jQuery.inArray(rule, rules)+ 1;
659
+ var custom_validation_type = rules[custom_validation_type_index];
660
+ rule = "custom[" + custom_validation_type + "]";
661
+ }
662
+ var element_classes = (field.attr("data-validation-engine")) ? field.attr("data-validation-engine") : field.attr("class");
663
+ var element_classes_array = element_classes.split(" ");
664
+
665
+ // Call the original validation method. If we are dealing with dates, also pass the form
666
+ var errorMsg;
667
+ if (rule == "future" || rule == "past" || rule == "maxCheckbox" || rule == "minCheckbox") {
668
+ errorMsg = originalValidationMethod(form, field, rules, i, options);
669
+ } else {
670
+ errorMsg = originalValidationMethod(field, rules, i, options);
671
+ }
672
+
673
+ // If the original validation method returned an error and we have a custom error message,
674
+ // return the custom message instead. Otherwise return the original error message.
675
+ if (errorMsg != undefined) {
676
+ var custom_message = methods._getCustomErrorMessage($(field), element_classes_array, beforeChangeRule, options);
677
+ if (custom_message) return custom_message;
678
+ }
679
+ return errorMsg;
680
+
681
+ },
682
+ _getCustomErrorMessage:function (field, classes, rule, options) {
683
+ var custom_message = false;
684
+ var validityProp = methods._validityProp[rule];
685
+ if (validityProp != undefined) {
686
+ custom_message = field.attr("data-errormessage-"+validityProp);
687
+ if (custom_message != undefined)
688
+ return custom_message;
689
+ }
690
+ custom_message = field.attr("data-errormessage");
691
+ if (custom_message != undefined)
692
+ return custom_message;
693
+ var id = '#' + field.attr("id");
694
+ // If we have custom messages for the element's id, get the message for the rule from the id.
695
+ // Otherwise, if we have custom messages for the element's classes, use the first class message we find instead.
696
+ if (typeof options.custom_error_messages[id] != "undefined" &&
697
+ typeof options.custom_error_messages[id][rule] != "undefined" ) {
698
+ custom_message = options.custom_error_messages[id][rule]['message'];
699
+ } else if (classes.length > 0) {
700
+ for (var i = 0; i < classes.length && classes.length > 0; i++) {
701
+ var element_class = "." + classes[i];
702
+ if (typeof options.custom_error_messages[element_class] != "undefined" &&
703
+ typeof options.custom_error_messages[element_class][rule] != "undefined") {
704
+ custom_message = options.custom_error_messages[element_class][rule]['message'];
705
+ break;
706
+ }
707
+ }
708
+ }
709
+ if (!custom_message &&
710
+ typeof options.custom_error_messages[rule] != "undefined" &&
711
+ typeof options.custom_error_messages[rule]['message'] != "undefined"){
712
+ custom_message = options.custom_error_messages[rule]['message'];
713
+ }
714
+ return custom_message;
715
+ },
716
+ _validityProp: {
717
+ "required": "value-missing",
718
+ "custom": "custom-error",
719
+ "groupRequired": "value-missing",
720
+ "ajax": "custom-error",
721
+ "minSize": "range-underflow",
722
+ "maxSize": "range-overflow",
723
+ "min": "range-underflow",
724
+ "max": "range-overflow",
725
+ "past": "type-mismatch",
726
+ "future": "type-mismatch",
727
+ "dateRange": "type-mismatch",
728
+ "dateTimeRange": "type-mismatch",
729
+ "maxCheckbox": "range-overflow",
730
+ "minCheckbox": "range-underflow",
731
+ "equals": "pattern-mismatch",
732
+ "funcCall": "custom-error",
733
+ "creditCard": "pattern-mismatch",
734
+ "condRequired": "value-missing"
735
+ },
736
+ /**
737
+ * Required validation
738
+ *
739
+ * @param {jqObject} field
740
+ * @param {Array[String]} rules
741
+ * @param {int} i rules index
742
+ * @param {Map}
743
+ * user options
744
+ * @return an error string if validation failed
745
+ */
746
+ _required: function(field, rules, i, options) {
747
+ switch (field.prop("type")) {
748
+ case "text":
749
+ case "password":
750
+ case "textarea":
751
+ case "file":
752
+ case "select-one":
753
+ case "select-multiple":
754
+ default:
755
+
756
+ if (! $.trim(field.val()) || field.val() == field.attr("data-validation-placeholder") || field.val() == field.attr("placeholder"))
757
+ return options.allrules[rules[i]].alertText;
758
+ break;
759
+ case "radio":
760
+ case "checkbox":
761
+ var form = field.closest("form");
762
+ var name = field.attr("name");
763
+ if (form.find("input[name='" + name + "']:checked").size() == 0) {
764
+ if (form.find("input[name='" + name + "']:visible").size() == 1)
765
+ return options.allrules[rules[i]].alertTextCheckboxe;
766
+ else
767
+ return options.allrules[rules[i]].alertTextCheckboxMultiple;
768
+ }
769
+ break;
770
+ }
771
+ },
772
+ /**
773
+ * Validate that 1 from the group field is required
774
+ *
775
+ * @param {jqObject} field
776
+ * @param {Array[String]} rules
777
+ * @param {int} i rules index
778
+ * @param {Map}
779
+ * user options
780
+ * @return an error string if validation failed
781
+ */
782
+ _groupRequired: function(field, rules, i, options) {
783
+ var classGroup = "["+options.validateAttribute+"*=" +rules[i + 1] +"]";
784
+ var isValid = false;
785
+ // Check all fields from the group
786
+ field.closest("form").find(classGroup).each(function(){
787
+ if(!methods._required($(this), rules, i, options)){
788
+ isValid = true;
789
+ return false;
790
+ }
791
+ });
792
+
793
+ if(!isValid) {
794
+ return options.allrules[rules[i]].alertText;
795
+ }
796
+ },
797
+ /**
798
+ * Validate rules
799
+ *
800
+ * @param {jqObject} field
801
+ * @param {Array[String]} rules
802
+ * @param {int} i rules index
803
+ * @param {Map}
804
+ * user options
805
+ * @return an error string if validation failed
806
+ */
807
+ _custom: function(field, rules, i, options) {
808
+ var customRule = rules[i + 1];
809
+ var rule = options.allrules[customRule];
810
+ var fn;
811
+ if(!rule) {
812
+ alert("jqv:custom rule not found - "+customRule);
813
+ return;
814
+ }
815
+
816
+ if(rule["regex"]) {
817
+ var ex=rule.regex;
818
+ if(!ex) {
819
+ alert("jqv:custom regex not found - "+customRule);
820
+ return;
821
+ }
822
+ var pattern = new RegExp(ex);
823
+
824
+ if (!pattern.test(field.val())) return options.allrules[customRule].alertText;
825
+
826
+ } else if(rule["func"]) {
827
+ fn = rule["func"];
828
+
829
+ if (typeof(fn) !== "function") {
830
+ alert("jqv:custom parameter 'function' is no function - "+customRule);
831
+ return;
832
+ }
833
+
834
+ if (!fn(field, rules, i, options))
835
+ return options.allrules[customRule].alertText;
836
+ } else {
837
+ alert("jqv:custom type not allowed "+customRule);
838
+ return;
839
+ }
840
+ },
841
+ /**
842
+ * Validate custom function outside of the engine scope
843
+ *
844
+ * @param {jqObject} field
845
+ * @param {Array[String]} rules
846
+ * @param {int} i rules index
847
+ * @param {Map}
848
+ * user options
849
+ * @return an error string if validation failed
850
+ */
851
+ _funcCall: function(field, rules, i, options) {
852
+ var functionName = rules[i + 1];
853
+ var fn;
854
+ if(functionName.indexOf('.') >-1)
855
+ {
856
+ var namespaces = functionName.split('.');
857
+ var scope = window;
858
+ while(namespaces.length)
859
+ {
860
+ scope = scope[namespaces.shift()];
861
+ }
862
+ fn = scope;
863
+ }
864
+ else
865
+ fn = window[functionName] || options.customFunctions[functionName];
866
+ if (typeof(fn) == 'function')
867
+ return fn(field, rules, i, options);
868
+
869
+ },
870
+ /**
871
+ * Field match
872
+ *
873
+ * @param {jqObject} field
874
+ * @param {Array[String]} rules
875
+ * @param {int} i rules index
876
+ * @param {Map}
877
+ * user options
878
+ * @return an error string if validation failed
879
+ */
880
+ _equals: function(field, rules, i, options) {
881
+ var equalsField = rules[i + 1];
882
+
883
+ if (field.val() != $("#" + equalsField).val())
884
+ return options.allrules.equals.alertText;
885
+ },
886
+ /**
887
+ * Check the maximum size (in characters)
888
+ *
889
+ * @param {jqObject} field
890
+ * @param {Array[String]} rules
891
+ * @param {int} i rules index
892
+ * @param {Map}
893
+ * user options
894
+ * @return an error string if validation failed
895
+ */
896
+ _maxSize: function(field, rules, i, options) {
897
+ var max = rules[i + 1];
898
+ var len = field.val().length;
899
+
900
+ if (len > max) {
901
+ var rule = options.allrules.maxSize;
902
+ return rule.alertText + max + rule.alertText2;
903
+ }
904
+ },
905
+ /**
906
+ * Check the minimum size (in characters)
907
+ *
908
+ * @param {jqObject} field
909
+ * @param {Array[String]} rules
910
+ * @param {int} i rules index
911
+ * @param {Map}
912
+ * user options
913
+ * @return an error string if validation failed
914
+ */
915
+ _minSize: function(field, rules, i, options) {
916
+ var min = rules[i + 1];
917
+ var len = field.val().length;
918
+
919
+ if (len < min) {
920
+ var rule = options.allrules.minSize;
921
+ return rule.alertText + min + rule.alertText2;
922
+ }
923
+ },
924
+ /**
925
+ * Check number minimum value
926
+ *
927
+ * @param {jqObject} field
928
+ * @param {Array[String]} rules
929
+ * @param {int} i rules index
930
+ * @param {Map}
931
+ * user options
932
+ * @return an error string if validation failed
933
+ */
934
+ _min: function(field, rules, i, options) {
935
+ var min = parseFloat(rules[i + 1]);
936
+ var len = parseFloat(field.val());
937
+
938
+ if (len < min) {
939
+ var rule = options.allrules.min;
940
+ if (rule.alertText2) return rule.alertText + min + rule.alertText2;
941
+ return rule.alertText + min;
942
+ }
943
+ },
944
+ /**
945
+ * Check number maximum value
946
+ *
947
+ * @param {jqObject} field
948
+ * @param {Array[String]} rules
949
+ * @param {int} i rules index
950
+ * @param {Map}
951
+ * user options
952
+ * @return an error string if validation failed
953
+ */
954
+ _max: function(field, rules, i, options) {
955
+ var max = parseFloat(rules[i + 1]);
956
+ var len = parseFloat(field.val());
957
+
958
+ if (len >max ) {
959
+ var rule = options.allrules.max;
960
+ if (rule.alertText2) return rule.alertText + max + rule.alertText2;
961
+ //orefalo: to review, also do the translations
962
+ return rule.alertText + max;
963
+ }
964
+ },
965
+ /**
966
+ * Checks date is in the past
967
+ *
968
+ * @param {jqObject} field
969
+ * @param {Array[String]} rules
970
+ * @param {int} i rules index
971
+ * @param {Map}
972
+ * user options
973
+ * @return an error string if validation failed
974
+ */
975
+ _past: function(form, field, rules, i, options) {
976
+
977
+ var p=rules[i + 1];
978
+ var fieldAlt = $(form.find("input[name='" + p.replace(/^#+/, '') + "']"));
979
+ var pdate;
980
+
981
+ if (p.toLowerCase() == "now") {
982
+ pdate = new Date();
983
+ } else if (undefined != fieldAlt.val()) {
984
+ if (fieldAlt.is(":disabled"))
985
+ return;
986
+ pdate = methods._parseDate(fieldAlt.val());
987
+ } else {
988
+ pdate = methods._parseDate(p);
989
+ }
990
+ var vdate = methods._parseDate(field.val());
991
+
992
+ if (vdate > pdate ) {
993
+ var rule = options.allrules.past;
994
+ if (rule.alertText2) return rule.alertText + methods._dateToString(pdate) + rule.alertText2;
995
+ return rule.alertText + methods._dateToString(pdate);
996
+ }
997
+ },
998
+ /**
999
+ * Checks date is in the future
1000
+ *
1001
+ * @param {jqObject} field
1002
+ * @param {Array[String]} rules
1003
+ * @param {int} i rules index
1004
+ * @param {Map}
1005
+ * user options
1006
+ * @return an error string if validation failed
1007
+ */
1008
+ _future: function(form, field, rules, i, options) {
1009
+
1010
+ var p=rules[i + 1];
1011
+ var fieldAlt = $(form.find("input[name='" + p.replace(/^#+/, '') + "']"));
1012
+ var pdate;
1013
+
1014
+ if (p.toLowerCase() == "now") {
1015
+ pdate = new Date();
1016
+ } else if (undefined != fieldAlt.val()) {
1017
+ if (fieldAlt.is(":disabled"))
1018
+ return;
1019
+ pdate = methods._parseDate(fieldAlt.val());
1020
+ } else {
1021
+ pdate = methods._parseDate(p);
1022
+ }
1023
+ var vdate = methods._parseDate(field.val());
1024
+
1025
+ if (vdate < pdate ) {
1026
+ var rule = options.allrules.future;
1027
+ if (rule.alertText2)
1028
+ return rule.alertText + methods._dateToString(pdate) + rule.alertText2;
1029
+ return rule.alertText + methods._dateToString(pdate);
1030
+ }
1031
+ },
1032
+ /**
1033
+ * Checks if valid date
1034
+ *
1035
+ * @param {string} date string
1036
+ * @return a bool based on determination of valid date
1037
+ */
1038
+ _isDate: function (value) {
1039
+ var dateRegEx = new RegExp(/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$|^(?:(?:(?:0?[13578]|1[02])(\/|-)31)|(?:(?:0?[1,3-9]|1[0-2])(\/|-)(?:29|30)))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^(?:(?:0?[1-9]|1[0-2])(\/|-)(?:0?[1-9]|1\d|2[0-8]))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^(0?2(\/|-)29)(\/|-)(?:(?:0[48]00|[13579][26]00|[2468][048]00)|(?:\d\d)?(?:0[48]|[2468][048]|[13579][26]))$/);
1040
+ return dateRegEx.test(value);
1041
+ },
1042
+ /**
1043
+ * Checks if valid date time
1044
+ *
1045
+ * @param {string} date string
1046
+ * @return a bool based on determination of valid date time
1047
+ */
1048
+ _isDateTime: function (value){
1049
+ var dateTimeRegEx = new RegExp(/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])\s+(1[012]|0?[1-9]){1}:(0?[1-5]|[0-6][0-9]){1}:(0?[0-6]|[0-6][0-9]){1}\s+(am|pm|AM|PM){1}$|^(?:(?:(?:0?[13578]|1[02])(\/|-)31)|(?:(?:0?[1,3-9]|1[0-2])(\/|-)(?:29|30)))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^((1[012]|0?[1-9]){1}\/(0?[1-9]|[12][0-9]|3[01]){1}\/\d{2,4}\s+(1[012]|0?[1-9]){1}:(0?[1-5]|[0-6][0-9]){1}:(0?[0-6]|[0-6][0-9]){1}\s+(am|pm|AM|PM){1})$/);
1050
+ return dateTimeRegEx.test(value);
1051
+ },
1052
+ //Checks if the start date is before the end date
1053
+ //returns true if end is later than start
1054
+ _dateCompare: function (start, end) {
1055
+ return (new Date(start.toString()) < new Date(end.toString()));
1056
+ },
1057
+ /**
1058
+ * Checks date range
1059
+ *
1060
+ * @param {jqObject} first field name
1061
+ * @param {jqObject} second field name
1062
+ * @return an error string if validation failed
1063
+ */
1064
+ _dateRange: function (field, rules, i, options) {
1065
+ //are not both populated
1066
+ if ((!options.firstOfGroup[0].value && options.secondOfGroup[0].value) || (options.firstOfGroup[0].value && !options.secondOfGroup[0].value)) {
1067
+ return options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2;
1068
+ }
1069
+
1070
+ //are not both dates
1071
+ if (!methods._isDate(options.firstOfGroup[0].value) || !methods._isDate(options.secondOfGroup[0].value)) {
1072
+ return options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2;
1073
+ }
1074
+
1075
+ //are both dates but range is off
1076
+ if (!methods._dateCompare(options.firstOfGroup[0].value, options.secondOfGroup[0].value)) {
1077
+ return options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2;
1078
+ }
1079
+ },
1080
+ /**
1081
+ * Checks date time range
1082
+ *
1083
+ * @param {jqObject} first field name
1084
+ * @param {jqObject} second field name
1085
+ * @return an error string if validation failed
1086
+ */
1087
+ _dateTimeRange: function (field, rules, i, options) {
1088
+ //are not both populated
1089
+ if ((!options.firstOfGroup[0].value && options.secondOfGroup[0].value) || (options.firstOfGroup[0].value && !options.secondOfGroup[0].value)) {
1090
+ return options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2;
1091
+ }
1092
+ //are not both dates
1093
+ if (!methods._isDateTime(options.firstOfGroup[0].value) || !methods._isDateTime(options.secondOfGroup[0].value)) {
1094
+ return options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2;
1095
+ }
1096
+ //are both dates but range is off
1097
+ if (!methods._dateCompare(options.firstOfGroup[0].value, options.secondOfGroup[0].value)) {
1098
+ return options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2;
1099
+ }
1100
+ },
1101
+ /**
1102
+ * Max number of checkbox selected
1103
+ *
1104
+ * @param {jqObject} field
1105
+ * @param {Array[String]} rules
1106
+ * @param {int} i rules index
1107
+ * @param {Map}
1108
+ * user options
1109
+ * @return an error string if validation failed
1110
+ */
1111
+ _maxCheckbox: function(form, field, rules, i, options) {
1112
+
1113
+ var nbCheck = rules[i + 1];
1114
+ var groupname = field.attr("name");
1115
+ var groupSize = form.find("input[name='" + groupname + "']:checked").size();
1116
+ if (groupSize > nbCheck) {
1117
+ options.showArrow = false;
1118
+ if (options.allrules.maxCheckbox.alertText2)
1119
+ return options.allrules.maxCheckbox.alertText + " " + nbCheck + " " + options.allrules.maxCheckbox.alertText2;
1120
+ return options.allrules.maxCheckbox.alertText;
1121
+ }
1122
+ },
1123
+ /**
1124
+ * Min number of checkbox selected
1125
+ *
1126
+ * @param {jqObject} field
1127
+ * @param {Array[String]} rules
1128
+ * @param {int} i rules index
1129
+ * @param {Map}
1130
+ * user options
1131
+ * @return an error string if validation failed
1132
+ */
1133
+ _minCheckbox: function(form, field, rules, i, options) {
1134
+
1135
+ var nbCheck = rules[i + 1];
1136
+ var groupname = field.attr("name");
1137
+ var groupSize = form.find("input[name='" + groupname + "']:checked").size();
1138
+ if (groupSize < nbCheck) {
1139
+ options.showArrow = false;
1140
+ return options.allrules.minCheckbox.alertText + " " + nbCheck + " " + options.allrules.minCheckbox.alertText2;
1141
+ }
1142
+ },
1143
+ /**
1144
+ * Checks that it is a valid credit card number according to the
1145
+ * Luhn checksum algorithm.
1146
+ *
1147
+ * @param {jqObject} field
1148
+ * @param {Array[String]} rules
1149
+ * @param {int} i rules index
1150
+ * @param {Map}
1151
+ * user options
1152
+ * @return an error string if validation failed
1153
+ */
1154
+ _creditCard: function(field, rules, i, options) {
1155
+ //spaces and dashes may be valid characters, but must be stripped to calculate the checksum.
1156
+ var valid = false, cardNumber = field.val().replace(/ +/g, '').replace(/-+/g, '');
1157
+
1158
+ var numDigits = cardNumber.length;
1159
+ if (numDigits >= 14 && numDigits <= 16 && parseInt(cardNumber) > 0) {
1160
+
1161
+ var sum = 0, i = numDigits - 1, pos = 1, digit, luhn = new String();
1162
+ do {
1163
+ digit = parseInt(cardNumber.charAt(i));
1164
+ luhn += (pos++ % 2 == 0) ? digit * 2 : digit;
1165
+ } while (--i >= 0)
1166
+
1167
+ for (i = 0; i < luhn.length; i++) {
1168
+ sum += parseInt(luhn.charAt(i));
1169
+ }
1170
+ valid = sum % 10 == 0;
1171
+ }
1172
+ if (!valid) return options.allrules.creditCard.alertText;
1173
+ },
1174
+ /**
1175
+ * Ajax field validation
1176
+ *
1177
+ * @param {jqObject} field
1178
+ * @param {Array[String]} rules
1179
+ * @param {int} i rules index
1180
+ * @param {Map}
1181
+ * user options
1182
+ * @return nothing! the ajax validator handles the prompts itself
1183
+ */
1184
+ _ajax: function(field, rules, i, options) {
1185
+
1186
+ var errorSelector = rules[i + 1];
1187
+ var rule = options.allrules[errorSelector];
1188
+ var extraData = rule.extraData;
1189
+ var extraDataDynamic = rule.extraDataDynamic;
1190
+ var data = {
1191
+ "fieldId" : field.attr("id"),
1192
+ "fieldValue" : field.val()
1193
+ };
1194
+
1195
+ if (typeof extraData === "object") {
1196
+ $.extend(data, extraData);
1197
+ } else if (typeof extraData === "string") {
1198
+ var tempData = extraData.split("&");
1199
+ for(var i = 0; i < tempData.length; i++) {
1200
+ var values = tempData[i].split("=");
1201
+ if (values[0] && values[0]) {
1202
+ data[values[0]] = values[1];
1203
+ }
1204
+ }
1205
+ }
1206
+
1207
+ if (extraDataDynamic) {
1208
+ var tmpData = [];
1209
+ var domIds = String(extraDataDynamic).split(",");
1210
+ for (var i = 0; i < domIds.length; i++) {
1211
+ var id = domIds[i];
1212
+ if ($(id).length) {
1213
+ var inputValue = field.closest("form").find(id).val();
1214
+ var keyValue = id.replace('#', '') + '=' + escape(inputValue);
1215
+ data[id.replace('#', '')] = inputValue;
1216
+ }
1217
+ }
1218
+ }
1219
+
1220
+ // If a field change event triggered this we want to clear the cache for this ID
1221
+ if (options.eventTrigger == "field") {
1222
+ delete(options.ajaxValidCache[field.attr("id")]);
1223
+ }
1224
+
1225
+ // If there is an error or if the the field is already validated, do not re-execute AJAX
1226
+ if (!options.isError && !methods._checkAjaxFieldStatus(field.attr("id"), options)) {
1227
+ $.ajax({
1228
+ type: options.ajaxFormValidationMethod,
1229
+ url: rule.url,
1230
+ cache: false,
1231
+ dataType: "json",
1232
+ data: data,
1233
+ field: field,
1234
+ rule: rule,
1235
+ methods: methods,
1236
+ options: options,
1237
+ beforeSend: function() {},
1238
+ error: function(data, transport) {
1239
+ methods._ajaxError(data, transport);
1240
+ },
1241
+ success: function(json) {
1242
+
1243
+ // asynchronously called on success, data is the json answer from the server
1244
+ var errorFieldId = json[0];
1245
+ //var errorField = $($("#" + errorFieldId)[0]);
1246
+ var errorField = $($("input[id='" + errorFieldId +"']")[0]);
1247
+
1248
+ // make sure we found the element
1249
+ if (errorField.length == 1) {
1250
+ var status = json[1];
1251
+ // read the optional msg from the server
1252
+ var msg = json[2];
1253
+ if (!status) {
1254
+ // Houston we got a problem - display an red prompt
1255
+ options.ajaxValidCache[errorFieldId] = false;
1256
+ options.isError = true;
1257
+
1258
+ // resolve the msg prompt
1259
+ if(msg) {
1260
+ if (options.allrules[msg]) {
1261
+ var txt = options.allrules[msg].alertText;
1262
+ if (txt) {
1263
+ msg = txt;
1264
+ }
1265
+ }
1266
+ }
1267
+ else
1268
+ msg = rule.alertText;
1269
+
1270
+ methods._showPrompt(errorField, msg, "", true, options);
1271
+ } else {
1272
+ options.ajaxValidCache[errorFieldId] = true;
1273
+
1274
+ // resolves the msg prompt
1275
+ if(msg) {
1276
+ if (options.allrules[msg]) {
1277
+ var txt = options.allrules[msg].alertTextOk;
1278
+ if (txt) {
1279
+ msg = txt;
1280
+ }
1281
+ }
1282
+ }
1283
+ else
1284
+ msg = rule.alertTextOk;
1285
+
1286
+ // see if we should display a green prompt
1287
+ if (msg)
1288
+ methods._showPrompt(errorField, msg, "pass", true, options);
1289
+ else
1290
+ methods._closePrompt(errorField);
1291
+
1292
+ // If a submit form triggered this, we want to re-submit the form
1293
+ if (options.eventTrigger == "submit")
1294
+ field.closest("form").submit();
1295
+ }
1296
+ }
1297
+ errorField.trigger("jqv.field.result", [errorField, options.isError, msg]);
1298
+ }
1299
+ });
1300
+
1301
+ return rule.alertTextLoad;
1302
+ }
1303
+ },
1304
+ /**
1305
+ * Common method to handle ajax errors
1306
+ *
1307
+ * @param {Object} data
1308
+ * @param {Object} transport
1309
+ */
1310
+ _ajaxError: function(data, transport) {
1311
+ if(data.status == 0 && transport == null)
1312
+ alert("The page is not served from a server! ajax call failed");
1313
+ else if(typeof console != "undefined")
1314
+ console.log("Ajax error: " + data.status + " " + transport);
1315
+ },
1316
+ /**
1317
+ * date -> string
1318
+ *
1319
+ * @param {Object} date
1320
+ */
1321
+ _dateToString: function(date) {
1322
+ return date.getFullYear()+"-"+(date.getMonth()+1)+"-"+date.getDate();
1323
+ },
1324
+ /**
1325
+ * Parses an ISO date
1326
+ * @param {String} d
1327
+ */
1328
+ _parseDate: function(d) {
1329
+
1330
+ var dateParts = d.split("-");
1331
+ if(dateParts==d)
1332
+ dateParts = d.split("/");
1333
+ return new Date(dateParts[0], (dateParts[1] - 1) ,dateParts[2]);
1334
+ },
1335
+ /**
1336
+ * Builds or updates a prompt with the given information
1337
+ *
1338
+ * @param {jqObject} field
1339
+ * @param {String} promptText html text to display type
1340
+ * @param {String} type the type of bubble: 'pass' (green), 'load' (black) anything else (red)
1341
+ * @param {boolean} ajaxed - use to mark fields than being validated with ajax
1342
+ * @param {Map} options user options
1343
+ */
1344
+ _showPrompt: function(field, promptText, type, ajaxed, options, ajaxform) {
1345
+ var prompt = methods._getPrompt(field);
1346
+ // The ajax submit errors are not see has an error in the form,
1347
+ // When the form errors are returned, the engine see 2 bubbles, but those are ebing closed by the engine at the same time
1348
+ // Because no error was found befor submitting
1349
+ if(ajaxform) prompt = false;
1350
+ if (prompt)
1351
+ methods._updatePrompt(field, prompt, promptText, type, ajaxed, options);
1352
+ else
1353
+ methods._buildPrompt(field, promptText, type, ajaxed, options);
1354
+ },
1355
+ /**
1356
+ * Builds and shades a prompt for the given field.
1357
+ *
1358
+ * @param {jqObject} field
1359
+ * @param {String} promptText html text to display type
1360
+ * @param {String} type the type of bubble: 'pass' (green), 'load' (black) anything else (red)
1361
+ * @param {boolean} ajaxed - use to mark fields than being validated with ajax
1362
+ * @param {Map} options user options
1363
+ */
1364
+ _buildPrompt: function(field, promptText, type, ajaxed, options) {
1365
+
1366
+ // create the prompt
1367
+ var prompt = $('<div>');
1368
+ prompt.addClass(methods._getClassName(field.attr("id")) + "formError");
1369
+ // add a class name to identify the parent form of the prompt
1370
+ prompt.addClass("parentForm"+methods._getClassName(field.parents('form').attr("id")));
1371
+ prompt.addClass("formError");
1372
+
1373
+ switch (type) {
1374
+ case "pass":
1375
+ prompt.addClass("greenPopup");
1376
+ break;
1377
+ case "load":
1378
+ prompt.addClass("blackPopup");
1379
+ break;
1380
+ default:
1381
+ /* it has error */
1382
+ //alert("unknown popup type:"+type);
1383
+ }
1384
+ if (ajaxed)
1385
+ prompt.addClass("ajaxed");
1386
+
1387
+ // create the prompt content
1388
+ var promptContent = $('<div>').addClass("formErrorContent").html(promptText).appendTo(prompt);
1389
+ // create the css arrow pointing at the field
1390
+ // note that there is no triangle on max-checkbox and radio
1391
+ if (options.showArrow) {
1392
+ var arrow = $('<div>').addClass("formErrorArrow");
1393
+
1394
+ //prompt positioning adjustment support. Usage: positionType:Xshift,Yshift (for ex.: bottomLeft:+20 or bottomLeft:-20,+10)
1395
+ var positionType=field.data("promptPosition") || options.promptPosition;
1396
+ if (typeof(positionType)=='string')
1397
+ {
1398
+ var pos=positionType.indexOf(":");
1399
+ if(pos!=-1)
1400
+ positionType=positionType.substring(0,pos);
1401
+ }
1402
+
1403
+ switch (positionType) {
1404
+ case "bottomLeft":
1405
+ case "bottomRight":
1406
+ prompt.find(".formErrorContent").before(arrow);
1407
+ arrow.addClass("formErrorArrowBottom").html('<div class="line1"><!-- --></div><div class="line2"><!-- --></div><div class="line3"><!-- --></div><div class="line4"><!-- --></div><div class="line5"><!-- --></div><div class="line6"><!-- --></div><div class="line7"><!-- --></div><div class="line8"><!-- --></div><div class="line9"><!-- --></div><div class="line10"><!-- --></div>');
1408
+ break;
1409
+ case "topLeft":
1410
+ case "topRight":
1411
+ arrow.html('<div class="line10"><!-- --></div><div class="line9"><!-- --></div><div class="line8"><!-- --></div><div class="line7"><!-- --></div><div class="line6"><!-- --></div><div class="line5"><!-- --></div><div class="line4"><!-- --></div><div class="line3"><!-- --></div><div class="line2"><!-- --></div><div class="line1"><!-- --></div>');
1412
+ prompt.append(arrow);
1413
+ break;
1414
+ }
1415
+ }
1416
+ // Modify z-indexes for jquery ui
1417
+ if (field.closest('.ui-dialog').length)
1418
+ prompt.addClass('formErrorInsideDialog');
1419
+
1420
+ prompt.css({
1421
+ "opacity": 0,
1422
+ 'position':'absolute'
1423
+ });
1424
+ field.before(prompt);
1425
+
1426
+ var pos = methods._calculatePosition(field, prompt, options);
1427
+ prompt.css({
1428
+ "top": pos.callerTopPosition,
1429
+ "left": pos.callerleftPosition,
1430
+ "marginTop": pos.marginTopSize,
1431
+ "opacity": 0
1432
+ }).data("callerField", field);
1433
+
1434
+ if (options.autoHidePrompt) {
1435
+ setTimeout(function(){
1436
+ prompt.animate({
1437
+ "opacity": 0
1438
+ },function(){
1439
+ prompt.closest('.formErrorOuter').remove();
1440
+ prompt.remove();
1441
+ });
1442
+ }, options.autoHideDelay);
1443
+ }
1444
+ return prompt.animate({
1445
+ "opacity": 0.87
1446
+ });
1447
+ },
1448
+ /**
1449
+ * Updates the prompt text field - the field for which the prompt
1450
+ * @param {jqObject} field
1451
+ * @param {String} promptText html text to display type
1452
+ * @param {String} type the type of bubble: 'pass' (green), 'load' (black) anything else (red)
1453
+ * @param {boolean} ajaxed - use to mark fields than being validated with ajax
1454
+ * @param {Map} options user options
1455
+ */
1456
+ _updatePrompt: function(field, prompt, promptText, type, ajaxed, options, noAnimation) {
1457
+
1458
+ if (prompt) {
1459
+ if (typeof type !== "undefined") {
1460
+ if (type == "pass")
1461
+ prompt.addClass("greenPopup");
1462
+ else
1463
+ prompt.removeClass("greenPopup");
1464
+
1465
+ if (type == "load")
1466
+ prompt.addClass("blackPopup");
1467
+ else
1468
+ prompt.removeClass("blackPopup");
1469
+ }
1470
+ if (ajaxed)
1471
+ prompt.addClass("ajaxed");
1472
+ else
1473
+ prompt.removeClass("ajaxed");
1474
+
1475
+ prompt.find(".formErrorContent").html(promptText);
1476
+
1477
+ var pos = methods._calculatePosition(field, prompt, options);
1478
+ var css = {"top": pos.callerTopPosition,
1479
+ "left": pos.callerleftPosition,
1480
+ "marginTop": pos.marginTopSize};
1481
+
1482
+ if (noAnimation)
1483
+ prompt.css(css);
1484
+ else
1485
+ prompt.animate(css);
1486
+ }
1487
+ },
1488
+ /**
1489
+ * Closes the prompt associated with the given field
1490
+ *
1491
+ * @param {jqObject}
1492
+ * field
1493
+ */
1494
+ _closePrompt: function(field) {
1495
+ var prompt = methods._getPrompt(field);
1496
+ if (prompt)
1497
+ prompt.fadeTo("fast", 0, function() {
1498
+ prompt.parent('.formErrorOuter').remove();
1499
+ prompt.remove();
1500
+ });
1501
+ },
1502
+ closePrompt: function(field) {
1503
+ return methods._closePrompt(field);
1504
+ },
1505
+ /**
1506
+ * Returns the error prompt matching the field if any
1507
+ *
1508
+ * @param {jqObject}
1509
+ * field
1510
+ * @return undefined or the error prompt (jqObject)
1511
+ */
1512
+ _getPrompt: function(field) {
1513
+ var formId = $(field).closest('form').attr('id');
1514
+ var className = methods._getClassName(field.attr("id")) + "formError";
1515
+ var match = $("." + methods._escapeExpression(className) + '.parentForm' + formId)[0];
1516
+ if (match)
1517
+ return $(match);
1518
+ },
1519
+ /**
1520
+ * Returns the escapade classname
1521
+ *
1522
+ * @param {selector}
1523
+ * className
1524
+ */
1525
+ _escapeExpression: function (selector) {
1526
+ return selector.replace(/([#;&,\.\+\*\~':"\!\^$\[\]\(\)=>\|])/g, "\\$1");
1527
+ },
1528
+ /**
1529
+ * returns true if we are in a RTLed document
1530
+ *
1531
+ * @param {jqObject} field
1532
+ */
1533
+ isRTL: function(field)
1534
+ {
1535
+ var $document = $(document);
1536
+ var $body = $('body');
1537
+ var rtl =
1538
+ (field && field.hasClass('rtl')) ||
1539
+ (field && (field.attr('dir') || '').toLowerCase()==='rtl') ||
1540
+ $document.hasClass('rtl') ||
1541
+ ($document.attr('dir') || '').toLowerCase()==='rtl' ||
1542
+ $body.hasClass('rtl') ||
1543
+ ($body.attr('dir') || '').toLowerCase()==='rtl';
1544
+ return Boolean(rtl);
1545
+ },
1546
+ /**
1547
+ * Calculates prompt position
1548
+ *
1549
+ * @param {jqObject}
1550
+ * field
1551
+ * @param {jqObject}
1552
+ * the prompt
1553
+ * @param {Map}
1554
+ * options
1555
+ * @return positions
1556
+ */
1557
+ _calculatePosition: function (field, promptElmt, options) {
1558
+
1559
+ var promptTopPosition, promptleftPosition, marginTopSize;
1560
+ var fieldWidth = field.width();
1561
+ var fieldLeft = field.position().left;
1562
+ var fieldTop = field.position().top;
1563
+ var fieldHeight = field.height();
1564
+ var promptHeight = promptElmt.height();
1565
+
1566
+
1567
+ // is the form contained in an overflown container?
1568
+ promptTopPosition = promptleftPosition = 0;
1569
+ // compensation for the arrow
1570
+ marginTopSize = -promptHeight;
1571
+
1572
+
1573
+ //prompt positioning adjustment support
1574
+ //now you can adjust prompt position
1575
+ //usage: positionType:Xshift,Yshift
1576
+ //for example:
1577
+ // bottomLeft:+20 means bottomLeft position shifted by 20 pixels right horizontally
1578
+ // topRight:20, -15 means topRight position shifted by 20 pixels to right and 15 pixels to top
1579
+ //You can use +pixels, - pixels. If no sign is provided than + is default.
1580
+ var positionType=field.data("promptPosition") || options.promptPosition;
1581
+ var shift1="";
1582
+ var shift2="";
1583
+ var shiftX=0;
1584
+ var shiftY=0;
1585
+ if (typeof(positionType)=='string') {
1586
+ //do we have any position adjustments ?
1587
+ if (positionType.indexOf(":")!=-1) {
1588
+ shift1=positionType.substring(positionType.indexOf(":")+1);
1589
+ positionType=positionType.substring(0,positionType.indexOf(":"));
1590
+
1591
+ //if any advanced positioning will be needed (percents or something else) - parser should be added here
1592
+ //for now we use simple parseInt()
1593
+
1594
+ //do we have second parameter?
1595
+ if (shift1.indexOf(",") !=-1) {
1596
+ shift2=shift1.substring(shift1.indexOf(",") +1);
1597
+ shift1=shift1.substring(0,shift1.indexOf(","));
1598
+ shiftY=parseInt(shift2);
1599
+ if (isNaN(shiftY)) shiftY=0;
1600
+ };
1601
+
1602
+ shiftX=parseInt(shift1);
1603
+ if (isNaN(shift1)) shift1=0;
1604
+
1605
+ };
1606
+ };
1607
+
1608
+
1609
+ switch (positionType) {
1610
+ default:
1611
+ case "topRight":
1612
+ promptleftPosition += fieldLeft + fieldWidth - 30;
1613
+ promptTopPosition += fieldTop;
1614
+ break;
1615
+
1616
+ case "topLeft":
1617
+ promptTopPosition += fieldTop;
1618
+ promptleftPosition += fieldLeft;
1619
+ break;
1620
+
1621
+ case "centerRight":
1622
+ promptTopPosition = fieldTop+4;
1623
+ marginTopSize = 0;
1624
+ promptleftPosition= fieldLeft + field.outerWidth(true)+5;
1625
+ break;
1626
+ case "centerLeft":
1627
+ promptleftPosition = fieldLeft - (promptElmt.width() + 2);
1628
+ promptTopPosition = fieldTop+4;
1629
+ marginTopSize = 0;
1630
+
1631
+ break;
1632
+
1633
+ case "bottomLeft":
1634
+ promptTopPosition = fieldTop + field.height() + 5;
1635
+ marginTopSize = 0;
1636
+ promptleftPosition = fieldLeft;
1637
+ break;
1638
+ case "bottomRight":
1639
+ promptleftPosition = fieldLeft + fieldWidth - 30;
1640
+ promptTopPosition = fieldTop + field.height() + 5;
1641
+ marginTopSize = 0;
1642
+ };
1643
+
1644
+
1645
+
1646
+ //apply adjusments if any
1647
+ promptleftPosition += shiftX;
1648
+ promptTopPosition += shiftY;
1649
+
1650
+ return {
1651
+ "callerTopPosition": promptTopPosition + "px",
1652
+ "callerleftPosition": promptleftPosition + "px",
1653
+ "marginTopSize": marginTopSize + "px"
1654
+ };
1655
+ },
1656
+ /**
1657
+ * Saves the user options and variables in the form.data
1658
+ *
1659
+ * @param {jqObject}
1660
+ * form - the form where the user option should be saved
1661
+ * @param {Map}
1662
+ * options - the user options
1663
+ * @return the user options (extended from the defaults)
1664
+ */
1665
+ _saveOptions: function(form, options) {
1666
+
1667
+ // is there a language localisation ?
1668
+ if ($.validationEngineLanguage)
1669
+ var allRules = $.validationEngineLanguage.allRules;
1670
+ else
1671
+ $.error("jQuery.validationEngine rules are not loaded, plz add localization files to the page");
1672
+ // --- Internals DO NOT TOUCH or OVERLOAD ---
1673
+ // validation rules and i18
1674
+ $.validationEngine.defaults.allrules = allRules;
1675
+
1676
+ var userOptions = $.extend(true,{},$.validationEngine.defaults,options);
1677
+
1678
+ form.data('jqv', userOptions);
1679
+ return userOptions;
1680
+ },
1681
+
1682
+ /**
1683
+ * Removes forbidden characters from class name
1684
+ * @param {String} className
1685
+ */
1686
+ _getClassName: function(className) {
1687
+ if(className)
1688
+ return className.replace(/:/g, "_").replace(/\./g, "_");
1689
+ },
1690
+
1691
+ /**
1692
+ * Conditionally required field
1693
+ *
1694
+ * @param {jqObject} field
1695
+ * @param {Array[String]} rules
1696
+ * @param {int} i rules index
1697
+ * @param {Map}
1698
+ * user options
1699
+ * @return an error string if validation failed
1700
+ */
1701
+ _condRequired: function(field, rules, i, options) {
1702
+ var idx, dependingField;
1703
+
1704
+ for(idx = (i + 1); idx < rules.length; idx++) {
1705
+ dependingField = jQuery("#" + rules[idx]).first();
1706
+
1707
+ /* Use _required for determining wether dependingField has a value.
1708
+ * There is logic there for handling all field types, and default value; so we won't replicate that here
1709
+ */
1710
+ if (dependingField.length && methods._required(dependingField, ["required"], 0, options) == undefined) {
1711
+ /* We now know any of the depending fields has a value,
1712
+ * so we can validate this field as per normal required code
1713
+ */
1714
+ return methods._required(field, ["required"], 0, options);
1715
+ }
1716
+ }
1717
+ }
1718
+ };
1719
+
1720
+ /**
1721
+ * Plugin entry point.
1722
+ * You may pass an action as a parameter or a list of options.
1723
+ * if none, the init and attach methods are being called.
1724
+ * Remember: if you pass options, the attached method is NOT called automatically
1725
+ *
1726
+ * @param {String}
1727
+ * method (optional) action
1728
+ */
1729
+ $.fn.validationEngine = function(method) {
1730
+
1731
+ var form = $(this);
1732
+ if(!form[0]) return form; // stop here if the form does not exist
1733
+
1734
+ if (typeof(method) == 'string' && method.charAt(0) != '_' && methods[method]) {
1735
+
1736
+ // make sure init is called once
1737
+ if(method != "showPrompt" && method != "hide" && method != "hideAll")
1738
+ methods.init.apply(form);
1739
+
1740
+ return methods[method].apply(form, Array.prototype.slice.call(arguments, 1));
1741
+ } else if (typeof method == 'object' || !method) {
1742
+
1743
+ // default constructor with or without arguments
1744
+ methods.init.apply(form, arguments);
1745
+ return methods.attach.apply(form);
1746
+ } else {
1747
+ $.error('Method ' + method + ' does not exist in jQuery.validationEngine');
1748
+ }
1749
+ };
1750
+
1751
+
1752
+
1753
+ // LEAK GLOBAL OPTIONS
1754
+ $.validationEngine= {fieldIdCounter: 0,defaults:{
1755
+
1756
+ // Name of the event triggering field validation
1757
+ validationEventTrigger: "blur",
1758
+ // Automatically scroll viewport to the first error
1759
+ scroll: true,
1760
+ // Focus on the first input
1761
+ focusFirstField:true,
1762
+ // Opening box position, possible locations are: topLeft,
1763
+ // topRight, bottomLeft, centerRight, bottomRight
1764
+ promptPosition: "topRight",
1765
+ bindMethod:"bind",
1766
+ // internal, automatically set to true when it parse a _ajax rule
1767
+ inlineAjax: false,
1768
+ // if set to true, the form data is sent asynchronously via ajax to the form.action url (get)
1769
+ ajaxFormValidation: false,
1770
+ // The url to send the submit ajax validation (default to action)
1771
+ ajaxFormValidationURL: false,
1772
+ // HTTP method used for ajax validation
1773
+ ajaxFormValidationMethod: 'get',
1774
+ // Ajax form validation callback method: boolean onComplete(form, status, errors, options)
1775
+ // retuns false if the form.submit event needs to be canceled.
1776
+ onAjaxFormComplete: $.noop,
1777
+ // called right before the ajax call, may return false to cancel
1778
+ onBeforeAjaxFormValidation: $.noop,
1779
+ // Stops form from submitting and execute function assiciated with it
1780
+ onValidationComplete: false,
1781
+
1782
+ // Used when you have a form fields too close and the errors messages are on top of other disturbing viewing messages
1783
+ doNotShowAllErrosOnSubmit: false,
1784
+ // Object where you store custom messages to override the default error messages
1785
+ custom_error_messages:{},
1786
+ // true if you want to vind the input fields
1787
+ binded: true,
1788
+ // set to true, when the prompt arrow needs to be displayed
1789
+ showArrow: true,
1790
+ // did one of the validation fail ? kept global to stop further ajax validations
1791
+ isError: false,
1792
+ // Caches field validation status, typically only bad status are created.
1793
+ // the array is used during ajax form validation to detect issues early and prevent an expensive submit
1794
+ ajaxValidCache: {},
1795
+ // Auto update prompt position after window resize
1796
+ autoPositionUpdate: false,
1797
+
1798
+ InvalidFields: [],
1799
+ onSuccess: false,
1800
+ onFailure: false,
1801
+ // Auto-hide prompt
1802
+ autoHidePrompt: false,
1803
+ // Delay before auto-hide
1804
+ autoHideDelay: 10000,
1805
+ // Fade out duration while hiding the validations
1806
+ fadeDuration: 0.3,
1807
+ // Use Prettify select library
1808
+ prettySelect: false,
1809
+ // Custom ID uses prefix
1810
+ usePrefix: "",
1811
+ // Custom ID uses suffix
1812
+ useSuffix: "",
1813
+ // Only show one message per error prompt
1814
+ showOneMessage: false
1815
+ }};
1816
+ $(function(){$.validationEngine.defaults.promptPosition = methods.isRTL()?'topLeft':"topRight"});
1817
+ })(jQuery);
1818
+
1819
+