1 line
11 KiB
JavaScript
1 line
11 KiB
JavaScript
var Form,Input,InputError,FormRuleAction,FormRuleCommand,FormRuleOperator;!function(t){var i;t.fn.FORM=function(e){var n;return i[e]?i[e].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof e&&e?(void 0===(n=t(this).data("form"))&&(n=new Form(this)),void 0!==n[e]?n[e].apply(n,Array.prototype.slice.call(arguments,1)):t.error("Метод с именем "+e+" не существует для jQuery.FORM")):i.init.apply(this,arguments)},i={init:function(i={}){var e;return 1===t(this).length?new Form(this,i):(e=[],t(this).each(function(){return e.push(new Form(this,i))}),e)},setPrepareValidate:function(t){return Form.globalPrepareValidate=t},setGlobalGood:function(t){return Form.globalGood=t},setGlobalBad:function(t){return Form.globalBad=t},setGlobalJSON:function(t){return Form.globalJSON=t},setGlobalOptions:function(t){return Form.globalOptions=t}}}(jQuery),Form=function(){class Form{constructor(t,i){this.container=t,this.init_data=i,this.container=$(this.container),this.isInited()||(this.container.on("destroyed",this.destroy.bind(this)),this.init(this.init_data))}init(t={}){var i,e;return this.container.data("form_inited",!0),this.container.data("form",this),null==this.inputActionWithParent&&(this.inputActionWithParent=null!=(i=t.inputActionWithParent)?i:null!=(e=Form.globalOptions.inputActionWithParent)&&e),this.initInputs(null!=t?t.inputs:void 0),this.checkRules(),this.initActions()}isInited(){return!0===this.container.data("form_inited")}destroy(){var t,i,e,n,r;for(r=[],i=0,e=(n=this.getInputs()).length;i<e;i++)t=n[i],r.push(t.form=null);return r}initActions(){var t,i,e,n,r,s;for(s=[],n=0,r=(i=this.getInputs()).length;n<r;n++)null!==(t=i[n]).rules&&s.push(function(){var i,n,r,s;for(s=[],i=0,n=(r=t.rules).length;i<n;i++)switch((e=r[i])[1]){case FormRuleCommand.ON:switch(e[2]){case FormRuleOperator.CHANGE:switch(e[3]){case FormRuleAction.FUNCTION:s.push(this.initActionOnChange(t,e));break;default:s.push(void 0)}break;default:s.push(void 0)}break;default:s.push(void 0)}return s}.call(this));return s}initActionOnChange($i,i){var n,name;return n=this.getInputByName(i[0]),name="function"+(new Date).getTime(),eval("Form['"+name+"']="+i[4]),console.log("$I",$i),n.$wrap.on("input:change",function(){return Form[name]($i,n.value())}),n.$wrap.on("destroyed",function(){if(null!=Form[name])return delete Form[name]})}validate(t={}){var i,e,n,r,s,a,u;for(u={bad:{},good:{},success:!0},e=0,n=(a=this.getInputs()).length;e<n;e++)s=(i=a[e]).validate(),r={input:i,result:s},void 0!==t.prepare?"function"==typeof t.prepare&&t.prepare(i,s):Form.globalPrepareValidate(i,s),s.errors.length>0?(u.bad[i.getName()]=r,u.success=!1,void 0!==t.bad?"function"==typeof t.bad&&t.bad(i,s):Form.globalBad(i,s)):(u.good[i.getName()]=r,void 0!==t.good?"function"==typeof t.good&&t.good(i,s):Form.globalGood(i,s));return u.success?"function"==typeof t.success&&t.success(u):"function"==typeof t.fail&&t.fail(u),u}getInputs(t={}){var i;return i=[],$("[data-input]",this.container).each(function(){var e;return e=Input.init($(this)),null!=(null!=t?t[e.getName()]:void 0)&&e.initData(t[e.getName()]),i.push(e)}),i}json(){var t,i,e,n,r,s;if(null!=Form.globalJSON)s=Form.globalJSON(this.container);else for(s={},i=0,e=(r=this.getInputs()).length;i<e;i++)n=(t=r[i]).getName(),t.isCheckbox?void 0===s[n]?s[n]=t.value():Array.isArray(s[n])?s[n].push(t.value()):s[n]=[s[n],t.value()]:t.isRadio?t.checked()&&(s[n]=t.value()):s[n]=t.value();return s}initInputs(t={}){var i,e,n,r,s;for(s=[],e=0,n=(r=this.getInputs(t)).length;e<n;e++)(i=r[e]).$wrap.on("input:change",this.checkRules.bind(this)),i.$wrap.on("input:show",this.recheckRules.bind(this)),i.$wrap.on("input:hide",this.recheckRules.bind(this)),s.push(i.form=this);return s}getInputByName(t){var i,e,n,r;for(e=0,n=(r=this.getInputs()).length;e<n;e++)if((i=r[e]).getName()===t)return i;return null}checkRules(){var t,i,e,n;for(t=this.json(),this.needRecheckRules=!1,i=0,e=(n=this.getInputs()).length;i<e;i++)n[i].checkRules(t);if(this.needRecheckRules)return this.checkRules()}recheckRules(){return this.needRecheckRules=!0}static globalBad(t,i){}static globalGood(t,i){}}return Form.globalOptions={},Form.globalJSON=null,Form}.call(this),Input=function(){class t{static init(i,e=null){var n,r,s;if(void 0!==(i=$(i)).data(t._data_input))return null===e?i.data(t._data_input):((r=i.data(t._data_input)).initData(e),r);if(null===e)try{e=JSON.parse(i.attr("data-init"))}catch(t){t,e={}}return void 0!==(s=i.attr("data-input"))?(s=(s=s.toLowerCase()).substr(0,1).toUpperCase()+s.substr(1),n=void 0!==t[s]?new t[s](i,e):new t(i,e)):n=new t(i,e),n}constructor(i=null,e={}){this.$wrap=i,this.init_data=e,null!==this.$wrap&&void 0!==this.$wrap.data(t._data_input)||this.initData(this.init_data)}initData(i={}){var e,n,r;return void 0!==(r=i.validation)&&(this.isErrorWhenEmpty=null!=(e=r.notEmpty)&&e,this.required=null!=(n=r.required)&&n),null!=i.rules&&(this.rules=i.rules),null===this.$wrap&&(this.$wrap=this.render()),this.initInput(),this.$wrap.data(t._data_input,this)}initInput(){return"INPUT"===this.$wrap[0].tagName?this.$input=this.$wrap:this.$input=$("input:eq(0)",this.$wrap),this.$input.on("change",this.triggerChange.bind(this))}triggerChange(){return this.format(),this.$wrap.trigger("input:change")}format(){}value(t){return void 0!==t?this.$input.val(t):this.$input.val()}getName(){return this.$wrap.attr("data-name")}testRule(t,i){var e,n,r,s,a,u;if(void 0===i[e=t[0]])return!0;switch(u=i[t[0]].toString(),n=t[2].toString(),t[1]){case"=":return u===n;case"is":case"not":switch(n){case"visible":a=null!=(r=this.form)?r.getInputByName(e).isVisible():void 0;break;case"checked":a=null!=(s=this.form)?s.getInputByName(e).checked():void 0}return"is"===t[1]?a:!a;default:return!1}}checkRule(t,i){var e,n,r,s,a,u,o,h,l;if(e=null,void 0!==t[FormRuleCommand.OR]){for(l=!1,r=0,a=(o=t[FormRuleCommand.OR]).length;r<a;r++)n=o[r],l=l||this.testRule(n,i);e=t.action}else if(void 0!==t[FormRuleCommand.AND]){for(l=!0,s=0,u=(h=t[FormRuleCommand.AND]).length;s<u;s++)n=h[s],l=l&&this.testRule(n,i);e=t.action}else l=this.testRule(t,i),e=t[3];if(null!==e)switch(e){case FormRuleAction.HIDE:return l?this.hide():this.show();case FormRuleAction.SHOW:return l?this.show():this.hide()}}checkRules(t){var i,e,n,r,s;if(null!==this.rules){for(s=[],e=0,n=(r=this.rules).length;e<n;e++)i=r[e],s.push(this.checkRule(i,t));return s}}isInputActionWithParent(){return this.form.inputActionWithParent}hide(){if(this.isVisible())return this.isInputActionWithParent()?this.$wrap.parent().hide():this.$wrap.hide(),this.$wrap.trigger("input:hide")}show(){if(!this.isVisible())return this.isInputActionWithParent()?this.$wrap.parent().show():this.$wrap.show(),this.$wrap.trigger("input:show")}attributesToString(){var t,i;for(i in t=[],this.attributes)t.push(i+'="'+this.attributes[i]+'"');return t.join(" ")}toString(){return'<input data-input="text" '+this.attributesToString()+"/>"}render(){return this.$input=$(this.toString())}isVisible(){return this.$wrap.is(":visible")}checkErrors(t){return t}validate(){var t;return t={errors:[]},this.isEmpty()?(t.isEmpty=!0,(this.isErrorWhenEmpty||this.required)&&(t.errorEmptyText=InputError.errorEmptyText,t.errors.push(InputError.errorEmptyText))):t=this.checkErrors(t),t}isEmpty(){return!1}}return t.prototype.errorEmptyText="Не должно быть пустым",t.prototype.name="",t.prototype.isErrorWhenEmpty=!1,t.prototype.rules=null,t.prototype.required=!1,t.prototype.isRadio=!1,t.prototype.isCheckbox=!1,t._data_input="_data_input",t}.call(this),InputError=function(){class t{}return t.errorEmptyText="Не должно быть пустым",t.errorEmailInvalid="Некорректный email",t}.call(this),FormRuleCommand=function(){class t{}return t.OR="or",t.AND="and",t.IN="in",t.IS="is",t.ON="on",t}.call(this),FormRuleOperator=function(){class t{}return t.EQUAL="=",t}.call(this),FormRuleAction=function(){class t{}return t.HIDE="hide",t.SHOW="show",t.FUNCTION="function",t}.call(this),FormRuleOperator=function(){class t{}return t.CHANGE="change",t}.call(this),Input.Text=class extends Input{constructor(t=null,i={}){super(t,i)}isEmpty(){return 0===$.trim(this.value()).length}},Input.Email=function(){class t extends Input.Text{testMail(t){return this.mail.test(t)}checkErrors(t){var i;return i=(i=this.value()).replace(/ /g,""),this.testMail(i)||(t.isEmailInvalid=!0,t.errorEmailInvalid=InputError.errorEmailInvalid,t.errors.push(InputError.errorEmailInvalid)),t}}return t.prototype.mail=/^([A-Za-z0-9_-]+\.)*[A-Za-z0-9_-]+@[A-Za-z0-9_-]+(\.[A-Za-z0-9_-]+)*\.[A-Za-z]{2,6}$/,t}.call(this),Input.Int=class extends Input.Text{format(){var t;return t=this.value(),t=parseInt(t),isNaN(t)&&(t=0),this.$input.val(t)}},Input.Hidden=class extends Input{},Input.Select=class extends Input{initInput(){return"SELECT"===this.$wrap[0].tagName?this.$input=this.$wrap:this.$input=$("select:eq(0)",this.$wrap),this.$input.on("change",this.triggerChange.bind(this))}isEmpty(){return""===this.value()}},Input.Select_ajax=class extends Input.Select{isEmpty(){return null===this.value()||void 0===this.value}},Input.Checkbox=function(){class t extends Input{initInput(){return"INPUT"===this.$wrap[0].tagName?this.$input=this.$wrap:this.$input=$("input[type=checkbox]:eq(0)",this.$wrap),this.$input.on("change",this.triggerChange.bind(this))}value(t){return null!=t&&this.$input.val(t),this.checked()?this.$input.val():0}checked(){return this.$input.is(":checked")}isEmpty(){return null===this.value()}}return t.prototype.isCheckbox=!0,t}.call(this),Input.Textarea=class extends Input{initInput(){return"TEXTAREA"===this.$wrap[0].tagName?this.$input=this.$wrap:this.$input=$("textarea:eq(0)",this.$wrap),this.$input.on("change",this.triggerChange.bind(this))}isEmpty(){return""===this.value()}},Input.Image=class extends Input{initInput(){return this.$input=$("input[type=hidden]:eq(0)",this.$wrap),this.$input.on("change",this.triggerChange.bind(this))}static value(t){return void 0!==t?this.$input.val(t):this.$input.val()}isEmpty(){return""===this.value()}},Input.Radio=function(){class t extends Input{initInput(){return"INPUT"===this.$wrap[0].tagName?this.$input=this.$wrap:this.$input=$("input[type=radio]:eq(0)",this.$wrap),this.$input.on("change",this.triggerChange.bind(this))}value(t){return null!=t&&this.$input.val(t),this.checked()?this.$input.val():null}checked(){return this.$input.is(":checked")}isEmpty(){return null===this.value()}}return t.prototype.isRadio=!0,t}.call(this),Input.Date=class extends Input.Text{},Input.Video=class extends Input{initInput(){return this.$input=$("input[type=hidden]:eq(0)",this.$wrap),this.$input.on("change",this.triggerChange.bind(this))}static value(t){return void 0!==t?this.$input.val(t):this.$input.val()}isEmpty(){return""===this.value()}},Input.Datetime=class extends Input.Text{value(t){var i;return void 0!==t?this.$input.val(t):(i=Date.parse(this.$input.val())/1e3,isNaN(i)&&(i=0),i)}},Input.Float=class extends Input.Text{format(){var t;return t=this.value(),t=parseFloat(t),isNaN(t)&&(t=0),this.$input.val(t)}value(t){var i;return i=void 0!==t?t:this.$input.val(),i=parseFloat(i),isNaN(i)&&(i=0),this.$input.val(i),i}},Input.Tinymce=class extends Input{getNodeId(){return this.$wrap.attr("data-input-tinymce")}value(t){return void 0!==t?tinymce.get(this.getNodeId()).setContent(t):tinymce.get(this.getNodeId()).getContent()}}; |