var uTypes={
	date : {
		regex		: /^(0[1-9]|[12][0-9]|3[01])\.(0[1-9]|1[012])\.(19|20)\d\d$/,
		msg			: uGLOBALS.msg.forms_bad_date,
		mask		: uGLOBALS.msg.forms_ddmmyyyy,
		mask_color	: '#808080',
		norm_color	: '#000000'
	},
	date2 : {
		parent		: 'date',
		allow_empty	: true
	},
	datetime : {
		regex		: /^(0[1-9]|[12][0-9]|3[01])\.(0[1-9]|1[012])\.(19|20)\d\d\s([0-1][0-9]|2[0-4]):(0[1-9]|[0-5][0-9])$/,
		msg			: uGLOBALS.msg.forms_bad_datetime,
		mask		: uGLOBALS.msg.forms_ddmmyyyyhhmm,
		mask_color	: '#808080',
		norm_color	: '#000000'
	},
	time : {
		regex		: /^([0-1][0-9]|2[0-4]):(0[1-9]|[0-5][0-9])$/,
		msg			: uGLOBALS.msg.forms_bad_time,
		mask		: uGLOBALS.msg.forms_hhmm,
		mask_color	: '#808080',
		norm_color	: '#000000'
	},

	flnum : {
		regex		: /^[a-z A-Z 0-9]+$/,
		msg			: uGLOBALS.msg.forms_bad_flnum,
		mask		: uGLOBALS.msg.forms_flnum,
		mask_color	: '#808080',
		norm_color	: '#000000'
	},

	any : {
		regex		: /./,
		msg			: uGLOBALS.msg.forms_fill_field,
		mask		: '',
		mask_color	: '#808080',
		norm_color	: '#000000'
	},

	any2 : {
		parent		: 'any',
		mask		: uGLOBALS.msg.forms_fill_field
	},

	email : {
		regex 		: /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,
		msg 		: uGLOBALS.msg.forms_bad_email,
		mask		: '',
		mask_color	: '#808080',
		norm_color	: '#000000'
	},

	phone : {
		regex		: /^\+\d{1,3}\s*\(?\d{1,5}\)?\s*[0-9 ]*$/,
		msg			: uGLOBALS.msg.forms_bad_phone,
		mask		: '+7 (111) 111 1111',
		mask_color	: '#808080',
		norm_color	: '#000000'
	},

	eng : {
		regex		: /^[a-z A-Z 0-9,\. \-]+$/,
		msg			: uGLOBALS.msg.forms_en_letters,
		mask		: uGLOBALS.msg.forms_as_inzp,
		mask_color	: '#808080',
		norm_color	: '#000000'
	},

	eng_txt : {
		parent		: 'eng',
		mask		: uGLOBALS.msg.forms_en_only
	},

	eng_txt_epty : {
		parent		: 'eng',
		mask		: uGLOBALS.msg.forms_en_only,
		allow_empty	: true
	},

	rus : {
		parent		: 'eng',
		regex		: /^[à-ÿ À-ß 0-9]+$/,
		msg			: uGLOBALS.msg.forms_ru_letters,
		mask		: ''
	},

	htl_eng : {
		parent		: 'eng',
		regex		: /^[a-z A-Z 0-9,\. \-&]+$/,
		msg			: uGLOBALS.msg.forms_en_hotelname,
		mask		: uGLOBALS.msg.forms_en_hotelname,
		allow_empty	: true
	},

	num : {
		regex		: /^[0-9]*$/,
		msg			: uGLOBALS.msg.forms_digits,
		mask		: '',
		mask_color	: '#808080',
		norm_color	: '#000000'
	},

	num2 : {
		parent		: 'num',
		mask		: uGLOBALS.msg.forms_digits_mask
	},

	ZGnum : {
		parent		: 'num',
		regex		: /^[0-9]{7,10}$/,
		msg			: uGLOBALS.msg.forms_zp_num
	},
	RUser : {
		parent		: 'num',
		regex		: /^[a-z0-9]{2,4}$/i,
		msg			: uGLOBALS.msg.forms_fill_field
	},
	RUnum : {
		parent		: 'num',
		regex		: /^[0-9]{6}$/,
		msg			: uGLOBALS.msg.forms_fill_field
	},

	any_login : {
		regex		: /./,
		msg			: '',
		mask		: '',
		mask_color	: '#95C8FF',
		norm_color	: '#000000'
	},

	any_pwd : {
		parent		: 'any_login'
	},

	cc_num : {
		regex		: /^[0-9]{13,16}$/,
		replace		: [/[^0-9]/g, ''],
		msg			: uGLOBALS.msg.forms_digits,
		mask		: '',
		mask_color	: '#808080',
		norm_color	: '#000000',
		allow_empty	: false
	},
	cc_cvv : {
		regex		: /^[0-9]{3,4}$/,
		msg			: uGLOBALS.msg.forms_cc_cvv,
		mask		: '',
		mask_color	: '#808080',
		norm_color	: '#000000',
		allow_empty	: false
	},
	cc_eng : {
		regex		: /^[a-z A-Z]+$/,
		msg			: uGLOBALS.msg.forms_en_letters,
		mask		: '',
		mask_color	: '#808080',
		norm_color	: '#000000',
		allow_empty	: false
	},
	eng_addr : {
		regex		: /^[0-9a-zA-Z,\.\s-\(\)\/]*.$/,
		msg			: uGLOBALS.msg.forms_en_letters,
		mask		: '',
		mask_color	: '#808080',
		norm_color	: '#000000'
	},
	eng_name : {
		regex		: /^[0-9a-zA-Z,\.\s-\(\)\/]*.$/,
		msg			: uGLOBALS.msg.forms_en_name,
		mask		: uGLOBALS.msg.forms_en_name,
		mask_color	: '#808080',
		norm_color	: '#000000',
		allow_empty	: true
	}
};

