/*
*	27/03/2006
*	Forms Javascript Validator
*	Compatible with :
*		Internet Explorer 6.0
*		Opera 8.53/9.0 beta
*		Mozilla Firefox 1.5
*		Mozilla 1.7.12
*		Netscape 7.2/8.0
*
*  	Copyright notice
*
*  	(c) 2006 Razvan Stanga <razvan_stanga [AT] yahoo.com>
*  	All rights reserved
*
*	This script is part of of my personal weblog located at www.phprebel.org
*	and for www.sweblog.net blogging website
*	
*	If you find this usefull and decide to use it please remember that
*	this copyright notice MUST APPEAR in all copies of this script
*/

function Validator ( _form_obj, _id ) {
	this.form_obj = _form_obj;
 	this._id = _id;
	this.form_objelements = new Array ();
	this.onsubmit = '';
	this.error = '';
	this.classError = 'field';
	this.classNormal = 'field';
	this.errortxt = '';
    return true;
};

Validator.prototype.startCheck = function () {
	// checking form
	try {
		eval ('document.forms.'+this.form_obj+'.name');
	}
	catch ( ex ) {
		this.error += 'Form `'+this.form_obj+'` does not exist\n';
	}
	
	// checking elements
	for (i=0;i<this.form_objelements.length;i++) {
		try {
		    if ( this.form_objelements[i]['element'] != null ) {
				eval ('document.forms.'+this.form_obj+'.'+this.form_objelements[i]['element']+'.name');
			}
		}
		catch ( ex ) {
			this.error += 'Form element `'+this.form_objelements[i]['element']+'` does not exist\n';
		}
	}
	if ( this.error != '' ) {
		alert ( this.error );
		return false;
	}
};

Validator.prototype.addElement = function ( _el, _el_error, _el_type, _el_arguments ) {
	i = this.form_objelements.length;
	this.form_objelements[i] = new Object ();
	this.form_objelements[i]['element'] = _el.toString ();
	this.form_objelements[i]['error'] = _el_error.toString ();
	this.form_objelements[i]['type'] = _el_type.toString ();
	this.form_objelements[i]['arguments'] = _el_arguments.toString ();
};

Validator.prototype.removeElement = function ( _el ) {
	i = this.form_objelements.length;
	for (_i=0;_i<i;_i++) {
		if (this.form_objelements[_i]['element'] == _el.toString ()) {
			this.form_objelements[_i]['element'] = null;
		}
	}
};

Validator.prototype.is_empty = function ( _str ) {
    return _str.search ("^[ \t\n\r]*$")>-1 ? true : false;
};

Validator.prototype.is_numeric = function (_str) {
    return _str.search("^[0-9]*$")>-1 ? true : false;
};

Validator.prototype.is_alphabethic = function (_str) {
    return _str.search("^[a-zA-Z ]*$")>-1 ? true : false;
};

Validator.prototype.is_alphanumeric = function (_str) {
    return _str.search("^[a-zA-Z0-9 ]*$")>-1 ? true : false;
};

Validator.prototype.is_email = function (_email) {
	if (/^[a-zA-Z0-9]+([\.-_]?[a-zA-Z0-9]+)*@[a-zA-Z0-9]+([\.-]?[a-zA-Z0-9]+)*(\.[a-zA-Z0-9]{2,4})+$/.test(_email)) {
		return true;
	} else {
		return false;
	}
};

Validator.prototype.is_file = function (_str, _exts) {
	_ext = _str.split ('.');
	_ext = _ext[ _ext.length-1 ]/*.substr (0,3)*/;
	for (i=0;i<_exts.length;i++) {
		if ( _exts[i] == _ext.toLowerCase() ) {
			return true;
		}
	}
	return false;
};

Validator.prototype.is_date = function (_str) {
	_date 	= _str.split ('-');
	_year 	= parseInt (_date[0]);
	_month 	= parseInt (_date[1])-1;
	_day 	= parseInt (_date[2]);
	__date 	= new Date(_year, _month, _day);	
	__year 	= __date.getFullYear();	
	__month = __date.getMonth();	
	__day 	= __date.getDate();
	
	//alert ( _year+'-'+_month+'-'+_day+' = '+__year+'-'+__month+'-'+__day );
    if ( _day == __day && _month == __month && _year == __year  ) {
		return true;
    } else {
		return false;
	}
};

