Browse files

Refactored to use subclass of FormTransformation to set Foundation fr…

…iendly templates on form fields.

$form->transform(new FoundationFormTransformation()) when working with Form or just use FoundationForm::create() and the transformation will be done for you, along with adding any extra methods or validation helpers that get added.
  • Loading branch information...
1 parent 7b200e4 commit fecffcafb8932493b1fa9d8c5f448d658f76fdcc @ryanwachtl committed Feb 1, 2013
View
29 _config.php
@@ -1,12 +1,31 @@
<?php
+/**
+ * Decorates all of the FormField subclasses that get special
+ * treatment from Foundation
+ */
-//forms
-Object::useCustomClass('Form', 'FoundationForm', true);
-Object::useCustomClass('MemberLoginForm', 'FoundationMemberLoginForm', true);
+$dir = basename(dirname(__FILE__));
+
+define('FOUNDATION_FORM_DIR', $dir);
+
+if(FOUNDATION_FORM_DIR != "bootstrap_forms") {
+ //user_error("The foundation_forms module must be in a directory named 'foundation_forms'",E_USER_ERROR);
+}
+
+if(!class_exists("GridField")) {
+ user_error("The foundation_forms module requires SilverStripe 3.0 or greater.", E_USER_ERROR);
+}
+
+// TODO Opt-in
+Object::useCustomClass('MemberLoginForm', 'FoundationMemberLoginForm');
+
+// TODO Opt-in
if (class_exists('UserDefinedForm')) {
Object::add_extension('UserDefinedForm_Controller', 'FoundationUserDefinedForm_Controller');
}
-//fields
//Object::add_extension("FormField", "FoundationFormField");
-//Object::add_extension("TextField", "FoundationTextField");
+//Object::add_extension("TextField", "FoundationTextField");
+//Object::add_extension("OptionsetField", "FoundationOptionsetField");
+//Object::add_extension("FormAction","FoundationFormAction");
+//Object::add_extension("TextareaField", "FoundationTextField");
View
29 code/FoundationForm.php
@@ -1,20 +1,33 @@
<?php
-
/**
* Builds a form that renders {@link FormField} objects
* using templates that are compatible with Zurb Foundation.
* Extra methods are decorated on to the {@link FoundationFormField}
* objects and their subclasses to support special features
* of the framework.
*
- * @author Ryan Wachtl <ryan.wachtl@gmail.com>
+ * @author Ryan Wachtl <ryan@wachtl.us>
* @package foundation_forms
*/
class FoundationForm extends Form {
-
- public function forTemplate() {
- FoundationFormTransformation::transform($this);
- return parent::forTemplate();
- }
-
+
+ /**
+ * @var string The template that will render this form
+ */
+ protected $template = "FoundationForm";
+
+ /**
+ * Includes the dependency if necessary, applies the Bootstrap templates,
+ * and renders the form HTML output
+ *
+ * @return string
+ */
+ public function forTemplate()
+ {
+ $this->transform(new FoundationFormTransformation());
+ $this->addExtraClass('custom');
+
+ return parent::forTemplate();
+ }
+
}
View
131 code/FoundationFormTransformation.php
@@ -1,86 +1,55 @@
<?php
-
/**
- * @author Ryan Wachtl <ryan.wachtl@gmail.com>
+ * Transformation that sets custom templates compatible with the Zurb Foundation framework.
+ * @author Ryan Wachtl <ryan@wachtl.us>
* @package foundation_forms
*/
-class FoundationFormTransformation {
-
- protected static $template = "FoundationForm";
-
- public static function transform(Form $form) {
- self::applyFoundation($form);
- $form->addExtraClass('custom');
- $form->setTemplate(self::$template);
- }
-
- /**
- * Changes the templates of all the {@link FormField}
- * objects in a given {@link FieldList} object to those
- * that work the Foundation framework
- *
- * @param FieldList $fields
- */
- public static function apply_foundation_to_fieldlist(FieldList $fields) {
-
- foreach($fields as $field) {
-
- // tabset
- if($field instanceof TabSet) {
- self::apply_foundation_to_fieldlist($field->Tabs());
- }
-
- // tab
- if($field instanceof Tab) {
- self::apply_foundation_to_fieldlist($field->Fields());
- }
-
- $template = "Foundation{$field->class}_holder";
-
- if(SSViewer::hasTemplate($template)) {
- $field->setFieldHolderTemplate($template);
- }
- else {
- $field->setFieldHolderTemplate("FoundationFieldHolder");
- }
-
- foreach(array_reverse(ClassInfo::ancestry($field)) as $className) {
- $foundationCandidate = "Foundation{$className}";
- $nativeCandidate = $className;
- if(SSViewer::hasTemplate($foundationCandidate)) {
- $field->setTemplate($foundationCandidate);
- break;
- }
- elseif(SSViewer::hasTemplate($nativeCandidate)) {
- $field->setTemplate($nativeCandidate);
- break;
- }
- }
- }
- }
-
-
-
- /**
- * Applies the Foundation transformation to the fields and actions
- * of the form
- */
- public static function applyFoundation(Form $form) {
- self::applyFoundationToFieldList($form->Fields());
- self::applyFoundationToFieldList($form->Actions());
- }
-
-
-
- /**
- * Changes the templates of all the {@link FormField}
- * objects in a given {@link FieldList} object to those
- * that work the Foundation framework
- *
- * @param FieldList $fields
- */
- protected static function applyFoundationToFieldList(FieldList $fields) {
- self::apply_foundation_to_fieldlist($fields);
- }
-
+class FoundationFormTransformation extends FormTransformation {
+
+ public function transform(FormField $field)
+ {
+ // tabset
+ if($field instanceof TabSet) {
+ $field->Tabs()->transform(new FoundationFormTransformation());
+ }
+
+ // tab
+ if($field instanceof Tab) {
+ $field->Fields()->transform(new FoundationFormTransformation());
+ }
+
+ $template = "Foundation{$field->class}_holder";
+
+ if(SSViewer::hasTemplate($template)) {
+ $field->setFieldHolderTemplate($template);
+ }
+ else {
+ $field->setFieldHolderTemplate("FoundationFieldHolder");
+ }
+
+ $templateSmall = "Foundation{$field->class}_holder_small";
+
+ if(SSViewer::hasTemplate($templateSmall)) {
+ $field->setSmallFieldHolderTemplate($templateSmall);
+ }
+ else {
+ $field->setSmallFieldHolderTemplate("FoundationFieldHolderMinimal");
+ }
+
+ foreach(array_reverse(ClassInfo::ancestry($field)) as $className) {
+ $foundationCandidate = "Foundation{$className}";
+ $nativeCandidate = $className;
+ if(SSViewer::hasTemplate($foundationCandidate)) {
+ $field->setTemplate($foundationCandidate);
+ break;
+ }
+ elseif(SSViewer::hasTemplate($nativeCandidate)) {
+ $field->setTemplate($nativeCandidate);
+ break;
+ }
+ }
+
+ return $field;
+ }
+
}
View
35 code/FoundationMemberLoginForm.php
@@ -1,26 +1,33 @@
<?php
-
/**
* Builds a form that renders {@link FormField} objects
* using templates that are compatible with Zurb Foundation.
* Extra methods are decorated on to the {@link FoundationFormField}
* objects and their subclasses to support special features
* of the framework.
*
- * @author Ryan Wachtl <ryan.wachtl@gmail.com>
+ * @author Ryan Wachtl <ryan@wachtl.us>
* @package foundation_forms
*/
class FoundationMemberLoginForm extends MemberLoginForm {
-
- /**
- * Includes the dependency if necessary, applies the Foundation templates,
- * and renders the form HTML output
- *
- * @return string
- */
- public function forTemplate() {
- FoundationFormTransformation::transform($this);
- return parent::forTemplate();
- }
-
+
+ /**
+ * @var string The template that will render this form
+ */
+ protected $template = "FoundationForm";
+
+ /**
+ * Includes the dependency if necessary, applies the Bootstrap templates,
+ * and renders the form HTML output
+ *
+ * @return string
+ */
+ public function forTemplate()
+ {
+ $this->transform(new FoundationFormTransformation());
+ $this->addExtraClass('custom');
+
+ return parent::forTemplate();
+ }
+
}
View
15 code/FoundationUserDefinedForm_Controller.php
@@ -1,13 +1,16 @@
<?php
-
/**
- * @author Ryan Wachtl <ryan.wachtl@gmail.com>
+ * Performs the FoundationFormTransformation on UserDefinedForm
+ * @author Ryan Wachtl <ryan.wachtl.us>
* @package foundation_forms
*/
class FoundationUserDefinedForm_Controller extends DataExtension {
- public function updateForm(Form $form) {
- FoundationFormTransformation::transform($form);
- }
-
+ public function updateForm(Form $form)
+ {
+ $form->transform(new FoundationFormTransformation());
+ $form->setTemplate('FoundationUserDefinedForm', 'FoundationForm', 'Form');
+ $form->addExtraClass('custom');
+ }
+
}
View
68 javascript/parsley/parsley-standalone.min.js
@@ -0,0 +1,68 @@
+/* Parsley dist/parsley-standalone.min.js build version 1.1.8 http://parsleyjs.org */
+var Zepto=function(){function c(b){return"[object Function]"==M.call(b)}function n(b){return b instanceof Object}function s(b){return n(b)&&b.__proto__==Object.prototype}function t(b){return b instanceof Array}function u(b){return"number"==typeof b.length}function a(b){return b.replace(/::/g,"/").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/_/g,"-").toLowerCase()}function e(b){return b in y?y[b]:y[b]=RegExp("(^|\\s)"+b+"(\\s|$)")}function f(b){return"children"in
+b?x.call(b.children):d.map(b.childNodes,function(b){if(1==b.nodeType)return b})}function g(b,a,d){for(p in a)d&&s(a[p])?(s(b[p])||(b[p]={}),g(b[p],a[p],d)):a[p]!==j&&(b[p]=a[p])}function l(b,a){return a===j?d(b):d(b).filter(a)}function k(b,a,d,e){return c(a)?a.call(b,d,e):a}function r(b,a){var d=b.className,c=d&&d.baseVal!==j;if(a===j)return c?d.baseVal:d;c?d.baseVal=a:b.className=a}function z(b){var a;try{return b?"true"==b||("false"==b?!1:"null"==b?null:isNaN(a=Number(b))?/^[\[\{]/.test(b)?d.parseJSON(b):
+b:a):b}catch(c){return b}}function A(b,a){a(b);for(var d in b.childNodes)A(b.childNodes[d],a)}var j,p,d,v,w=[],x=w.slice,B=w.filter,m=window.document,h={},y={},D=m.defaultView.getComputedStyle,G={"column-count":1,columns:1,"font-weight":1,"line-height":1,opacity:1,"z-index":1,zoom:1},H=/^\s*<(\w+|!)[^>]*>/,N=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,I=/^(?:body|html)$/i,O="val css html text data width height offset".split(" "),E=m.createElement("table"),J=m.createElement("tr"),
+K={tr:m.createElement("tbody"),tbody:E,thead:E,tfoot:E,td:J,th:J,"*":m.createElement("div")},P=/complete|loaded|interactive/,Q=/^\.([\w-]+)$/,R=/^#([\w-]*)$/,S=/^[\w-]+$/,M={}.toString,q={},F,C,L=m.createElement("div");return q.matches=function(b,a){if(!b||1!==b.nodeType)return!1;var d=b.webkitMatchesSelector||b.mozMatchesSelector||b.oMatchesSelector||b.matchesSelector;if(d)return d.call(b,a);var c,d=b.parentNode,e=!d;return e&&(d=L).appendChild(b),c=~q.qsa(d,a).indexOf(b),e&&L.removeChild(b),c},
+F=function(b){return b.replace(/-+(.)?/g,function(b,a){return a?a.toUpperCase():""})},C=function(b){return B.call(b,function(a,d){return b.indexOf(a)==d})},q.fragment=function(b,a,c){b.replace&&(b=b.replace(N,"<$1></$2>"));a===j&&(a=H.test(b)&&RegExp.$1);a in K||(a="*");var e,m,h=K[a];return h.innerHTML=""+b,m=d.each(x.call(h.childNodes),function(){h.removeChild(this)}),s(c)&&(e=d(m),d.each(c,function(b,a){-1<O.indexOf(b)?e[b](a):e.attr(b,a)})),m},q.Z=function(b,a){return b=b||[],b.__proto__=arguments.callee.prototype,
+b.selector=a||"",b},q.isZ=function(b){return b instanceof q.Z},q.init=function(b,a){if(!b)return q.Z();if(c(b))return d(m).ready(b);if(q.isZ(b))return b;var e;if(t(b))e=B.call(b,function(b){return b!==j&&null!==b});else if(n(b))e=[s(b)?d.extend({},b):b],b=null;else if(H.test(b))e=q.fragment(b.trim(),RegExp.$1,a),b=null;else{if(a!==j)return d(a).find(b);e=q.qsa(m,b)}return q.Z(e,b)},d=function(b,a){return q.init(b,a)},d.extend=function(b){var a,d=x.call(arguments,1);return"boolean"==typeof b&&(a=b,
+b=d.shift()),d.forEach(function(d){g(b,d,a)}),b},q.qsa=function(b,a){var d;return b===m&&R.test(a)?(d=b.getElementById(RegExp.$1))?[d]:[]:1!==b.nodeType&&9!==b.nodeType?[]:x.call(Q.test(a)?b.getElementsByClassName(RegExp.$1):S.test(a)?b.getElementsByTagName(a):b.querySelectorAll(a))},d.contains=function(b,a){return b!==a&&b.contains(a)},d.isFunction=c,d.isObject=n,d.isArray=t,d.isPlainObject=s,d.inArray=function(b,a,d){return w.indexOf.call(a,b,d)},d.camelCase=F,d.trim=function(b){return b.trim()},
+d.uuid=0,d.support={},d.expr={},d.map=function(b,a){var c,e=[],m;if(u(b))for(m=0;m<b.length;m++)c=a(b[m],m),null!=c&&e.push(c);else for(m in b)c=a(b[m],m),null!=c&&e.push(c);return 0<e.length?d.fn.concat.apply([],e):e},d.each=function(b,a){var d;if(u(b))for(d=0;d<b.length&&!1!==a.call(b[d],d,b[d]);d++);else for(d in b)if(!1===a.call(b[d],d,b[d]))break;return b},d.grep=function(b,a){return B.call(b,a)},window.JSON&&(d.parseJSON=JSON.parse),d.fn={forEach:w.forEach,reduce:w.reduce,push:w.push,sort:w.sort,
+indexOf:w.indexOf,concat:w.concat,map:function(b){return d(d.map(this,function(a,d){return b.call(a,d,a)}))},slice:function(){return d(x.apply(this,arguments))},ready:function(b){return P.test(m.readyState)?b(d):m.addEventListener("DOMContentLoaded",function(){b(d)},!1),this},get:function(b){return b===j?x.call(this):this[b]},toArray:function(){return this.get()},size:function(){return this.length},remove:function(){return this.each(function(){null!=this.parentNode&&this.parentNode.removeChild(this)})},
+each:function(b){return this.forEach(function(a,d){b.call(a,d,a)}),this},filter:function(b){return c(b)?this.not(this.not(b)):d(B.call(this,function(a){return q.matches(a,b)}))},add:function(b,a){return d(C(this.concat(d(b,a))))},is:function(b){return 0<this.length&&q.matches(this[0],b)},not:function(b){var a=[];if(c(b)&&b.call!==j)this.each(function(d){b.call(this,d)||a.push(this)});else{var e="string"==typeof b?this.filter(b):u(b)&&c(b.item)?x.call(b):d(b);this.forEach(function(b){0>e.indexOf(b)&&
+a.push(b)})}return d(a)},has:function(b){return this.filter(function(){return n(b)?d.contains(this,b):d(this).find(b).size()})},eq:function(b){return-1===b?this.slice(b):this.slice(b,+b+1)},first:function(){var b=this[0];return b&&!n(b)?b:d(b)},last:function(){var b=this[this.length-1];return b&&!n(b)?b:d(b)},find:function(b){var a;return 1==this.length?a=d(q.qsa(this[0],b)):a=this.map(function(){return q.qsa(this,b)}),a},closest:function(b,a){for(var c=this[0];c&&!q.matches(c,b);)c=c!==a&&c!==m&&
+c.parentNode;return d(c)},parents:function(b){for(var a=[],c=this;0<c.length;)c=d.map(c,function(b){if((b=b.parentNode)&&b!==m&&0>a.indexOf(b))return a.push(b),b});return l(a,b)},parent:function(b){return l(C(this.pluck("parentNode")),b)},children:function(b){return l(this.map(function(){return f(this)}),b)},contents:function(){return this.map(function(){return x.call(this.childNodes)})},siblings:function(b){return l(this.map(function(b,a){return B.call(f(a.parentNode),function(b){return b!==a})}),
+b)},empty:function(){return this.each(function(){this.innerHTML=""})},pluck:function(b){return d.map(this,function(a){return a[b]})},show:function(){return this.each(function(){"none"==this.style.display&&(this.style.display=null);if("none"==D(this,"").getPropertyValue("display")){var b=this.style,a;a=this.nodeName;var d,c;a=(h[a]||(d=m.createElement(a),m.body.appendChild(d),c=D(d,"").getPropertyValue("display"),d.parentNode.removeChild(d),"none"==c&&(c="block"),h[a]=c),h[a]);b.display=a}})},replaceWith:function(b){return this.before(b).remove()},
+wrap:function(b){var a=c(b);if(this[0]&&!a)var e=d(b).get(0),m=e.parentNode||1<this.length;return this.each(function(c){d(this).wrapAll(a?b.call(this,c):m?e.cloneNode(!0):e)})},wrapAll:function(b){if(this[0]){d(this[0]).before(b=d(b));for(var a;(a=b.children()).length;)b=a.first();d(b).append(this)}return this},wrapInner:function(b){var a=c(b);return this.each(function(c){var e=d(this),m=e.contents();c=a?b.call(this,c):b;m.length?m.wrapAll(c):e.append(c)})},unwrap:function(){return this.parent().each(function(){d(this).replaceWith(d(this).children())}),
+this},clone:function(){return this.map(function(){return this.cloneNode(!0)})},hide:function(){return this.css("display","none")},toggle:function(b){return this.each(function(){var a=d(this);(b===j?"none"==a.css("display"):b)?a.show():a.hide()})},prev:function(b){return d(this.pluck("previousElementSibling")).filter(b||"*")},next:function(b){return d(this.pluck("nextElementSibling")).filter(b||"*")},html:function(b){return b===j?0<this.length?this[0].innerHTML:null:this.each(function(a){var c=this.innerHTML;
+d(this).empty().append(k(this,b,a,c))})},text:function(b){return b===j?0<this.length?this[0].textContent:null:this.each(function(){this.textContent=b})},attr:function(b,a){var d;return"string"==typeof b&&a===j?0==this.length||1!==this[0].nodeType?j:"value"==b&&"INPUT"==this[0].nodeName?this.val():!(d=this[0].getAttribute(b))&&b in this[0]?this[0][b]:d:this.each(function(d){if(1===this.nodeType)if(n(b))for(p in b){d=p;var c=b[p];null==c?this.removeAttribute(d):this.setAttribute(d,c)}else d=k(this,
+a,d,this.getAttribute(b)),null==d?this.removeAttribute(b):this.setAttribute(b,d)})},removeAttr:function(b){return this.each(function(){1===this.nodeType&&this.removeAttribute(b)})},prop:function(b,a){return a===j?this[0]?this[0][b]:j:this.each(function(d){this[b]=k(this,a,d,this[b])})},data:function(b,d){var c=this.attr("data-"+a(b),d);return null!==c?z(c):j},val:function(b){return b===j?0<this.length?this[0].multiple?d(this[0]).find("option").filter(function(){return this.selected}).pluck("value"):
+this[0].value:j:this.each(function(a){this.value=k(this,b,a,this.value)})},offset:function(){if(0==this.length)return null;var b=this[0].getBoundingClientRect();return{left:b.left+window.pageXOffset,top:b.top+window.pageYOffset,width:b.width,height:b.height}},css:function(b,d){if(2>arguments.length&&"string"==typeof b)return 0==this.length?j:this[0].style[F(b)]||D(this[0],"").getPropertyValue(b);var c="";for(p in b)!b[p]&&0!==b[p]?this.each(function(){this.style.removeProperty(a(p))}):c+=a(p)+":"+
+("number"==typeof b[p]&&!G[a(p)]?b[p]+"px":b[p])+";";return"string"==typeof b&&(!d&&0!==d?this.each(function(){this.style.removeProperty(a(b))}):c=a(b)+":"+("number"==typeof d&&!G[a(b)]?d+"px":d)),this.each(function(){this.style.cssText+=";"+c})},index:function(b){return b?this.indexOf(d(b)[0]):this.parent().children().indexOf(this[0])},hasClass:function(b){return 1>this.length?!1:e(b).test(r(this[0]))},addClass:function(b){return this.each(function(a){v=[];var c=r(this);k(this,b,a,c).split(/\s+/g).forEach(function(b){d(this).hasClass(b)||
+v.push(b)},this);v.length&&r(this,c+(c?" ":"")+v.join(" "))})},removeClass:function(b){return this.each(function(a){if(b===j)return r(this,"");v=r(this);k(this,b,a,v).split(/\s+/g).forEach(function(b){v=v.replace(e(b)," ")});r(this,v.trim())})},toggleClass:function(b,a){return this.each(function(c){c=k(this,b,c,r(this));(a===j?!d(this).hasClass(c):a)?d(this).addClass(c):d(this).removeClass(c)})},scrollTop:function(){if(this.length)return"scrollTop"in this[0]?this[0].scrollTop:this[0].scrollY},position:function(){if(this.length){var b=
+this[0],a=this.offsetParent(),c=this.offset(),e=I.test(a[0].nodeName)?{top:0,left:0}:a.offset();return c.top-=parseFloat(d(b).css("margin-top"))||0,c.left-=parseFloat(d(b).css("margin-left"))||0,e.top+=parseFloat(d(a[0]).css("border-top-width"))||0,e.left+=parseFloat(d(a[0]).css("border-left-width"))||0,{top:c.top-e.top,left:c.left-e.left}}},offsetParent:function(){return this.map(function(){for(var b=this.offsetParent||m.body;b&&!I.test(b.nodeName)&&"static"==d(b).css("position");)b=b.offsetParent;
+return b})}},["width","height"].forEach(function(b){d.fn[b]=function(a){var c,e=b.replace(/./,function(b){return b[0].toUpperCase()});return a===j?this[0]==window?window["inner"+e]:this[0]==m?m.documentElement["offset"+e]:(c=this.offset())&&c[b]:this.each(function(c){var e=d(this);e.css(b,k(this,a,c,e[b]()))})}}),["after","prepend","before","append"].forEach(function(b,a){var c=a%2;d.fn[b]=function(){var b=d.map(arguments,function(b){return n(b)?b:q.fragment(b)}),e,m=1<this.length;return 1>b.length?
+this:this.each(function(h,f){e=c?f:f.parentNode;f=0==a?f.nextSibling:1==a?f.firstChild:2==a?f:null;b.forEach(function(b){if(m)b=b.cloneNode(!0);else if(!e)return d(b).remove();A(e.insertBefore(b,f),function(b){null!=b.nodeName&&"SCRIPT"===b.nodeName.toUpperCase()&&(!b.type||"text/javascript"===b.type)&&!b.src&&window.eval.call(window,b.innerHTML)})})})};d.fn[c?b+"To":"insert"+(a?"Before":"After")]=function(a){return d(a)[b](this),this}}),q.Z.prototype=d.fn,q.uniq=C,q.deserializeValue=z,d.zepto=q,
+d}();window.Zepto=Zepto;"$"in window||(window.$=Zepto);
+(function(c){function n(a){return a._zid||(a._zid=l++)}function s(a,c,e,f){c=t(c);if(c.ns)var k=RegExp("(?:^| )"+c.ns.replace(" "," .* ?")+"(?: |$)");return(g[n(a)]||[]).filter(function(a){return a&&(!c.e||a.e==c.e)&&(!c.ns||k.test(a.ns))&&(!e||n(a.fn)===n(e))&&(!f||a.sel==f)})}function t(a){a=(""+a).split(".");return{e:a[0],ns:a.slice(1).sort().join(" ")}}function u(a,e,f){c.isObject(a)?c.each(a,f):a.split(/\s/).forEach(function(a){f(a,e)})}function a(a,e,f,k,l,m){var h=n(a),y=g[h]||(g[h]=[]);u(e,
+f,function(e,f){var h=t(e);h.fn=f;h.sel=k;h.e in r&&(f=function(a){var d=a.relatedTarget;if(!d||d!==this&&!c.contains(this,d))return h.fn.apply(this,arguments)});h.del=l&&l(f,e);var v=h.del||f;h.proxy=function(c){var e=v.apply(a,[c].concat(c.data));return!1===e&&(c.preventDefault(),c.stopPropagation()),e};h.i=y.length;y.push(h);a.addEventListener(r[h.e]||h.e,h.proxy,h.del&&("focus"==h.e||"blur"==h.e)||!!m)})}function e(a,c,e,f,k){var m=n(a);u(c||"",e,function(c,e){s(a,c,e,f).forEach(function(c){delete g[m][c.i];
+a.removeEventListener(r[c.e]||c.e,c.proxy,c.del&&("focus"==c.e||"blur"==c.e)||!!k)})})}function f(a){var e,f={originalEvent:a};for(e in a)!j.test(e)&&void 0!==a[e]&&(f[e]=a[e]);return c.each(p,function(c,e){f[c]=function(){return this[e]=z,a[c].apply(a,arguments)};f[e]=A}),f}var g={},l=1,k={},r={mouseenter:"mouseover",mouseleave:"mouseout"};k.click=k.mousedown=k.mouseup=k.mousemove="MouseEvents";c.event={add:a,remove:e};c.proxy=function(a,e){if(c.isFunction(a)){var f=function(){return a.apply(e,arguments)};
+return f._zid=n(a),f}if("string"==typeof e)return c.proxy(a[e],a);throw new TypeError("expected function");};c.fn.bind=function(c,e){return this.each(function(){a(this,c,e)})};c.fn.unbind=function(a,c){return this.each(function(){e(this,a,c)})};c.fn.one=function(c,f){return this.each(function(g,k){a(this,c,f,null,function(a,c){return function(){var d=a.apply(k,arguments);return e(k,c,a),d}})})};var z=function(){return!0},A=function(){return!1},j=/^([A-Z]|layer[XY]$)/,p={preventDefault:"isDefaultPrevented",
+stopImmediatePropagation:"isImmediatePropagationStopped",stopPropagation:"isPropagationStopped"};c.fn.delegate=function(d,e,g){return this.each(function(k,l){a(l,e,g,d,function(a){return function(e){var y,g=c(e.target).closest(d,l).get(0);if(g)return y=c.extend(f(e),{currentTarget:g,liveFired:l}),a.apply(g,[y].concat([].slice.call(arguments,1)))}})})};c.fn.undelegate=function(a,c,f){return this.each(function(){e(this,c,f,a)})};c.fn.live=function(a,e){return c(document.body).delegate(this.selector,
+a,e),this};c.fn.die=function(a,e){return c(document.body).undelegate(this.selector,a,e),this};c.fn.on=function(a,e,f){return!e||c.isFunction(e)?this.bind(a,e||f):this.delegate(e,a,f)};c.fn.off=function(a,e,f){return!e||c.isFunction(e)?this.unbind(a,e||f):this.undelegate(e,a,f)};c.fn.trigger=function(a,e){if("string"==typeof a||c.isPlainObject(a))a=c.Event(a);var f=a;if(!("defaultPrevented"in f)){f.defaultPrevented=!1;var g=f.preventDefault;f.preventDefault=function(){this.defaultPrevented=!0;g.call(this)}}return a.data=
+e,this.each(function(){"dispatchEvent"in this&&this.dispatchEvent(a)})};c.fn.triggerHandler=function(a,e){var g,k;return this.each(function(l,m){g=f("string"==typeof a?c.Event(a):a);g.data=e;g.target=m;c.each(s(m,a.type||a),function(a,c){k=c.proxy(g);if(g.isImmediatePropagationStopped())return!1})}),k};"focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select keydown keypress keyup error".split(" ").forEach(function(a){c.fn[a]=
+function(c){return c?this.bind(a,c):this.trigger(a)}});["focus","blur"].forEach(function(a){c.fn[a]=function(c){return c?this.bind(a,c):this.each(function(){try{this[a]()}catch(c){}}),this}});c.Event=function(a,c){"string"!=typeof a&&(c=a,a=c.type);var e=document.createEvent(k[a]||"Events"),f=!0;if(c)for(var g in c)"bubbles"==g?f=!!c[g]:e[g]=c[g];return e.initEvent(a,f,!0,null,null,null,null,null,null,null,null,null,null,null,null),e.isDefaultPrevented=function(){return this.defaultPrevented},e}})(Zepto);
+(function(c){function n(a,e,d,f){if(a.global)return a=e||r,d=c.Event(d),c(a).trigger(d,f),!d.defaultPrevented}function s(a,c,e){var d=e.context;e.success.call(d,a,"success",c);n(e,d,"ajaxSuccess",[c,e,a]);u("success",c,e)}function t(a,c,e,d){var f=d.context;d.error.call(f,e,c,a);n(d,f,"ajaxError",[e,d,a]);u(c,e,d)}function u(a,e,d){var f=d.context;d.complete.call(f,e,a);n(d,f,"ajaxComplete",[e,d]);d.global&&!--c.active&&n(d,null,"ajaxStop")}function a(){}function e(a){return a&&(a==w?"html":a==v?
+"json":p.test(a)?"script":d.test(a)&&"xml")||"text"}function f(a){a.processData&&k(a.data)&&(a.data=c.param(a.data,a.traditional));a.data&&(!a.type||"GET"==a.type.toUpperCase())&&(a.url=(a.url+"&"+a.data).replace(/[&?]{1,2}/,"?"))}function g(a,e,d,f){var l=c.isArray(e);c.each(e,function(e,h){f&&(e=d?f:f+"["+(l?"":e)+"]");!f&&l?a.add(h.name,h.value):(d?c.isArray(h):k(h))?g(a,h,d,e):a.add(e,h)})}var l=0,k=c.isObject,r=window.document,z,A,j=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,p=/^(?:text|application)\/javascript/i,
+d=/^(?:text|application)\/xml/i,v="application/json",w="text/html",x=/^\s*$/;c.active=0;c.ajaxJSONP=function(e){if("type"in e){var d="jsonp"+ ++l,g=r.createElement("script"),k={abort:function(){c(g).remove();d in window&&(window[d]=a);u("abort",k,e)}},j;return e.error&&(g.onerror=function(){k.abort();e.error()}),window[d]=function(a){clearTimeout(j);c(g).remove();delete window[d];s(a,k,e)},f(e),g.src=e.url.replace(/=\?/,"="+d),c("head").append(g),0<e.timeout&&(j=setTimeout(function(){k.abort();u("timeout",
+k,e)},e.timeout)),k}return c.ajax(e)};c.ajaxSettings={type:"GET",beforeSend:a,success:a,error:a,complete:a,context:null,global:!0,xhr:function(){return new window.XMLHttpRequest},accepts:{script:"text/javascript, application/javascript",json:v,xml:"application/xml, text/xml",html:w,text:"text/plain"},crossDomain:!1,timeout:0,processData:!0};c.ajax=function(d){var h=c.extend({},d||{});for(z in c.ajaxSettings)void 0===h[z]&&(h[z]=c.ajaxSettings[z]);h.global&&0===c.active++&&n(h,null,"ajaxStart");h.crossDomain||
+(h.crossDomain=/^([\w-]+:)?\/\/([^\/]+)/.test(h.url)&&RegExp.$2!=window.location.host);var g=h.dataType;d=/=\?/.test(h.url);if("jsonp"==g||d)return d||(h.url=(h.url+"&callback=?").replace(/[&?]{1,2}/,"?")),c.ajaxJSONP(h);h.url||(h.url=window.location.toString());f(h);d=h.accepts[g];var k={},l=/^([\w-]+:)\/\//.test(h.url)?RegExp.$1:window.location.protocol,j=c.ajaxSettings.xhr(),r;h.crossDomain||(k["X-Requested-With"]="XMLHttpRequest");d&&(k.Accept=d,-1<d.indexOf(",")&&(d=d.split(",",2)[0]),j.overrideMimeType&&
+j.overrideMimeType(d));if(h.contentType||!1!==h.contentType&&h.data&&"GET"!=h.type.toUpperCase())k["Content-Type"]=h.contentType||"application/x-www-form-urlencoded";h.headers=c.extend(k,h.headers||{});j.onreadystatechange=function(){if(4==j.readyState){clearTimeout(r);var a,d=!1;if(200<=j.status&&300>j.status||304==j.status||0==j.status&&"file:"==l){g=g||e(j.getResponseHeader("content-type"));a=j.responseText;try{"script"==g?(0,eval)(a):"xml"==g?a=j.responseXML:"json"==g&&(a=x.test(a)?null:c.parseJSON(a))}catch(f){d=
+f}d?t(d,"parsererror",j,h):s(a,j,h)}else t(null,"error",j,h)}};j.open(h.type,h.url,"async"in h?h.async:!0);for(A in h.headers)j.setRequestHeader(A,h.headers[A]);d=h.context;!1===h.beforeSend.call(d,j,h)||!1===n(h,d,"ajaxBeforeSend",[j,h])?d=!1:(n(h,d,"ajaxSend",[j,h]),d=void 0);return!1===d?(j.abort(),!1):(0<h.timeout&&(r=setTimeout(function(){j.onreadystatechange=a;j.abort();t(null,"timeout",j,h)},h.timeout)),j.send(h.data?h.data:null),j)};c.get=function(a,e){return c.ajax({url:a,success:e})};c.post=
+function(a,e,d,f){return c.isFunction(e)&&(f=f||d,d=e,e=null),c.ajax({type:"POST",url:a,data:e,success:d,dataType:f})};c.getJSON=function(a,e){return c.ajax({url:a,success:e,dataType:"json"})};c.fn.load=function(a,e){if(!this.length)return this;var d=this,f=a.split(/\s/),g;return 1<f.length&&(a=f[0],g=f[1]),c.get(a,function(a){d.html(g?c("<div>").html(a.replace(j,"")).find(g):a);e&&e.apply(d,arguments)}),this};var B=encodeURIComponent;c.param=function(a,e){var c=[];return c.add=function(a,e){this.push(B(a)+
+"="+B(e))},g(c,a,e),c.join("&").replace(/%20/g,"+")}})(Zepto);
+(function(c){function n(f,g){var l=f[e],l=l&&t[l];if(void 0===g)return l||s(f);if(l){if(g in l)return l[g];var k=a(g);if(k in l)return l[k]}return u.call(c(f),g)}function s(f,g,l){var k=f[e]||(f[e]=++c.uuid),r;if(!(r=t[k])){r=t;var n={};f=(c.each(f.attributes,function(e,f){0==f.name.indexOf("data-")&&(n[a(f.name.replace("data-",""))]=c.zepto.deserializeValue(f.value))}),n);r=r[k]=f}k=r;return void 0!==g&&(k[a(g)]=l),k}var t={},u=c.fn.data,a=c.camelCase,e=c.expando="Zepto"+ +new Date;c.fn.data=function(a,
+e){return void 0===e?c.isPlainObject(a)?this.each(function(e,g){c.each(a,function(a,e){s(g,a,e)})}):0==this.length?void 0:n(this[0],a):this.each(function(){s(this,a,e)})};c.fn.removeData=function(f){return"string"==typeof f&&(f=f.split(/\s+/)),this.each(function(){var g=this[e],l=g&&t[g];l&&c.each(f,function(){delete l[a(this)]})})}})(Zepto);!function(c){var n=function(a){this.messages={defaultMessage:"This value seems to be invalid.",type:{email:"This value should be a valid email.",url:"This value should be a valid url.",urlstrict:"This value should be a valid url.",number:"This value should be a valid number.",digits:"This value should be digits.",dateIso:"This value should be a valid date (YYYY-MM-DD).",alphanum:"This value should be alphanumeric."},notnull:"This value should not be null.",notblank:"This value should not be blank.",
+required:"This value is required.",regexp:"This value seems to be invalid.",min:"This value should be greater than %s.",max:"This value should be lower than %s.",range:"This value should be between %s and %s.",minlength:"This value is too short. It should have %s characters or more.",maxlength:"This value is too long. It should have %s characters or less.",rangelength:"This value length is invalid. It should be between %s and %s characters long.",mincheck:"You must select at least %s choices.",maxcheck:"You must select %s choices or less.",
+rangecheck:"You must select between %s and %s choices.",equalto:"This value should be the same."};this.init(a)};n.prototype={constructor:n,validators:{notnull:function(a){return 0<a.length},notblank:function(a){return null!==a&&""!==a.replace(/^\s+/g,"").replace(/\s+$/g,"")},required:function(a){if("object"===typeof a){for(var e in a)if(this.required(a[e]))return!0;return!1}return this.notnull(a)&&this.notblank(a)},type:function(a,e){var c;switch(e){case "number":c=/^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/;
+break;case "digits":c=/^\d+$/;break;case "alphanum":c=/^\w+$/;break;case "email":c=/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i;
+break;case "url":a=/(https?|s?ftp|git)/i.test(a)?a:"http://"+a;case "urlstrict":c=/^(https?|s?ftp|git):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i;
+break;case "dateIso":c=/^(\d{4})\D?(0[1-9]|1[0-2])\D?([12]\d|0[1-9]|3[01])$/;break;default:return!1}return""!==a?c.test(a):!1},regexp:function(a,e){return RegExp(e,"i").test(a)},minlength:function(a,e){return a.length>=e},maxlength:function(a,e){return a.length<=e},rangelength:function(a,e){return this.minlength(a,e[0])&&this.maxlength(a,e[1])},min:function(a,e){return new Number(a)>=e},max:function(a,e){return new Number(a)<=e},range:function(a,e){return a>=e[0]&&a<=e[1]},equalto:function(a,e){return a===
+c(e).val()},remote:function(a,e,f){var g={},l={};g[f.$element.attr("name")]=a;"undefined"!==typeof f.options.remoteDatatype&&(l={dataType:f.options.remoteDatatype});var k=function(a){f.updateConstraint("remote","isValid",a);f.manageValidationResult()};c.ajax(c.extend({},{url:e,data:g,async:f.async,method:f.options.remoteMethod||"GET",success:function(a){k("1"===a||"true"==a||"object"===typeof a&&"undefined"!==typeof a.success||/success/i.test(a))},error:function(){k(!1)}},l));f.async&&k(null);return null},
+mincheck:function(a,e){return this.minlength(a,e)},maxcheck:function(a,e){return this.maxlength(a,e)},rangecheck:function(a,e){return this.rangelength(a,e)}},init:function(a){var e=a.validators;a=a.messages;for(var c in e)this.addValidator(c,e[c]);for(c in a)this.addMessage(c,a[c])},formatMesssage:function(a,c){if("object"===typeof c){for(var f in c)a=this.formatMesssage(a,c[f]);return a}return a.replace(/%s/i,c)},addValidator:function(a,c){this.validators[a]=c},addMessage:function(a,c,f){if("undefined"!==
+typeof f&&!0===f)this.messages.type[a]=c;else if("type"===a)for(var g in c)this.messages.type[g]=c[g];else this.messages[a]=c}};var s=function(a,c,f){this.options=c;this.Validator=new n(c);this.init(a,f||"ParsleyField")};s.prototype={constructor:s,init:function(a,e){this.type=e;this.isValid=!0;this.element=a;this.validatedOnce=!1;this.$element=c(a);this.val=this.$element.val();this.isRequired=!1;this.constraints=[];"undefined"===typeof this.isRadioOrCheckbox&&(this.isRadioOrCheckbox=!1,this.hash=
+this.generateHash(),this.errorClassHandler=this.options.errors.classHandler(a)||this.$element);this.ulErrorManagement();this.bindHtml5Constraints();this.addConstraints();this.constraints.length&&this.bindValidationEvents()},bindHtml5Constraints:function(){if(this.$element.hasClass("required")||this.$element.attr("required"))this.options.required=!0;"undefined"!==typeof this.$element.attr("type")&&RegExp(this.$element.attr("type"),"i").test("email url number range")&&(this.options.type=this.$element.attr("type"),
+RegExp(this.options.type,"i").test("number range")&&(this.options.type="number","undefined"!==typeof this.$element.attr("min")&&this.$element.attr("min").length&&(this.options.min=this.$element.attr("min")),"undefined"!==typeof this.$element.attr("max")&&this.$element.attr("max").length&&(this.options.max=this.$element.attr("max"))))},addConstraints:function(){for(var a in this.options)a=a.toLowerCase(),"function"===typeof this.Validator.validators[a]&&(this.constraints.push({name:a,requirements:this.options[a],
+isValid:null}),"required"===a&&(this.isRequired=!0),this.addCustomConstraintMessage(a))},addCustomConstraintMessage:function(a){var c=a+("type"===a?this.options[a].charAt(0).toUpperCase()+this.options[a].substr(1):"")+"Message";"undefined"!==typeof this.options[c]&&this.Validator.addMessage("type"===a?this.options[a]:a,this.options[c],"type"===a)},bindValidationEvents:function(){this.$element.addClass("parsley-validated");var a=this.options.trigger+(/key/i.test(this.options.trigger)?"":" keyup");
+this.options.remote&&(a+=/change/i.test(a)?"":" change");if(a)this.$element.on((a+" ").split(" ").join("."+this.type+" "),!1,c.proxy(this.eventValidation,this))},generateHash:function(){return"parsley-"+(Math.random()+"").substring(2)},getHash:function(){return this.hash},getVal:function(){return this.$element.val()},eventValidation:function(a){var c=this.getVal();if("keyup"===a.type&&!/keyup/i.test(this.options.trigger)&&!this.validatedOnce||c.length<this.options.validationMinlength&&!this.validatedOnce)return!0;
+this.validate(!0,!1)},isFieldValid:function(){return this.validate(!1,!1)},validate:function(a,c){var f=this.getVal(),g=null;if(this.options.listeners.onFieldValidate(this.element,this)||""===f&&!this.isRequired)return this.reset(),null;if(!this.needsValidation(f))return this.isValid;this.errorBubbling="undefined"!==typeof a?a:!0;this.async="undefined"!==typeof c?c:!0;g=this.applyValidators();this.errorBubbling&&this.manageValidationResult();return g},needsValidation:function(a){if(null!==this.isValid&&
+this.val===a&&this.validatedOnce)return!1;this.val=a;return this.validatedOnce=!0},applyValidators:function(){var a=null,c;for(c in this.constraints){var f=this.Validator.validators[this.constraints[c].name](this.val,this.constraints[c].requirements,this);!1===f?(a=!1,this.constraints[c].isValid=a):!0===f&&(this.constraints[c].isValid=!0,a=!1!==a)}return a},updateConstraint:function(a,c,f){for(var g in this.constraints)if(this.constraints[g].name===a){this.constraints[g][c]=f;break}},manageValidationResult:function(){var a=
+null,c;for(c in this.constraints)!1===this.constraints[c].isValid?(this.addError(this.constraints[c]),a=!1):!0===this.constraints[c].isValid&&(this.removeError(this.constraints[c].name),a=!1!==a);this.isValid=a;return!0===this.isValid?(this.removeErrors(),this.errorClassHandler.removeClass(this.options.errorClass).addClass(this.options.successClass),this.options.listeners.onFieldSuccess(this.element,this.constraints,this),!0):!1===this.isValid?(this.errorClassHandler.removeClass(this.options.successClass).addClass(this.options.errorClass),
+this.options.listeners.onFieldError(this.element,this.constraints,this),!1):a},ulErrorManagement:function(){this.ulError="#"+this.hash;this.ulTemplate=c(this.options.errors.errorsWrapper).attr("id",this.hash).addClass("parsley-error-list")},removeError:function(a){a=this.ulError+" ."+a;this.ulError&&(c(a).remove()&&0===c(this.ulError).children().length)&&c(this.ulError).remove()},removeErrors:function(){c(this.ulError).remove()},reset:function(){this.isValid=null;this.removeErrors();this.errorClassHandler.removeClass(this.options.successClass).removeClass(this.options.errorClass);
+return this},addError:function(a){c(this.ulError).length||this.options.errors.container(this.element,this.ulTemplate,this.isRadioOrCheckbox)||(!this.isRadioOrCheckbox?this.$element.after(this.ulTemplate):this.$element.parent().after(this.ulTemplate));var e=a.name,f=!1!==this.options.errorMessage?"custom-error-message":e,g=this.ulError+" ."+f,f=c(this.options.errors.errorElem).addClass(f);a=!1!==this.options.errorMessage?this.options.errorMessage:"type"===a.name?this.Validator.messages[e][a.requirements]:
+"undefined"===typeof this.Validator.messages[e]?this.Validator.messages.defaultMessage:this.Validator.formatMesssage(this.Validator.messages[e],a.requirements);c(g).length||c(this.ulError).append(c(f).text(a))},addListener:function(a){for(var c in a)this.options.listeners[c]=a[c]},destroy:function(){this.$element.removeClass("parsley-validated");this.reset().$element.off("."+this.type).removeData(this.type)}};var t=function(a,c){this.initMultiple(a,c);this.inherit(a,c);this.init(a,c)};t.prototype=
+{constructor:t,initMultiple:function(a,e){this.element=a;this.$element=c(a);this.hash=this.getName();this.isRadioOrCheckbox=!0;this.isRadio=this.$element.is("input[type=radio]");this.isCheckbox=this.$element.is("input[type=checkbox]");this.siblings='input[name="'+this.$element.attr("name")+'"]';this.$siblings=c(this.siblings);this.errorClassHandler=e.errors.classHandler(a)||this.$element.parent()},inherit:function(a,c){var f=new s(a,c),g;for(g in f)"undefined"===typeof this[g]&&(this[g]=f[g])},getName:function(){return"parsley-"+
+this.$element.attr("name").replace(/(:|\.|\[|\])/g,"")},getVal:function(){if(this.isRadio)return c(this.siblings+":checked").val()||"";if(this.isCheckbox){var a=[];c(this.siblings+":checked").each(function(){a.push(c(this).val())});return a}}};var u=function(a,c){this.init("parsleyForm",a,c)};u.prototype={constructor:u,init:function(a,e,f){this.type=a;this.items=[];this.$element=c(e);this.options=f;var g=this,l;this.$element.find(f.inputs).each(function(){l=c(this).parsley(f);null!==l&&g.items.push(l)});
+this.$element.on("submit."+this.type,!1,c.proxy(this.validate,this))},addListener:function(a){for(var c in a)if(/Field/.test(c))for(var f in this.items)this.items[f].addListener(a);else this.options.listeners[c]=a[c]},validate:function(a){var c=!0;this.focusedField=!1;for(var f in this.items)if(!1===this.items[f].validate()&&(c=!1,!this.focusedField&&"first"===this.options.focus||"last"===this.options.focus))this.focusedField=this.items[f].$element;this.focusedField&&!c&&this.focusedField.focus();
+this.options.listeners.onFormSubmit(c,a,this);return c},removeErrors:function(){for(var a in this.items)this.items[a].parsley("reset")},destroy:function(){for(var a in this.items)this.items[a].destroy();this.$element.off("."+this.type).removeData(this.type)}};c.fn.parsley=function(a,e){function f(f,l){var n=c(f).data(l);if(!n){switch(l){case "parsleyForm":n=new u(f,g);break;case "parsleyField":n=new s(f,g);break;case "parsleyFieldMultiple":n=new t(f,g);break;default:return}c(f).data(l,n)}return"string"===
+typeof a&&"function"===typeof n[a]?n[a](e):n}var g=c.extend(!0,{},c.fn.parsley.defaults,"undefined"!==typeof window.ParsleyConfig?ParsleyConfig:{},a,this.data()),l=null;c(this).is("form")?l=f(c(this),"parsleyForm"):c(this).is(g.inputs)&&!c(this).is(g.excluded)&&(l=f(c(this),!c(this).is("input[type=radio], input[type=checkbox]")?"parsleyField":"parsleyFieldMultiple"));return"function"===typeof e?e():l};c.fn.parsley.Constructor=u;c.fn.parsley.defaults={inputs:"input, textarea, select",excluded:"input[type=hidden]",
+trigger:!1,focus:"first",validationMinlength:3,successClass:"parsley-success",errorClass:"parsley-error",errorMessage:!1,validators:{},messages:{},errors:{classHandler:function(){},container:function(){},errorsWrapper:"<ul></ul>",errorElem:"<li></li>"},listeners:{onFieldValidate:function(){return!1},onFormSubmit:function(){},onFieldError:function(){},onFieldSuccess:function(){}}};c(window).on("load",function(){c('[data-validate="parsley"]').each(function(){c(this).parsley()})})}(window.jQuery||window.Zepto);
View
4 javascript/parsley/parsley.extend.min.js
@@ -0,0 +1,4 @@
+/* Parsley dist/parsley.extend.min.js build version 1.1.8 http://parsleyjs.org */
+window.ParsleyConfig=window.ParsleyConfig||{};
+(function(c){window.ParsleyConfig=c.extend(!0,{},window.ParsleyConfig,{validators:{minwords:function(a,b){a=a.replace(/(^\s*)|(\s*$)/gi,"");a=a.replace(/[ ]{2,}/gi," ");a=a.replace(/\n /,"\n");a=a.split(" ").length;return a>=b},maxwords:function(a,b){a=a.replace(/(^\s*)|(\s*$)/gi,"");a=a.replace(/[ ]{2,}/gi," ");a=a.replace(/\n /,"\n");a=a.split(" ").length;return a<=b},rangewords:function(a,b){a=a.replace(/(^\s*)|(\s*$)/gi,"");a=a.replace(/[ ]{2,}/gi," ");a=a.replace(/\n /,"\n");a=a.split(" ").length;
+return a>=b[0]&&a<=b[1]},greaterthan:function(a,b){return new Number(a)>new Number(c(b).val())},lessthan:function(a,b){return new Number(a)<new Number(c(b).val())}},messages:{minwords:"This value should have %s words at least.",maxwords:"This value should have %s words maximum.",rangewords:"This value should have between %s and %s words.",greaterthan:"This value should be greater than %s.",lessthan:"This value should be less than %s."}})})(window.jQuery||window.Zepto);
View
26 javascript/parsley/parsley.min.js
@@ -0,0 +1,26 @@
+/* Parsley dist/parsley.min.js build version 1.1.8 http://parsleyjs.org */
+!function(d){var k=function(a){this.messages={defaultMessage:"This value seems to be invalid.",type:{email:"This value should be a valid email.",url:"This value should be a valid url.",urlstrict:"This value should be a valid url.",number:"This value should be a valid number.",digits:"This value should be digits.",dateIso:"This value should be a valid date (YYYY-MM-DD).",alphanum:"This value should be alphanumeric."},notnull:"This value should not be null.",notblank:"This value should not be blank.",
+required:"This value is required.",regexp:"This value seems to be invalid.",min:"This value should be greater than %s.",max:"This value should be lower than %s.",range:"This value should be between %s and %s.",minlength:"This value is too short. It should have %s characters or more.",maxlength:"This value is too long. It should have %s characters or less.",rangelength:"This value length is invalid. It should be between %s and %s characters long.",mincheck:"You must select at least %s choices.",maxcheck:"You must select %s choices or less.",
+rangecheck:"You must select between %s and %s choices.",equalto:"This value should be the same."};this.init(a)};k.prototype={constructor:k,validators:{notnull:function(a){return 0<a.length},notblank:function(a){return null!==a&&""!==a.replace(/^\s+/g,"").replace(/\s+$/g,"")},required:function(a){if("object"===typeof a){for(var b in a)if(this.required(a[b]))return!0;return!1}return this.notnull(a)&&this.notblank(a)},type:function(a,b){var c;switch(b){case "number":c=/^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/;
+break;case "digits":c=/^\d+$/;break;case "alphanum":c=/^\w+$/;break;case "email":c=/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i;
+break;case "url":a=/(https?|s?ftp|git)/i.test(a)?a:"http://"+a;case "urlstrict":c=/^(https?|s?ftp|git):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i;
+break;case "dateIso":c=/^(\d{4})\D?(0[1-9]|1[0-2])\D?([12]\d|0[1-9]|3[01])$/;break;default:return!1}return""!==a?c.test(a):!1},regexp:function(a,b){return RegExp(b,"i").test(a)},minlength:function(a,b){return a.length>=b},maxlength:function(a,b){return a.length<=b},rangelength:function(a,b){return this.minlength(a,b[0])&&this.maxlength(a,b[1])},min:function(a,b){return new Number(a)>=b},max:function(a,b){return new Number(a)<=b},range:function(a,b){return a>=b[0]&&a<=b[1]},equalto:function(a,b){return a===
+d(b).val()},remote:function(a,b,c){var f={},e={};f[c.$element.attr("name")]=a;"undefined"!==typeof c.options.remoteDatatype&&(e={dataType:c.options.remoteDatatype});var l=function(a){c.updateConstraint("remote","isValid",a);c.manageValidationResult()};d.ajax(d.extend({},{url:b,data:f,async:c.async,method:c.options.remoteMethod||"GET",success:function(a){l("1"===a||"true"==a||"object"===typeof a&&"undefined"!==typeof a.success||/success/i.test(a))},error:function(){l(!1)}},e));c.async&&l(null);return null},
+mincheck:function(a,b){return this.minlength(a,b)},maxcheck:function(a,b){return this.maxlength(a,b)},rangecheck:function(a,b){return this.rangelength(a,b)}},init:function(a){var b=a.validators;a=a.messages;for(var c in b)this.addValidator(c,b[c]);for(c in a)this.addMessage(c,a[c])},formatMesssage:function(a,b){if("object"===typeof b){for(var c in b)a=this.formatMesssage(a,b[c]);return a}return a.replace(/%s/i,b)},addValidator:function(a,b){this.validators[a]=b},addMessage:function(a,b,c){if("undefined"!==
+typeof c&&!0===c)this.messages.type[a]=b;else if("type"===a)for(var d in b)this.messages.type[d]=b[d];else this.messages[a]=b}};var h=function(a,b,c){this.options=b;this.Validator=new k(b);this.init(a,c||"ParsleyField")};h.prototype={constructor:h,init:function(a,b){this.type=b;this.isValid=!0;this.element=a;this.validatedOnce=!1;this.$element=d(a);this.val=this.$element.val();this.isRequired=!1;this.constraints=[];"undefined"===typeof this.isRadioOrCheckbox&&(this.isRadioOrCheckbox=!1,this.hash=
+this.generateHash(),this.errorClassHandler=this.options.errors.classHandler(a)||this.$element);this.ulErrorManagement();this.bindHtml5Constraints();this.addConstraints();this.constraints.length&&this.bindValidationEvents()},bindHtml5Constraints:function(){if(this.$element.hasClass("required")||this.$element.attr("required"))this.options.required=!0;"undefined"!==typeof this.$element.attr("type")&&RegExp(this.$element.attr("type"),"i").test("email url number range")&&(this.options.type=this.$element.attr("type"),
+RegExp(this.options.type,"i").test("number range")&&(this.options.type="number","undefined"!==typeof this.$element.attr("min")&&this.$element.attr("min").length&&(this.options.min=this.$element.attr("min")),"undefined"!==typeof this.$element.attr("max")&&this.$element.attr("max").length&&(this.options.max=this.$element.attr("max"))))},addConstraints:function(){for(var a in this.options)a=a.toLowerCase(),"function"===typeof this.Validator.validators[a]&&(this.constraints.push({name:a,requirements:this.options[a],
+isValid:null}),"required"===a&&(this.isRequired=!0),this.addCustomConstraintMessage(a))},addCustomConstraintMessage:function(a){var b=a+("type"===a?this.options[a].charAt(0).toUpperCase()+this.options[a].substr(1):"")+"Message";"undefined"!==typeof this.options[b]&&this.Validator.addMessage("type"===a?this.options[a]:a,this.options[b],"type"===a)},bindValidationEvents:function(){this.$element.addClass("parsley-validated");var a=this.options.trigger+(/key/i.test(this.options.trigger)?"":" keyup");
+this.options.remote&&(a+=/change/i.test(a)?"":" change");if(a)this.$element.on((a+" ").split(" ").join("."+this.type+" "),!1,d.proxy(this.eventValidation,this))},generateHash:function(){return"parsley-"+(Math.random()+"").substring(2)},getHash:function(){return this.hash},getVal:function(){return this.$element.val()},eventValidation:function(a){var b=this.getVal();if("keyup"===a.type&&!/keyup/i.test(this.options.trigger)&&!this.validatedOnce||b.length<this.options.validationMinlength&&!this.validatedOnce)return!0;
+this.validate(!0,!1)},isFieldValid:function(){return this.validate(!1,!1)},validate:function(a,b){var c=this.getVal(),d=null;if(this.options.listeners.onFieldValidate(this.element,this)||""===c&&!this.isRequired)return this.reset(),null;if(!this.needsValidation(c))return this.isValid;this.errorBubbling="undefined"!==typeof a?a:!0;this.async="undefined"!==typeof b?b:!0;d=this.applyValidators();this.errorBubbling&&this.manageValidationResult();return d},needsValidation:function(a){if(null!==this.isValid&&
+this.val===a&&this.validatedOnce)return!1;this.val=a;return this.validatedOnce=!0},applyValidators:function(){var a=null,b;for(b in this.constraints){var c=this.Validator.validators[this.constraints[b].name](this.val,this.constraints[b].requirements,this);!1===c?(a=!1,this.constraints[b].isValid=a):!0===c&&(this.constraints[b].isValid=!0,a=!1!==a)}return a},updateConstraint:function(a,b,c){for(var d in this.constraints)if(this.constraints[d].name===a){this.constraints[d][b]=c;break}},manageValidationResult:function(){var a=
+null,b;for(b in this.constraints)!1===this.constraints[b].isValid?(this.addError(this.constraints[b]),a=!1):!0===this.constraints[b].isValid&&(this.removeError(this.constraints[b].name),a=!1!==a);this.isValid=a;return!0===this.isValid?(this.removeErrors(),this.errorClassHandler.removeClass(this.options.errorClass).addClass(this.options.successClass),this.options.listeners.onFieldSuccess(this.element,this.constraints,this),!0):!1===this.isValid?(this.errorClassHandler.removeClass(this.options.successClass).addClass(this.options.errorClass),
+this.options.listeners.onFieldError(this.element,this.constraints,this),!1):a},ulErrorManagement:function(){this.ulError="#"+this.hash;this.ulTemplate=d(this.options.errors.errorsWrapper).attr("id",this.hash).addClass("parsley-error-list")},removeError:function(a){a=this.ulError+" ."+a;this.ulError&&(d(a).remove()&&0===d(this.ulError).children().length)&&d(this.ulError).remove()},removeErrors:function(){d(this.ulError).remove()},reset:function(){this.isValid=null;this.removeErrors();this.errorClassHandler.removeClass(this.options.successClass).removeClass(this.options.errorClass);
+return this},addError:function(a){d(this.ulError).length||this.options.errors.container(this.element,this.ulTemplate,this.isRadioOrCheckbox)||(!this.isRadioOrCheckbox?this.$element.after(this.ulTemplate):this.$element.parent().after(this.ulTemplate));var b=a.name,c=!1!==this.options.errorMessage?"custom-error-message":b,f=this.ulError+" ."+c,c=d(this.options.errors.errorElem).addClass(c);a=!1!==this.options.errorMessage?this.options.errorMessage:"type"===a.name?this.Validator.messages[b][a.requirements]:
+"undefined"===typeof this.Validator.messages[b]?this.Validator.messages.defaultMessage:this.Validator.formatMesssage(this.Validator.messages[b],a.requirements);d(f).length||d(this.ulError).append(d(c).text(a))},addListener:function(a){for(var b in a)this.options.listeners[b]=a[b]},destroy:function(){this.$element.removeClass("parsley-validated");this.reset().$element.off("."+this.type).removeData(this.type)}};var m=function(a,b){this.initMultiple(a,b);this.inherit(a,b);this.init(a,b)};m.prototype=
+{constructor:m,initMultiple:function(a,b){this.element=a;this.$element=d(a);this.hash=this.getName();this.isRadioOrCheckbox=!0;this.isRadio=this.$element.is("input[type=radio]");this.isCheckbox=this.$element.is("input[type=checkbox]");this.siblings='input[name="'+this.$element.attr("name")+'"]';this.$siblings=d(this.siblings);this.errorClassHandler=b.errors.classHandler(a)||this.$element.parent()},inherit:function(a,b){var c=new h(a,b),d;for(d in c)"undefined"===typeof this[d]&&(this[d]=c[d])},getName:function(){return"parsley-"+
+this.$element.attr("name").replace(/(:|\.|\[|\])/g,"")},getVal:function(){if(this.isRadio)return d(this.siblings+":checked").val()||"";if(this.isCheckbox){var a=[];d(this.siblings+":checked").each(function(){a.push(d(this).val())});return a}}};var j=function(a,b){this.init("parsleyForm",a,b)};j.prototype={constructor:j,init:function(a,b,c){this.type=a;this.items=[];this.$element=d(b);this.options=c;var f=this,e;this.$element.find(c.inputs).each(function(){e=d(this).parsley(c);null!==e&&f.items.push(e)});
+this.$element.on("submit."+this.type,!1,d.proxy(this.validate,this))},addListener:function(a){for(var b in a)if(/Field/.test(b))for(var c in this.items)this.items[c].addListener(a);else this.options.listeners[b]=a[b]},validate:function(a){var b=!0;this.focusedField=!1;for(var c in this.items)if(!1===this.items[c].validate()&&(b=!1,!this.focusedField&&"first"===this.options.focus||"last"===this.options.focus))this.focusedField=this.items[c].$element;this.focusedField&&!b&&this.focusedField.focus();
+this.options.listeners.onFormSubmit(b,a,this);return b},removeErrors:function(){for(var a in this.items)this.items[a].parsley("reset")},destroy:function(){for(var a in this.items)this.items[a].destroy();this.$element.off("."+this.type).removeData(this.type)}};d.fn.parsley=function(a,b){function c(c,e){var g=d(c).data(e);if(!g){switch(e){case "parsleyForm":g=new j(c,f);break;case "parsleyField":g=new h(c,f);break;case "parsleyFieldMultiple":g=new m(c,f);break;default:return}d(c).data(e,g)}return"string"===
+typeof a&&"function"===typeof g[a]?g[a](b):g}var f=d.extend(!0,{},d.fn.parsley.defaults,"undefined"!==typeof window.ParsleyConfig?ParsleyConfig:{},a,this.data()),e=null;d(this).is("form")?e=c(d(this),"parsleyForm"):d(this).is(f.inputs)&&!d(this).is(f.excluded)&&(e=c(d(this),!d(this).is("input[type=radio], input[type=checkbox]")?"parsleyField":"parsleyFieldMultiple"));return"function"===typeof b?b():e};d.fn.parsley.Constructor=j;d.fn.parsley.defaults={inputs:"input, textarea, select",excluded:"input[type=hidden]",
+trigger:!1,focus:"first",validationMinlength:3,successClass:"parsley-success",errorClass:"parsley-error",errorMessage:!1,validators:{},messages:{},errors:{classHandler:function(){},container:function(){},errorsWrapper:"<ul></ul>",errorElem:"<li></li>"},listeners:{onFieldValidate:function(){return!1},onFormSubmit:function(){},onFieldError:function(){},onFieldSuccess:function(){}}};d(window).on("load",function(){d('[data-validate="parsley"]').each(function(){d(this).parsley()})})}(window.jQuery||window.Zepto);
View
0 templates/FoundationCheckboxField_holder.ss → ...s/forms/FoundationCheckboxField_holder.ss
File renamed without changes.
View
0 templates/FoundationFieldHolder.ss → templates/forms/FoundationFieldHolder.ss
File renamed without changes.
View
7 templates/forms/FoundationFieldHolderMinimal.ss
@@ -0,0 +1,7 @@
+<div id="$Name" class="field <% if extraClass %> $extraClass<% end_if %>">
+ <% if Title %><label for="$ID">$Title</label><% end_if %>
+ $Field
+ <% if RightTitle %><label class="right" for="$ID">$RightTitle</label><% end_if %>
+ <% if Message %><span class="message $MessageType">$Message</span><% end_if %>
+ <% if Description %><span class="description">$Description</span><% end_if %>
+</div>
View
0 templates/FoundationForm.ss → templates/forms/FoundationForm.ss
File renamed without changes.
View
0 templates/FoundationFormAction.ss → templates/forms/FoundationFormAction.ss
File renamed without changes.

0 comments on commit fecffca

Please sign in to comment.