var CartForm  = function(op){
	/*
	vtype, field vlength renderer, target_id
	*/
	var _this = this;	
	_this.init = function(){
		for(var i=0;i<op.length;i++){
			_this.process_customValidation(op[i]);
		}
	};
	
	_this.all = function(cb){
		var iresult;
		var ierrores = 0;
		var item;
		for(var i=0;i<op.length;i++){
			item = op[i];
			iresult = _this.dovalidation(item);
			if(iresult.result.isvalid === false){
				_this.setAction(item);
				ierrores++;
			}
		}
		cb(ierrores,op);
	}
	
	_this.process_customValidation = function(item){
		Fujar.Utils.addEvent(item.field,"keyup",function(evt){
			evt = (evt) ? evt : window.event;
			_this.setAction(item);
		});
		
		Fujar.Utils.addEvent(item.field,"blur",function(){
			_this.setAction(item);
		});
		
	};
	
	_this.setAction = function(item){
		var item_validation = _this.dovalidation(item);
		item = item_validation;
		var txt = item.renderer(item);
		$("#" + item.target_id).html(txt);
	};
	
	_this.dovalidation = function(item){
		var result = null;
		if(item.vtype == "vcard"){
			result = _this.__vcard(item.field.value);
		}else if(item.vtype == "number"){
			result = _this.__vnum(item.field.value,item.vlength);
		}else if(item.vtype == "string"){
			result = _this.__vstring(item.field.value,item.vlength);
		}else if(item.vtype == "ckbox"){
			result = _this.__ckbox(item.field,item.vnum);
		}
		else if(item.vtype == "email"){
			result = _this.___email(item.field.value,item.vlength);
		}
		else if(item.vtype == "custom"){
			result = item.valfunction(item);
		}
		if(result !== null){
			item.result = {};
			for(var pr in result){
				item.result[pr] = result[pr];
			}
		}
		return item;
	};
	
	
	/*   VALIDATION FUNCTIONS  */
	_this.___email = function(v){
		var regExpr = texto.match(/^[\w._-]{2,}@[\w._-]{2,}\.[\w_-]{2,4}$/);
		var res = {
			text : "ok",
			isvalid : true
		};
		if(!regExpr){
			res.text = "error";		
			res.isvalid = false;
		}
		return res;
	};
	
	 _this.__ckbox = function(c,num){
		alert(c.length);
	 };
	 
	_this.__vstring = function(v,size){
		var vsize = size || 1;
		var res = {
			text : "ok",
			isvalid : true
		};
		v = v+"";
		if(v.length < vsize){
			res.text = "numlength";
			res.isvalid = false;
		}		
		return res;
	};
	
	_this.__vnum = function(v,size){
		var vsize = size || 1;
		var res = {
			text : "ok",
			isvalid : true
		};
		if((v+"").length < vsize){
			res.text = "numlength";
			res.isvalid = false
		}
		
		if(!(v+"").match(/^[0-9]+$/)){
			res.text = "formaterror";
			res.isvalid = false
		}
		
		return res;
	};
	
	_this.__vcard = function(v){
		/**************************/
		var tartypes = {
			"Visa":"Visa",
			"MC": "Marter Card",
			"Disc" : "Discover",
			"AmEx" : "American Express",
			"Diners" : "Diners",
			"error" : "tipo no encontrado "
		};
		function isValidCreditCard(ccnum) {
			var isvalid = false;
			var type = "error";
			var re = {};
			re["Visa"] = /^4\d{3}-?\d{4}-?\d{4}-?\d{4}$/;
			re["MC"] = /^5[1-5]\d{2}-?\d{4}-?\d{4}-?\d{4}$/;
			re["Disc"] = /^6011-?\d{4}-?\d{4}-?\d{4}$/;
			
			re["AmEx"] = /^3[4,7]\d{13}$/;
			re["Diners"] = /^3[0,6,8]\d{12}$/;

			for(var vr in re){
				if(re[vr].test(ccnum)){
					type = vr;
					isvalid = true;
					if(vr == "AmEx"){
						isvalid = false;
					}
					break;
				}
			}
			return {
				type : type,
				isvalid : isvalid,
				text : tartypes[type]
			};
		}
		return isValidCreditCard(v);
	}
}