Validator.prototype.is_datecheck = function (_str, _str1, _op) {
	if ( this.is_date (_str) == false || this.is_date (_str1) == false ) {
		return false;
	}
	_date 	= _str.split ('-');
	_year 	= parseInt (_date[0]);
	_month 	= parseInt (_date[1])-1;
	_day 	= parseInt (_date[2]);
	_date 	= new Date(_year, _month, _day);
	_time	= _date.getTime();
	_date 	= _str1.split ('-');
	_year 	= parseInt (_date[0]);
	_month 	= parseInt (_date[1])-1;
	_day 	= parseInt (_date[2]);
	_date 	= new Date(_year, _month, _day);
	_time1	= _date.getTime();	
	
	if ( _op == 'db' ) {
		_ret = (_time < _time1) ? true : false;
	} else if ( _op == 'da' ) {
		_ret = (_time > _time1) ? true : false;
	}

	return _ret;
};

Validator.prototype.is_url = function (_str) {
	var regexp = /^(ftp|http|https):\/\/[A-Za-z0-9\.-]{3,}\.[A-Za-z]{2,5}$/
	return regexp.test (_str);
};

Validator.prototype.check_text = function (_form, _el, _arguments) {
	ret = new Array ();
	el = eval('document.forms.'+_form+'.'+_el);
	el_length = parseFloat ( isNaN (el.length) ? 0 : el.length );

    ret[ ret.length ] = this.is_empty(el.value);
    
    if ( this.is_empty (_arguments) == false ) {
    	_arguments = _arguments.split ('|');
    	for ( i=0;i<_arguments.length;i++ ) {
    		arg = _arguments[i].split (':');
    		if ( arg[0] == 'min' ) {
				ret[ ret.length ] = (el.value.length < parseFloat (arg[1])) ? true : false;
    		} else if ( arg[0] == 'max' ) {
				ret[ ret.length ] = (el.value.length > parseFloat (arg[1])) ? true : false;
    		} else if ( arg[0] == 'email' ) {
				ret[ ret.length ] = this.is_email(el.value) ? false : true;
    		} else if ( arg[0] == 'numeric' ) {
				ret[ ret.length ] = this.is_numeric(el.value) ? false : true;
    		} else if ( arg[0] == 'alphabethic' ) {
				ret[ ret.length ] = this.is_alphabethic(el.value) ? false : true;
    		} else if ( arg[0] == 'alphanumeric' ) {
				ret[ ret.length ] = this.is_alphanumeric(el.value) ? false : true;
    		} else if ( arg[0] == 'date' ) {
				ret[ ret.length ] = this.is_date(el.value) ? false : true;
    		} else if ( arg[0] == 'datebefore' ) {
				ret[ ret.length ] = this.is_datecheck(el.value, arg[1], 'db') ? false : true;
    		} else if ( arg[0] == 'dateafter' ) {
				ret[ ret.length ] = this.is_datecheck(el.value, arg[1], 'da') ? false : true;
    		} else if ( arg[0] == 'url' ) {
				ret[ ret.length ] = this.is_url(el.value) ? false : true;
    		}
    	}
	}

    for ( i=0;i<ret.length;i++ ) {
    	if ( ret[i] == true ) {
			el.className = this.classError;
    		return true;
    	}
    }
	el.className = this.classNormal;
	return false;
};

Validator.prototype.check_checkbox = function (_form, _el, _arguments) {
	ret = new Array ();
	el = eval('document.forms.'+_form+'.'+_el);
	el_length = parseFloat ( isNaN (el.length) ? 0 : el.length );

	if ( el_length > 0 ) {
		for ( j=0;j<el_length;j++ ) {
			ret[ ret.length ] = el[j].checked;
		}
	} else {
		 ret[ ret.length ] = el.checked;
	}
    
	total = 0;
    for ( i=0;i<ret.length;i++ ) {
		total += (ret[i] == true) ? 1: 0;
    }

	ret = new Array ();
	ret[ret.length] = (total == 0) ? true : false;

    _arguments = _arguments.split ('|');
    for ( i=0;i<_arguments.length;i++ ) {
    	arg = _arguments[i].split (':');
    	if ( arg[0] == 'min' ) {
			ret[ret.length] = (total < arg[1]) ? true : false;
    	} else if ( arg[0] == 'max' ) {
			ret[ret.length] = (total > arg[1]) ? true : false;
    	}
    }
	
	className = this.classNormal;
	toRet = false;
	for ( i=0;i<ret.length;i++ ) {
		if ( ret[i] == true ) {
			className = this.classError;
			toRet = true;
		}
	}

	if ( el_length > 0 ) {
		for ( j=0;j<el_length;j++ ) {
			//el[j].className = className;
		}
	} else {
		//el.className = className;
	}	
	
	return toRet;
};

