
var validateForm=function(){
	this.init(validateForm.arguments);
};

validateForm.prototype={

	init:function(args){

		var id=args[0];

		if(id){

			var callback=args[1];

			var target = new glow.forms.Form(glow.dom.get(id),{

				onValidate:function(results){

					if(results.errorCount>0){

						var error = new Object();
						var form = target.formNode;
						var fields = results.fields;
		
						this.feedback = function(error){
							if(typeof error != "object") return;
							return {
								name:error.name,
								message:error.message
							}
						};
		
						var i=0;
		
						do{
							if(fields[i].result==0){
								// flatten duplicates to report one error at a time.
								var obj = this.feedback(fields[i]);
								error[obj.name]=obj;
							}
							i++;
						} 
						while(i<fields.length)
		
						if(typeof callback != "function"){
						
							if(error){
			
								var status = form.get(".status");
			
								if(status.length>0)
									status.remove();
			
								status = glow.dom.create('<p class="status"><!--v--></p>').prependTo(form);
			
								form.get("input,textarea").each(function(){
									form.get(this).prev().removeClass("err");
								});
			
								for (var i in error){
									var label = form.get("#"+error[i].name).prev().addClass("err").text().split(":")[0];
									var message = error[i].message.toLowerCase();
									status.prepend('<span class="err">'+label+' '+message+'</span>');
								}
			
							}
		
						} else {
							// callback
							
							if(results){
								results.__error = error;
							}
		
							callback(results);
						}
		
						return false;
		
					}
		
					return true;
		
				}
		
			});
		
			target.formNode.get("input,textarea").each(function(i){
		
				var cls=this.className||false;
		
				this.check_length = function(field,length,form){
		
					var count = field.value.length;
					var counter = form.get(field).prev().get(".counter");
		
					counter.text(count+"/");
		
					var doCount = function(field,length){
						var str = field.value;
						if(count==0){
							count++;
						} else if (count>length){
							field.value=str.substring(0,length);
							count=length;
						}
						counter.text(count+"/");
						count++;
					};
		
					var nonChar=false;
					var keyEvent=function(e){
						var charCode;
						//IE reports window.event not arg
						var evt=(e)?e:window.event;
						if(evt.type=="keydown"){
							charCode=evt.keycode;
							// non printables
							if(charCode<16||
								// avoid shift
								(charCode>16&&charCode<32)||
								// navigation keys
								(charCode>32&&charCode<41)||
								// Delete Key (Add to these if you need)
								charCode==46){
									//doCount(field,length);
									nonChar=true;
							} else {
								nonChar=false;
							}
						} else {
							// Already Handled on keydown
							if(nonChar) return;
							charCode = (evt.charCode) ? evt.charCode : evt.keyCode;
							// safari and opera
							if(charCode>31&&charCode<256){
								doCount(field,length);
							}
							// Backspace Non-IE
							if(e){
								return
								// Catch IE backspace
							} else if (evt.keyCode==8){
								// and stop it!
								evt.returnValue=false;
							}
						}
					};
		
					field.onkeypress=field.onkeydown=function(e){
						return keyEvent(e)
					};
		
				};
		
				if(cls){
		
					var spec = new Array(),
					length,regex;
		
					if(/isRequired\b/.test(cls)){
						spec.push(["required"]);
					}
		
					if(/isEmail\b/.test(cls)){
						spec.push(["isEmail"]);
					}
		
					if(/isMaxLen-([\d]+)\b/.test(cls)){
						length = parseInt(cls.match(/isMaxLen-([\d]+)/)[1]||0);
						spec.push(["maxLen",{arg:length}]);
						this.check_length(this,length,target.formNode);
					}
		
					if(/isMinLen-([\d]+)\b/.test(cls)){
						length = parseInt(cls.match(/isMinLen-([\d]+)/)[1]||0);
						spec.push(["minLen",{arg:length}]);
					}
		
					if(/isDate\b/.test(cls)){
						regex = /^[\d]{4}\/[\d]{2}\/[\d]{2}$/;
						spec.push(["regex",{arg:regex}]);
					}
		
					if(/isNumber\b/.test(cls)){
						spec.push(["isNumber"]);
					}
					
					if(/isString\b/.test(cls)){
						// duff, could be done better.
						regex = /^[0-9a-zA-Z\.,'"\-]+$/;
						spec.push(["regex",{arg:regex}]);
					}
		
					// process validation tests.
					if(spec.length>0){
						var i=0;
						do{
							target.addTests(this.id,spec[i]);
							i++;
						}
						while(i<spec.length)
					}
		
					return;
		
				}
		
			});

			
		
		}
		
		else {

			return;

		}

	}

};







