168 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			168 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*
 | |
| Product Name: dhtmlxSuite 
 | |
| Version: 4.0.3 
 | |
| Edition: Professional 
 | |
| License: content of this file is covered by DHTMLX Commercial or Enterprise license. Usage without proper license is prohibited. To obtain it contact sales@dhtmlx.com
 | |
| Copyright UAB Dinamenta http://www.dhtmlx.com
 | |
| */
 | |
| 
 | |
| //all purpose set of rules, based on http://code.google.com/p/validation-js
 | |
| dhtmlxValidation=function(){};
 | |
| dhtmlxValidation.prototype={
 | |
| 	trackInput:function(el,rule,callback_error,callback_correct){
 | |
| 			dhtmlxEvent(el,"keyup",function(e){ 
 | |
| 				if (dhtmlxValidation._timer) {
 | |
| 					window.clearTimeout(dhtmlxValidation._timer);
 | |
| 					dhtmlxValidation._timer = null;
 | |
| 				}
 | |
| 				dhtmlxValidation._timer = window.setTimeout(function(){
 | |
| 
 | |
| 					if (!dhtmlxValidation.checkInput(el,rule)){
 | |
| 						if(!callback_error || callback_error(el,el.value,rule))
 | |
| 							el.className+=" dhtmlx_live_validation_error";
 | |
| 					} else {
 | |
| 						el.className=el.className.replace(/[ ]*dhtmlx_live_validation_error/g,"");
 | |
| 						if (callback_correct)
 | |
| 							callback_correct(el,el.value,rule);
 | |
| 					}
 | |
| 				
 | |
| 				},250);
 | |
| 			});
 | |
| 	},
 | |
| 	checkInput:function(input,rule){
 | |
| 		return this.checkValue(input.value,rule);
 | |
| 	},
 | |
| 	checkValue:function(value,rule){
 | |
| 		if (typeof rule=="string")
 | |
| 			rule = rule.split(",");
 | |
| 			
 | |
| 		var final_res=true;
 | |
| 		for (var i=0; i<rule.length; i++){
 | |
| 			if (!this["is"+rule[i]])
 | |
| 				alert("Incorrect validation rule: "+rule[i]);
 | |
| 			else
 | |
| 				final_res=final_res&&this["is"+rule[i]](value);;
 | |
| 		}
 | |
| 		return final_res;
 | |
| 	},
 | |
| 	isEmpty: function(value) {
 | |
| 		return value == '';
 | |
| 	},
 | |
| 	isNotEmpty: function(value) {
 | |
| 		return (value instanceof Array?value.length>0:!value == ''); // array in case of multiselect
 | |
| 	},
 | |
| 	isValidBoolean: function(value) {
 | |
| 		return !!value.toString().match(/^(0|1|true|false)$/);
 | |
| 	},
 | |
| 	isValidEmail: function(value) {
 | |
| 		return !!value.toString().match(/(^[a-z0-9]([0-9a-z\-_\.]*)@([0-9a-z_\-\.]*)([.][a-z]{3})$)|(^[a-z]([0-9a-z_\.\-]*)@([0-9a-z_\-\.]*)(\.[a-z]{2,4})$)/i); 
 | |
| 	},
 | |
| 	isValidInteger: function(value) {
 | |
| 		return !!value.toString().match(/(^-?\d+$)/);
 | |
| 	},
 | |
| 	isValidNumeric: function(value) {
 | |
| 		return !!value.toString().match(/(^-?\d\d*[\.|,]\d*$)|(^-?\d\d*$)|(^-?[\.|,]\d\d*$)/);
 | |
| 	},
 | |
| 	isValidAplhaNumeric: function(value) {
 | |
| 		return !!value.toString().match(/^[_\-a-z0-9]+$/gi);
 | |
| 	},
 | |
| 	// 0000-00-00 00:00:00 to 9999:12:31 59:59:59 (no it is not a "valid DATE" function)
 | |
| 	isValidDatetime: function(value) {
 | |
| 		var dt = value.toString().match(/^(\d{4})-(\d{2})-(\d{2})\s(\d{2}):(\d{2}):(\d{2})$/);
 | |
| 		return dt && !!(dt[1]<=9999 && dt[2]<=12 && dt[3]<=31 && dt[4]<=59 && dt[5]<=59 && dt[6]<=59) || false;
 | |
| 	},
 | |
| 	// 0000-00-00 to 9999-12-31
 | |
| 	isValidDate: function(value) {
 | |
| 		var d = value.toString().match(/^(\d{4})-(\d{2})-(\d{2})$/);
 | |
| 		return d && !!(d[1]<=9999 && d[2]<=12 && d[3]<=31) || false;
 | |
| 	},
 | |
| 	// 00:00:00 to 59:59:59
 | |
| 	isValidTime: function(value) {
 | |
| 		var t = value.toString().match(/^(\d{1,2}):(\d{1,2}):(\d{1,2})$/);
 | |
| 		return t && !!(t[1]<=24 && t[2]<=59 && t[3]<=59) || false;
 | |
| 	},
 | |
| 	// 0.0.0.0 to 255.255.255.255
 | |
| 	isValidIPv4: function(value) { 
 | |
| 		var ip = value.toString().match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/);
 | |
| 		return ip && !!(ip[1]<=255 && ip[2]<=255 && ip[3]<=255 && ip[4]<=255) || false;
 | |
| 	},
 | |