Validator.prototype.check_radio = function (_form, _el, _arguments) {
	ret = new Array ();
	el = eval('document.forms.'+_form+'.'+_el);
	el_length = parseFloat ( el.length );
    
	for ( j=0;j<el_length;j++ ) {
		ret[ ret.length ] = el[j].checked;
	}
    
    for ( i=0;i<ret.length;i++ ) {
   		if ( ret[i] == true ) {
			for ( j=0;j<el_length;j++ ) {
				el[j].className = this.classNormal;
			}
			return false;
   		}
    }
	for ( j=0;j<el_length;j++ ) {
		el[j].className = this.classError;
	}
	return true;
};

Validator.prototype.check_select = function (_form, _el, _arguments) {
	ret = new Array ();
	el = eval('document.forms.'+_form+'.'+_el);
	el_length = parseFloat ( el.length );

	total = 0;
	for ( j=0;j<el_length;j++ ) {
		if ( el[j].selected == true ) {
			total += 1;
			ret[ ret.length ] = this.is_empty (el[j].value) ? true : false;
		}
	}
	
    _arguments = _arguments.split ('|');
    for ( i=0;i<_arguments.length;i++ ) {
    	arg = _arguments[i].split (':');
    	if ( arg[0] == 'min' ) {
			ret[ret.length] = (total < arg[1]) ? true : false;
    	} else if ( arg[0] == 'max' ) {
			ret[ret.length] = (total > arg[1]) ? true : false;
    	}
    }
	
    for ( i=0;i<ret.length;i++ ) {
    	if ( ret[i] == true ) {
			el.className = this.classError;
    		return true;
    	}
    }		
	el.className = this.classNormal;
	return false;
};

Validator.prototype.check_file = function (_form, _el, _arguments) {
	ret = new Array ();
	el = eval('document.forms.'+_form+'.'+_el);
    ret[ ret.length ] = this.is_empty (el.value);
    
    _arguments = _arguments.split ('|');
    for ( i=0;i<_arguments.length;i++ ) {
    	arg = _arguments[i].split (':');
    	if ( arg[0] == 'ext' ) {
			ret[ ret.length ] = this.is_file (el.value, arg[1].split (',')) ? false : true;
    	}
    }
    
    for ( i=0;i<ret.length;i++ ) {
    	if ( ret[i] == true ) {
			el.className = this.classError;
    		return true;
    	}
    }
	el.className = this.classNormal;
	return false;
};


Validator.prototype.doarguments = function (el_obj) {
	_arguments = el_obj['arguments'].split ('|');
	if ( _arguments.length >= 1 && _arguments[0] != '' ) {
		//this.onsubmit += '\\'+'n';
	}

	for ( j=0;j<_arguments.length;j++ ) {
		arg = _arguments[j].split (':');
		if ( arg[0] == 'min' ) {
			//this.onsubmit += ' - Minimum : '+arg[1]+'';
		} else if ( arg[0] == 'max' ) {
			//this.onsubmit += ' - Maximum : '+arg[1]+'';
		} else if ( arg[0] == 'email' ) {
			//this.onsubmit += ' - Must be a valid email address';
		} else if ( arg[0] == 'numeric' ) {
			//this.onsubmit += ' - Must be a valid number';
		} else if ( arg[0] == 'alphabethic' ) {
			//this.onsubmit += ' - Must be a valid alphabethic string';
		} else if ( arg[0] == 'alphanumeric' ) {
			//this.onsubmit += ' - Must be a valid alphanumeric string';
		} else if ( arg[0] == 'ext' ) {
			//this.onsubmit += ' - Extensii permise : '+arg[1];
		} else if ( arg[0] == 'date' ) {
			//this.onsubmit += ' - Must be a valid date';
		} else if ( arg[0] == 'datebefore' ) {
			//this.onsubmit += ' - Must be a date before '+arg[1];
		} else if ( arg[0] == 'dateafter' ) {
			//this.onsubmit += ' - Must be a date after '+arg[1];
		} else if ( arg[0] == 'url' ) {
			//this.onsubmit += ' - Must be a valid URL';
		}
		
		if ( (j+1) < _arguments.length ) {
			//this.onsubmit += '\\'+'n';
		}
	}
	
	if ( _arguments.length ) {
		this.onsubmit += '\\'+'n';
	}
};