function oValid(){

	this.alert_type='msg';
	this.blink_color='#F0673D';
	this.blink_class='text_blink';
	this.check_fields=[];

	this.valid=this.fields=this.invalid=[]; this.frm=this.frm_id=this.blinkme=null;

	this.set_alert_type=function(s){
		this.alert_type=s;
	};

	/*
		Usage:
		0. validate all fields:
			if(!oFrm.validate()) return false;
		1. validate only one field:
			if(!oFrm.validate('date_end')) return false;
		2. all fields with preffix 'usr_' will be validated:
			if(!oFrm.validate('usr_*')) return false;
	*/
	this.validating=false;
	this.validate=function(field_id, no_sel){
		if(this.validating) return;

		this.validating=true;
		if(!no_sel) no_sel=false;

		this.check_fields=[];

		if(field_id!=undefined && field_id.indexOf('*')>0)
			var fld=field_id.substr(0, field_id.indexOf('*'));

		for(i in this.fields){
			if(field_id!=undefined){
				if(field_id.indexOf('*')>0 && this.fields[i]['name'].substr(0, fld.length)!=fld) continue;
				else if(field_id.indexOf('*')<0 && this.fields[i]['name']!=field_id) continue;
			}
			if(!isVisible(this.frm.elements[ this.fields[i]['i'] ])) continue;

			this.fields[i]['value']=this.frm.elements[this.fields[i]['i']].value;
			this.check_fields.push(i);
		}

		if(field_id==undefined) this.draw_mask();
		this.check();

		this.draw_errors(no_sel);

		this.validating=false;

		if(this.invalid.length) return false;
		else return true;
	};

	this.clear_empty=function(){
		for(i in this.fields){
			elm=this.frm.elements[this.fields[i]['i']];
			if(elm.value==uTypes[this.fields[i]['dtype']]['mask'])
				elm.value='';
		}
	};

	this.draw_mask=function(){
		for(i in this.fields){
			elm=this.frm.elements[this.fields[i]['i']];
			if(this.fields[i]['value']=='' || this.fields[i]['value']==uTypes[this.fields[i]['dtype']]['mask']){
				elm.value=uTypes[this.fields[i]['dtype']]['mask'];
				elm.style.color=uTypes[this.fields[i]['dtype']]['mask_color'];
			}else{
				if(this.fields[i]['dtype']=='any_pwd') elm.type='password';

				elm.style.color=uTypes[this.fields[i]['dtype']]['norm_color'];
			}
			elm.onfocus=this.mask_onFocus;
			if(elm.onblur==undefined) elm.onblur=this.mask_onBlur;
		}
	};

	this.mask_onFocus=function(evt){
		evt=(evt)?evt:((window.event)?window.event:'');
		var elm=(evt.target)?evt.target:evt.srcElement;

		if(elm.getAttribute('dtype')=='any_pwd') elm.type='password';

		elm.style.color=uTypes[elm.getAttribute('dtype')]['norm_color'];
		if(elm.value==uTypes[elm.getAttribute('dtype')]['mask']) elm.value='';
	};

	this.mask_onBlur=function(evt){
		evt=(evt)?evt:((window.event)?window.event:'');
		var elm=(evt.target)?evt.target:evt.srcElement;

		if(elm.value=='' || elm.value==uTypes[elm.getAttribute('dtype')]['mask']){
			if(elm.getAttribute('dtype')=='any_pwd') elm.type='text';

			elm.value=uTypes[elm.getAttribute('dtype')]['mask'];
			elm.style.color=uTypes[elm.getAttribute('dtype')]['mask_color'];
		}

		if(u('#ok:'+elm.name)!==false || u('#bad:'+elm.name)!==false) elm.validator.validate(elm.name, true);
	};

	this.check=function(){
		this.valid=[]; this.invalid=[];
		var ok=false;
		for(n=0; n<this.check_fields.length; n++){
			i=this.check_fields[n];

			if(this.frm.elements[this.fields[i]['i']].style.display=='none') continue;

			if(this.fields[i]['value']==uTypes[this.fields[i]['dtype']]['mask']){
				this.fields[i]['value']='';
				this.frm.elements[this.fields[i]['i']].value='';
			}
			if(uTypes[ this.fields[i]['dtype'] ].replace!==undefined){
				this.frm.elements[ this.fields[i]['i'] ].value=this.frm.elements[ this.fields[i]['i'] ].value.replace(uTypes[ this.fields[i]['dtype'] ].replace[0], uTypes[ this.fields[i]['dtype'] ].replace[1]);
				this.fields[i]['value']=this.frm.elements[ this.fields[i]['i'] ].value;
			}

			ok=true;
			s=uTypes[this.fields[i]['dtype']]['regex'];
			if(this.fields[i]['minlength']!=undefined && this.fields[i]['value'].length<parseInt(this.fields[i]['minlength'])) ok=false;
			if(this.fields[i]['maxlength']!=undefined && this.fields[i]['value'].length>parseInt(this.fields[i]['maxlength'])) ok=false;
			if(ok && !(s.test(this.fields[i]['value']) || (uTypes[this.fields[i]['dtype']]['allow_empty']!=undefined && uTypes[this.fields[i]['dtype']]['allow_empty'] && this.fields[i]['value']==''))) ok=false;
			if(ok) this.valid.push(this.fields[i]);
			else this.invalid.push(this.fields[i]);
		}
	};

	this.draw_errors=function(no_sel){
		var f=0, i;
		this.blinkme=null;
		for(i in this.invalid){
			if(!no_sel){
				if(!f){
					this.frm.elements[this.invalid[i]['i']].focus();
					f=1;
					if(this.alert_type=='alert') ShowAlert(uTypes[this.invalid[i]['dtype']]['msg']);
					this.blinkme=u('#'+this.frm.elements[ this.invalid[i]['i'] ].id);
					this.blink(0);
				}

				if(el=document.getElementById('err:'+this.invalid[i]['name'])){
					el.style.display='';
					el.innerHTML=uTypes[this.invalid[i]['dtype']]['msg'];
				}
			}
			if(u('#bad:'+this.invalid[i]['name'])!==false) u('#bad:'+this.invalid[i]['name']).show();
			if(u('#ok:'+this.invalid[i]['name'])!==false) u('#ok:'+this.invalid[i]['name']).hide();
		}

		for(i in this.valid){
			if(!no_sel){
				if(el=document.getElementById('err:'+this.valid[i]['name'])){
					el.innerHTML='&nbsp;';
					el.style.display='none';
				}
			}
			if(u('#bad:'+this.valid[i]['name'])!==false) u('#bad:'+this.valid[i]['name']).hide();
			if(u('#ok:'+this.valid[i]['name'])!==false) u('#ok:'+this.valid[i]['name']).show();
		}
	};

	this.blink=function(i){
		var _me=this; var _mei=(i+1);

		if(!this.blinkme) return false;

		if(i<4)
			setTimeout(function(){
				if(!_me.blinkme) return false;
				_me.blinkme.toggleClass(_me.blink_class);
				_me.blink(_mei);
			}, 200);
	};

	this.parse_frm=function(){
		this.before_parse_frm();
		this.frm=document.getElementById(this.frm_id);
		this.fields=[]; elm=this.frm.elements;

		for(i=0; i<this.frm.length; i++)
			if(elm[i].getAttribute('dtype')!=undefined){
				this.fields.push({
					'i':i,
					'name':elm[i].name,
					'value':elm[i].value,
					'type':elm[i].type,
					'dtype':elm[i].getAttribute('dtype')
				});
				if(elm[i].getAttribute('minlength')!==null)
					this.fields[(this.fields.length-1)]['minlength']=parseInt(elm[i].getAttribute('minlength'));
				if(elm[i].getAttribute('maxlength')!==null)
					this.fields[(this.fields.length-1)]['maxlength']=parseInt(elm[i].getAttribute('maxlength'));

				elm[i].validator=this;
			}

		this.draw_mask();
	};

	this.before_parse_frm=function(){
		for(i in uTypes){
			if(uTypes[i].parent==undefined || uTypes[ uTypes[i].parent ]==undefined) continue;
			for(j in uTypes[ uTypes[i].parent ]) if(uTypes[i][j]==undefined) uTypes[i][j]=uTypes[ uTypes[i].parent ][j];
			delete uTypes[i].parent;
		}
	};

	this.check_length=function(o){
		var n=parseInt(o.getAttribute('maxlength'));
		if(o.value.length<=n) return true;
		o.value=o.value.substring(0, n);
	};
}