var FormView=require("ampersand-form-view"),InputView=require("ampersand-input-view"),debounce=require("amp-debounce"),extend=require("amp-extend"),AsyncInputView=InputView.extend({bindings:extend({},InputView.prototype.bindings,{showMessage:{type:"toggle",hook:"message-text"}}),props:{asyncMs:["number",!0,500],asyncValid:["boolean",!0,!0],pending:["boolean",!0,!1],pendingClass:["string",!0,"input-pending"]},derived:{valid:{deps:["inputValue","asyncValid"],fn:function(){return this.asyncValid&&!this.runTests()}},validityClass:{deps:["pending","pendingClass","valid","validClass","invalidClass","shouldValidate"],fn:function(){return this.shouldValidate?this.pending?this.pendingClass:this.valid?this.validClass:this.invalidClass:""}}},abortAsyncTest:function(){},runAsyncTest:function(){this.asyncTest&&!this.message&&this.value!==this.asyncValue&&(this.pending?this.abortAsyncTest():this.pending=!0,this.asyncTest.call(this,this.value,function(a){this.pending=!1,this.asyncValue=this.value,a&&(this.shouldValidate=!0,this.asyncValid=!1,this.message=a)}.bind(this)))},initialize:function(a){InputView.prototype.initialize.call(this,a),a=a||{},this.asyncTest=a.asyncTest||void 0,this.abortAsyncTest=a.abortAsyncTest||this.abortAsyncTest,this.runAsyncTest=debounce(this.runAsyncTest,this.asyncMs)},handleChange:function(a){InputView.prototype.handleChange.call(this,a),this.runAsyncTest()},handleInputChanged:function(a){InputView.prototype.handleInputChanged.call(this,a),this.asyncValid=!0,this.runAsyncTest()},getErrorMessage:function(){return this.asyncValue=null,InputView.prototype.getErrorMessage.call(this)}}),userNames=["user","asdf","user123","testuser","myuser"],MyForm=FormView.extend({fields:function(){return[new AsyncInputView({label:"Username",name:"username",placeholder:"Choose a username",tests:[function(a){return a.length<3?"Username has to be at least 3 characters long":void 0}],asyncTest:function(a,b){window.setTimeout(function(){b(userNames.indexOf(a)>-1?"Username is already taken":"")},250)},asyncMs:1e3})]}}),myForm=new MyForm;document.body.appendChild(myForm.el);