function validateSpec(elm, spec){
	// parse spec
	var type = spec.substring(0, 3);
	switch(type){
		case 'int':
			// check length (1,4)
			var reg = new RegExp(/(\d+),(\d+|\*)/);
			var data = reg.exec(spec);
			if(data[2] == '*') data[2] = 100000;
			if(!elm.value.match(/^\d+$/) && data[1] != 0) // data is integer
				return validateShowError(elm, spec);
			if(elm.value.length < data[1] || elm.value.length > data[2]){
				return validateShowError(elm, spec);
			}
		break;
		case 'str':
			// check length (1,4)
			var reg = new RegExp(/(\d+),(\d+|\*)/);
			var data = reg.exec(spec);
			if(data[2] == '*') data[2] = 100000;
			if(elm.value.length < data[1] || elm.value.length > data[2]){
				return validateShowError(elm, spec);
			}
		break;
		case 'prx':
			if(!elm.value.match(/^\d+\.\d{2}$/)){
				// do we have an int
				if(!elm.value.match(/^\d+$/)){
					return validateShowError(elm, spec);
				}else{
					elm.value += '.00';
				}
			}
		break;
		case 'adr':
			if(!elm.value.match(/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/)){
				return validateShowError(elm, spec);
			}
		break;
		case 'dat':
			if(!elm.value.match(/^\d{4}-\d{2}-\d{2}$/)){
				if(!(elm.value.length == 0)){
					return validateShowError(elm, spec);
				}
			}
	}
	return validateShowOk(elm, spec);
}
