var Field=new Class({initialize:function(id,html,options){var self=this;var input=null;if(!$defined(html)){html=$(document);}
this.dom={root:html,errors:new Hash(),messages:{},fields:new Hash(),parent:null};this.dom.parent=this.dom.root.getElement("#"+id+"-row");var type_id=$type(id);if(type_id=="string"){input=$(id);}
else
if(type_id=="array"){input=html.getElement("#"+id[0]);id.shift();id.each(function(item){self.dom.fields.set(item,html.getElement("#"+item));});}
if(input==null){throw new ExElementNotExist("Field element: "+id,this);}
this.e_prefix=id;this.dom.input=input;this.rules={};this.options=$defined(options)?new Hash(options):new Hash();this.options.merge(new Hash({readonly:$defined(options)&&$defined(options.readonly)?options.readonly:false}));this.readonly(this.options.readonly);var value=this.getHTML();this.value(value);this.errors=[];},value:function(value){return typeof(value)!="undefined"?this._setValue(value):this._getValue();},_setValue:function(value){this.setHTML(value);this._value=this.value();return this;},_getValue:function(){return this.getHTML();},setHTML:function(value){var html=!value?"":value;$setValue(this.dom.input,html);},getHTML:function(){return $getValue(this.dom.input);},reset:function(){this.value(this._value);},isChanged:function(){return this.value()==this._value?false:true;},readonly:function(readonly){if($defined(readonly)){if(readonly==true){this.dom.input.setProperty("readonly","readonly");}else{this.dom.input.removeProperty("readonly");}
this.options.readonly=readonly;return this;}else{return this.options.readonly;}},disable:function(flag){if($defined(flag)){if(flag==true){this.dom.input.setAttribute("disabled","disabled");}else{this.dom.input.removeAttribute("disabled");}
this.options.disabled=flag;return this;}else{return this.options.disabled;}},addError:function(id){var input_id=this.dom.input.get("id");var eid=this.e_prefix+"-"+id;var error=this.dom.root.getElement("#"+input_id+"-errors #"+eid);if(error==null){throw new ExElementNotExist("Error message "+id+" for "+input_id,this);}
this.dom.errors.set(id,error);var self=this;error.visible=function(){return self.isErrorVisible(this);}
error.hide();return this;},removeErrors:function(){this.dom.errors=new Hash();},showError:function(error){error.show();},hideError:function(error){error.hide();},isErrorVisible:function(error){return error.getStyle("display")=="block";},error:function(id){return this.dom.errors.get(id);},getErrors:function(){return this.dom.errors.getKeys();},addRule:function(rule){this.validator().addRule(rule);this.rules[rule.className]=rule;return this;},rule:function(rule){return this.rules[rule];},getRules:function(){var arr=[];for(i in this.rules){arr.push(i);}
return arr;},validator:function(){if(this._validator==null){this._validator=new FormValidator();}
return this._validator;},storeToHash:function(){var data={};data[this.dom.input.get("id")]=this.value();this.dom.fields.each(function(item){data[item.get("id")]=item.get("value");});return data;},validate:function(){var data=this.storeToHash();if(this.options.readonly==false){var errors=this.validator().validate(data);}
this.hideErrors();if(errors){this.showErrors(errors[0].rules);return false;}else{return true;}},showErrors:function(errors){errors.each(function(item){if(this.error(item)!=null){this.error(item).show();}},this);},hideErrors:function(){var self=this;this.dom.errors.each(function(item){item.hide();});},addEvent:function(event,callback){this.dom.input.addEvent(event,callback);},removeEvents:function(){this.dom.input.removeEvents();},getInput:function(){return this.dom.input;},clear:function(){this.value("");},_validator:null});var FieldAlertError=new Class({Extends:Field,showErrors:function(errors){var self=this;errors.each(function(item){alert(self.error(item).get('text'));});}});var FieldAlertWithTextError=new Class({Extends:Field,error_messages:[],addError:function(id,message){var e={id:id,message:message};this.error_messages.push(e);return this;},showErrors:function(errors){var self=this;errors.each(function(item){var e=self._loadErrorById(item);alert(e.message);});},_loadErrorById:function(id){var e=null;this.error_messages.each(function(item){if(item.id==id){e=item;}},this);return e;}});