Validator.prototype.validate = function (el_obj) {
	el = eval('document.forms.'+this.form_obj+'.'+el_obj['element']);
	if ( el_obj['type'] == 'text' ) {
    	this.onsubmit += 'if ( '+this._id+'.check_text ( \''+this.form_obj+'\', \''+el_obj['element']+'\', \''+el_obj['arguments']+'\' ) ) {\n';
		this.onsubmit += '\terror += "';
		this.onsubmit += '   '+el_obj['error']+'';
		this.doarguments (el_obj);
		// [BETA] trying something, onkeyup
		el.onkeyup = function () {
			//v.check_text ( v.form_obj, el_obj['element'], el_obj['arguments'] );
		}
		
		this.onsubmit += '";\n';
		this.onsubmit += '}\n';
   	} else if ( el_obj['type'] == 'checkbox' ) {
	   	this.onsubmit += 'if ( '+this._id+'.check_checkbox ( \''+this.form_obj+'\', \''+el_obj['element']+'\', \''+el_obj['arguments']+'\' ) ) {\n';
		this.onsubmit += '\terror += "';
		this.onsubmit += '   '+el_obj['error']+'';
		this.doarguments (el_obj);
		// [BETA] trying something, onclick
		el.onclick = function () {
			//v.check_checkbox ( v.form_obj, el_obj['element'], el_obj['arguments'] );
		}
		
		this.onsubmit += '";\n';
		this.onsubmit += '}\n';						
	} else if ( el_obj['type'] == 'radio' ) {
	   	this.onsubmit += 'if ( '+this._id+'.check_radio ( \''+this.form_obj+'\', \''+el_obj['element']+'\', \''+el_obj['arguments']+'\' ) ) {\n';
		this.onsubmit += '\terror += "';
		this.onsubmit += '   '+el_obj['error']+'';
		this.doarguments (el_obj);
		this.onsubmit += '";\n';
		this.onsubmit += '}\n';						
	} else if ( el_obj['type'] == 'select' ) {
	   	this.onsubmit += 'if ( '+this._id+'.check_select ( \''+this.form_obj+'\', \''+el_obj['element']+'\', \''+el_obj['arguments']+'\' ) ) {\n';
		this.onsubmit += '\terror += "';
		this.onsubmit += '   '+el_obj['error']+'';
		this.doarguments (el_obj);
		// [BETA] trying something, onselect
		el.onclick = function () {
			//v.check_select ( v.form_obj, el_obj['element'], el_obj['arguments'] );
		}
		
		this.onsubmit += '";\n';
		this.onsubmit += '}\n';						
	} else if ( el_obj['type'] == 'file' ) {
	   	this.onsubmit += 'if ( '+this._id+'.check_file ( \''+this.form_obj+'\', \''+el_obj['element']+'\', \''+el_obj['arguments']+'\' ) ) {\n';
		this.onsubmit += '\terror += "';
		this.onsubmit += '   '+el_obj['error']+'';
		this.doarguments (el_obj);
		this.onsubmit += '";\n';
		this.onsubmit += '}\n';						
	}
	
	//alert ( this.onsubmit );
     	
    return true;
};

Validator.prototype.validateIT = function () {
	this.startCheck ();
	this.onsubmit = '';
	this.error = '';
	this.onsubmit += 'function () {\n';
	this.onsubmit += 'error = "";\n';
	for ( i=0;i<this.form_objelements.length;i++ ) {
		if ( this.form_objelements[i]['element'] != null ) {
			this.validate ( this.form_objelements[i] );
		}
	}
	this.onsubmit += 'if ( error ) { alert ("Ai uitat sa completezi:\\n"+error); return false; } else { return true; }\n';
	this.onsubmit += '}\n';

	eval ('document.forms.'+this.form_obj+'.onsubmit = '+this.onsubmit+'');

	//alert ( eval ('document.forms.'+this.form_obj+'.onsubmit') );
};
