Array.implement({
	step: function(fn, bind){
		for (var i = 0, l = this.length; i < l; i++)if (!fn.call(bind, this[i], i, this))return;
	}
});
/*Element.implement({
	markRound:function(){
		var top = new Element('B', {syltes:{'display':'block','background':'transparent','font-size':1}});
		var bottom = top.clone();
		var x1 = new Element('B', {styles:{
			'display':'block',
			'overflow':'hidden',
			'margin':'0 5px'
		}});
		var x2 = x1.clone();
		var x3 = x1.clone();
		var x4 = x1.clone();
		x2.setStyles({'margin':'0 3px', 'border-width':'0 2px'});
		x3.setStyle('margin','0 2px');
		x4.setStyles({'margin':'0 1px', height:2});
		var backColor = this.getStyle('background');
		[x2, x3, x1].each(function(el){el.setStyles({'height':1, 'backgroud':backColor})});
		[x2, x3, x4].each(function(el){el.setStyles({'backgroud':backColor, 'border-left':'1px solid '+backColor, 'border-right':'1px solid '+backColor})});
		top.adopt(x1);
		top.adopt(x2);
		top.adopt(x3);
		top.adopt(x4);
		var html = this.get('html');
		this.empty();
		this.adopt(top);
		this.set('html', html);
		//this.setStyle('background', 'transparent');
	}
});
*/
var MoockForm = new Class({
	Implements: [Events, Options],
	options:{
		errClass:'errdiv',
		errInput:'errInput',
		stopTime:2500
	},
	initialize:function(){
		var params = Array.link(arguments, {'options': Object.type,'element': $defined});
		this.setOptions(params.options || {});
		this.form = $(params.element);
		//this.submit = this.options.submit || this.form.get('onsubmit');
		this.form.getElements('input, textarea').each(function(el){
			var mustInput = el.getProperty('mustInput');
			var coordinate = el.getCoordinates();
			var alt = el.get('alt');
			if (mustInput){
				var tmp = new Element("DIV", {
				'class':this.options.errClass,
				'html':alt,
				'styles':{
					'opacity':0,
					'display':'block',
					'position':'absolute',
					'border':0,
					'padding':5,
					'visibility':'hidden',
					'background':'#000',
					'color':'#fff',
					'z-index':1000
				}});
				$(document.body).adopt(tmp);
				// tmp.markRound();
				tmp.setStyles({
					top:coordinate.top - 3,
					left:coordinate.left + 15
				});
				el.store('errAlt', tmp);
			}
		}.bind(this));
	},
	checkForm:function(){
		var result = true;
		this.form.getElements('input, textarea').step(function(el){
			var valueType = el.getProperty('valueType');
			var mustInput = el.getProperty('mustInput');
			var value = el.value.trim();
			var errDiv = el.retrieve('errAlt');
			if (mustInput&&""==value){
				result = false;
				errDiv.fade(0.9);
				//el.addClass(this.options.errInput);
				//el.tween('border', '1px #FF0000 solid');
				this.hidden.delay(this.options.stopTime, this, el);
				el.focus();
				return false;
			}
			switch(valueType){
				case 'int':
					if (!this.isInt(value)){
						errDiv.fade(0.9);
						//el.tween('border', '1px #FF0000 solid');
						//el.addClass(this.options.errInput);
						this.hidden.delay(this.options.stopTime, this, el);
						el.focus();
						result = false;
					}
				break;
				case 'float':
					if (!this.isNumber(value)){
						errDiv.fade(0.9);
						//el.addClass(this.options.errInput);
						this.hidden.delay(this.options.stopTime, this, el);
						el.focus();
						result = false;
						return false;
					}
				break;
				case 'date':
					if (!this.isDate(value)){
						errDiv.fade(0.9);
						result = false;
						//el.addClass(this.options.errInput);
						this.hidden.delay(this.options.stopTime, this, el);
						el.focus();
						return false;
					}
				break;
				case 'email':
					if (!this.isEmail(value)){
						result = false;
						errDiv.fade(0.9);
						//el.addClass(this.options.errInput);
						//el.tween('border', '1px #FF0000 solid');
						this.hidden.delay(this.options.stopTime, this, el);
						el.focus();
						return false;
					}
				break;
			}
			return true;
		}.bind(this));
		return result;
	},
	hidden:function(el){
		var errDiv = el.retrieve('errAlt');
		el.removeClass(this.options.errInput);
		errDiv.set('tween').fade('out');
	},
	isEmail:function(str){
		if(str.match(/[\w-.]+@{1}[\w-]+\.{1}\w{2,4}(\.{0,1}\w{2}){0,1}/ig)!=str)
			return false;
		else
			return true;
	},
	isInt:function(str){
		var patrn=/^[-,+]{0,1}[0-9]{0,}$/;
		if (!patrn.exec(str))
			return false;
		return true;
	},
	isDate:function(str){
		var r = str.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/); 
		if(null == r) {
			return false;
		} 
		var d= new Date(r[1], r[3]-1, r[4]);
		if(!(d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4])){  
			return false;
		}
		return true;
	},
	isNumber:function(str){
		var patrn=/^[-,+]{0,1}[0-9]{0,}[.]{0,1}[0-9]{0,}$/;
		if (!patrn.exec(str))
			return false;
		return true;
	}
});

Element.implement({
	CheckFrom:function(){
		var moockForm = new MoockForm(this);
		this.addEvent('submit', function(e){
			var form = e.target;
			var result = moockForm.checkForm();
			var asyn = form.getProperty('asyn')||false;
			if (!result)
				e.stop();
			else{
				if (asyn){
					e.stop();
					$exec(form.getProperty('submitfn'));
				}
			}
		}.bind(this));
		return this;
	}
});

window.addEvent('domready', function(){
	$$('form').each(function(el){el.CheckFrom();});
});