| 	isValidCurrency: function(value) { // Q: Should I consider those signs valid too ? : ¢|€|₤|₦|¥
 | |
| 		return value.toString().match(/^\$?\s?\d+?([\.,\,]?\d+)?\s?\$?$/) && true || false;
 | |
| 	},
 | |
| 	// Social Security Number (999-99-9999 or 999999999)
 | |
| 	isValidSSN: function(value) {
 | |
| 		return value.toString().match(/^\d{3}\-?\d{2}\-?\d{4}$/) && true || false;
 | |
| 	},
 | |
| 	// Social Insurance Number (999999999)
 | |
| 	isValidSIN: function(value) {
 | |
| 		return value.toString().match(/^\d{9}$/) && true || false;
 | |
| 	}	
 | |
| };
 | |
| dhtmlxValidation=new dhtmlxValidation();
 | |
| //extension for the grid
 | |
| dhtmlXGridObject.prototype.enableValidation=function(mode,live){
 | |
| 	mode=convertStringToBoolean(mode);
 | |
| 	if (mode){
 | |
| 		this._validators={ data:[] };
 | |
| 	}else
 | |
| 		this._validators=false;
 | |
| 		
 | |
| 	if (arguments.length>1)
 | |
| 		this._validators._live=live;
 | |
| 	if (!this._validators._event)
 | |
| 		this._validators._event=this.attachEvent("onEditCell",this.validationEvent);
 | |
| 		
 | |
| 	};
 | |
| dhtmlXGridObject.prototype.setColValidators=function(vals){
 | |
| 	if (!this._validators) this.enableValidation(true);
 | |
| 	if (typeof vals == "string") vals=vals.split(this.delim);
 | |
| 	this._validators.data=vals;
 | |
| };
 | |
| dhtmlXGridObject.prototype.validationEvent=function(stage,id,ind,newval,oldval){
 | |
| 	var v=this._validators; 
 | |
| 	if (!v) return true; // validators disabled
 | |
| 	var rule=(v.data[ind]||this.cells(id,ind).getAttribute("validate"))||"";
 | |
| 	
 | |
| 	if (stage==1 && rule){
 | |
| 		var ed = this.editor||(this._fake||{}).editor;
 | |
| 		if (!ed) return true; //event was trigered by checkbox
 | |
| 		ed.cell.className=ed.cell.className.replace(/[ ]*dhtmlx_validation_error/g,"");
 | |
| 		if (v._live){
 | |
| 			var grid=this;
 | |
| 			dhtmlxValidation.trackInput(ed.getInput(),rule,function(element,value,rule){
 | |
| 				return grid.callEvent("onLiveValidationError",[id,ind,value,element,rule]);
 | |
| 			},function(element,value,rule){
 | |
| 				return grid.callEvent("onLiveValidationCorrect",[id,ind,value,element,rule]);
 | |
| 			});
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	if (stage==2)
 | |
| 		this.validateCell(id,ind,rule,newval);
 | |
| 	
 | |
| 	return true;
 | |
| };
 | |
| 
 | |
| dhtmlXGridObject.prototype.validateCell=function(id,ind,rule,value){
 | |
| 	rule=rule||(this._validators.data[ind]||this.cells(id,ind).getAttribute("validate"));
 | |
| 	value=value||this.cells(id,ind).getValue();
 | |
| 	if (!rule) return;
 | |
| 	var cell = this.cells(id,ind).cell;
 | |
| 
 | |
| 	var result = true;
 | |
| 	if (typeof rule == "string")
 | |
| 		rule = rule.split(this.delim);
 | |
| 		
 | |
| 	for (var i=0; i < rule.length; i++) {
 | |
| 		if (!dhtmlxValidation.checkValue(value,rule[i])){
 | |
| 			if (this.callEvent("onValidationError",[id,ind,value,rule[i]]))
 | |
| 				cell.className+=" dhtmlx_validation_error";
 | |
| 			result = false;
 | |
| 		}
 | |
| 	}
 | |
| 	if (result){
 | |
| 		this.callEvent("onValidationCorrect",[id,ind,value,rule]);
 | |
| 		cell.className=cell.className.replace(/[ ]*dhtmlx_validation_error/g,"");		
 | |
| 	}
 | |
| 	return result;
 | |
| }; |