
function validate (){
	
	this.elements = [];
	this.submitAddButton = 'submit-add';
	this.submitEditButton = 'submit-edit';
	var self = this;
	
	this.init = function () {
		jQuery.each( this.elements, function(index, item){
			$('#' + item[0]).bind('keyup', function (e) {			
				validateInput(this, item[1]);
				return true;
			});
			$('#' + item[0]).bind('change', function (e) {
				validateInput(this, item[1]);
				return true;
			});
			$('input[type="text"], input[type="checkbox"]input[type="radio"], textarea').focus(function (){				
				removeMessagebox();				
			});
			if($('#' + item[0]).length>0)validateInput($('#' + item[0]), item[1]);
		});
		$('#'+this.submitAddButton).click(function(e)
		{			
			return self.validateForm()
		})	
		$('#'+this.submitEditButton).click(function(e)
		{			
			return self.validateForm()
		})				
		$('.validation_message').each( function (item) {
			if(item.innerHTML==''){
				$(item).css({'display': 'none', 'width': '300px', 'height': '20px'});
			}
		});		
		this.validateForm();		
	};
	
	//------------------------------------------------------------------------------------------------------------------
	
	function removeMessagebox() {
		$('.message-box').html(null);		
	}
	
	//------------------------------------------------------------------------------------------------------------------


	function validateInput(element, type) 
	{
		var res = 0;
		switch (type )
		{
			case 'alpha':
				if ( ! isAlpha($(element).val()) || isEmpty($(element).val())) {
					res = 1;
				}
				break;
			case 'numeric':
				if ( ! isNumeric($(element).val()) || isEmpty($(element).val()) ) {
					res = 2;
				}
				break;
			case 'alphanumeric':
				if ( ! isAlphaNumeric($(element).val()) || isEmpty($(element).val()) )  {
					res = 3;
				}
				break;
			case 'password':
				var passed = isPassword($(element).val(), {
					length:   [6, 15],
					alpha:    1
				});
				if ( ! passed ) {
					res = 4;
				}
				break;
			case 'email':
				if ( ! isEmail($(element).val())) {
					res = 5;
				}
				break;
			case 'empty':
				if ( isEmpty($(element).val())) {
					res = 6;
				}
				break;
			case 'domain':
				if ( ! isDomain($(element).val()) ) {
					res = 7;
				}
				break;
			case 'price':
				if ( ! isPrice($(element).val()) ) {
					res = 8;
				}
				break;
			case 'alphaNumericSpace':
				if ( ! isAlphaNumericSpace($(element).val()) || isEmpty($(element).val()) )  {
					res = 9;
				}
				break;
			case 'telephone':
				if ( isEmpty($('#telephone').val()) && isEmpty($('#cellphone').val()) ) {
					res = 10;
				}
				
				if($(element).attr('id') == 'telephone') {
					self.setFlag($('#cellphone'), res);
				}
				else {
					self.setFlag($('#telephone'), res);
				}
				break;
			case 'zipcode':
				if ( ! isZipcode($(element).val()) ) {
					res = 11;
				}
				break;
			case 'username':
				if ( ! isAlphaNumeric($(element).val()) || ! isLengthBetween($(element).val(), 3, 25) )
				{
					res = 12
				}							
			default:

		}		
		self.setFlag(element, res);

		return res;


	};
	
	//------------------------------------------------------------------------------------------------------------------
	
	
	this.setFlag = function (element, res) {
		
		var id = $(element).attr('id');
		
		var parent = $('#'+$(element).attr('id')+'_validationflag').parent();
		
		$('#'+id+'_validationflag').remove();	
		$('#'+id+'_wtooltip').remove();
		
		if((res > 0)) {
			$(parent).append('<img id="'+id+'_validationflag" src="/cfg/img/config/flag-error.png" />');		
			$('#'+id+'_validationflag').wTooltip({id:id+'_wtooltip' ,content:errorMessage(res)});
			$('#'+id+'_validationflag').css('cursor', 'pointer');
		}
		else {
			$(parent).append('<img  id="'+id+'_validationflag" src="/cfg/img/config/flag-ok.png" />');										
			$('#'+id+'_validationflag').css('cursor', 'default');
		}

	}

	//------------------------------------------------------------------------------------------------------------------


	function errorMessage(errnr) {
		var t = '';
		switch (errnr) {
			case 1:
				t ='Enkel A-Z en a-z';
				break;
			case 2:
				t ='Enkel 0-9';
				break;
			case 3:
				t ='Enkel A-Z, a-z en 0-9';
				break;
			case 4:
				t ='Wachtwoord moet bestaan uit 7-15 karakters bestaan.';
				break;
			case 5:
				t ='Het email is adres is (nog) niet (goed) ingevuld (uw.naam@domein.nl)';
				break;
			case 6:
				t ='Dit invoervak is (nog) niet (goed) ingevuld';
				break;
			case 7:
				t ='Domein fout';
				break;
			case 8:
				t ='De prijs is (nog) (niet) goed ingevuld';
				break;
			case 9:
				t ='Enkel A-Z, a-z, 0-9 en spaties';
				break;
			case 10:
				t ='Het telefoonnummer is (nog) (niet) goed ingevuld';
				break;
			case 11:
				t ='De postcode is (nog) (niet) goed ingevuld';
				break;
			case 12:
				t ='De gebruikersnaam moet uit letters en/of cijfers en uit 3-25 karakters bestaan';
				break;
			default:
				t ='';
		}
		return t;
	};
	
	//-----------------------------------------------------------------------------------------------------------------//

	
	this.validateForm = function () 
	{			
		try 
		{
			var bValid		= true;
			var errnr		= 0;
			var id;
			for( var i = 0; i < this.elements.length; i++) 
			{
				id = this.elements[i][0];	
				if ($('#' + id).length > 0 ) 
				{	
					errnr = validateInput($('#' + id), this.elements[i][1]);
					if (errnr > 0 ) {bValid = false; break;}	
				}
			};	
			return bValid;	
		}
		catch(e) {
			alert(e);
			return false;
		}	
		return false;	
	};
	
	
	//-----------------------------------------------------------------------------------------------------------------//

	
	
	function checkoutValid(step){
	
		var bValid		= true;
		var errnr		= 0;
		var id;
	
	
		switch (step) {
	
			case '1':
				var aElements = [
				          		  ['initials', 'empty']
			          	    	//, ['firstname', 'empty']
			          	    	, ['lastname', 'empty']
			          			, ['telephone', 'telephone']
			          			, ['cellphone', 'telephone']
			          			, ['email', 'email']
			          			  ];
	
				break;
			case '2':
				var aElements = [
				         		  ['address', 'empty']
				             	, ['residence', 'empty']
				             	, ['zipcode', 'empty']
				         		];
	
		}
	
		for( var i = 0; i < aElements.length; i++) {
	
			id = aElements[i][0];
	
			if ($('#' + id).length > 0 ) {
	
				errnr = validateInput($('#' + id), aElements[i][1]);
	
				if (errnr > 0 ) {bValid = false; break;}
	
			}
		};
	
		if (!bValid) {
			$('#explanation').css('display', 'block');
			$('#explanation').appendTo('#step-'+step);
		}
		else {
			$('#explanation').css('display', 'none');
		}
		
	
		return bValid;
	
	}
	
	
	//-----------------------------------------------------------------------------------------------------------------//
	
	
	// returns true if the string is empty
	function isEmpty(str){
	  return (str == null) || (str.length == 0);
	}
	
	function isPrice(str){
		if(isEmpty(str)) return true;
		var re = /^\d+(\,\d{1,2})?$/				
		return re.test(str);
	}
	
	
	// returns true if the string is a valid email
	function isEmail(str){
	  if(isEmpty(str)) return false;
	  var re = /^[^\s()<>@,;:\/]+@\w[\w\.-]+\.[a-z]{2,}$/i
	  return re.test(str);
	}
	// returns true if the string only contains characters A-Z or a-z
	function isAlpha(str){
	  var re = /[^a-zA-Z]/
	  if (re.test(str)) return false;
	  return true;
	}
	// returns true if the string only contains characters 0-9
	function isNumeric(str){
	  var re = /[\D]/
	  if (re.test(str)) return false;
	  return true;
	}
	// returns true if the string only contains characters A-Z, a-z or 0-9
	function isAlphaNumeric(str){
	  var re = /[^0-9a-zA-Z]/
	  if (re.test(str)) return false;
	  return true;
	}
	
	// returns true if the string only contains characters A-Z, a-z or 0-9
	function isAlphaNumericSpace(str){
	  var re = /[^0-9a-zA-Z\s]/
	  if (re.test(str)) return false;
	  return true;
	}
	
	function isZipcode(str)
	{	
		var re = /^[1-9][0-9]{3}\s?[a-zA-Z]{2}$/
		return (re.test(str));		
	}
	
	// returns true if the string's length equals "len"
	function isLength(str, len){
	  return str.length == len;
	}
	// returns true if the string's length is between "min" and "max"
	function isLengthBetween(str, min, max){
	  return (str.length >= min)&&(str.length <= max);
	}
	// returns true if the string is a US phone number formatted as...
	// (000)000-0000, (000) 000-0000, 000-000-0000, 000.000.0000, 000 000 0000, 0000000000
	function isPhoneNumber(str){
	  var re = /^\(?[2-9]\d{2}[\)\.-]?\s?\d{3}[\s\.-]?\d{4}$/
	  return re.test(str);
	}
	// returns true if the string is a valid date formatted as...
	// mm dd yyyy, mm/dd/yyyy, mm.dd.yyyy, mm-dd-yyyy
	function isDate(str){
	  var re = /^(\d{1,2})[\s\.\/-](\d{1,2})[\s\.\/-](\d{4})$/
	  if (!re.test(str)) return false;
	  var result = str.match(re);
	  var m = parseInt(result[1]);
	  var d = parseInt(result[2]);
	  var y = parseInt(result[3]);
	  if(m < 1 || m > 12 || y < 1900 || y > 2100) return false;
	  if(m == 2){
	          var days = ((y % 4) == 0) ? 29 : 28;
	  }else if(m == 4 || m == 6 || m == 9 || m == 11){
	          var days = 30;
	  }else{
	          var days = 31;
	  }
	  return (d >= 1 && d <= days);
	}
	// returns true if "str1" is the same as the "str2"
	function isMatch(str1, str2){
	  return str1 == str2;
	}
	// returns true if the string contains only whitespace
	// cannot check a password type input for whitespace
	function isWhitespace(str){ // NOT USED IN FORM VALIDATION
	  var re = /[\S]/g
	  if (re.test(str)) return false;
	  return true;
	}
	// removes any whitespace from the string and returns the result
	// the value of "replacement" will be used to replace the whitespace (optional)
	function stripWhitespace(str, replacement){// NOT USED IN FORM VALIDATION
	  if (replacement == null) replacement = '';
	  var result = str;
	  var re = /\s/g
	  if(str.search(re) != -1){
	    result = str.replace(re, replacement);
	  }
	  return result;
	}
	
	function isPassword (pw, options) {
		var o = {
			lower:    0,
			upper:    0,
			alpha:    0, /* lower + upper */
			numeric:  0,
			special:  0,
			length:   [0, Infinity],
			custom:   [ /* regexes and/or functions */ ],
			badWords: [],
			badSequenceLength: 0,
			noQwertySequences: false,
			noSequential:      false
		};
	
		for (var property in options)
			o[property] = options[property];
	
		var	re = {
				lower:   /[a-z]/g,
				upper:   /[A-Z]/g,
				alpha:   /[A-Z]/gi,
				numeric: /[0-9]/g,
				special: /[\W_]/g
			},
			rule, i;
	
		// enforce min/max length
		if (pw.length < o.length[0] || pw.length > o.length[1])
			return false;
	
		// enforce lower/upper/alpha/numeric/special rules
		for (rule in re) {
			if ((pw.match(re[rule]) || []).length < o[rule])
				return false;
		}
	
		// enforce word ban (case insensitive)
		for (i = 0; i < o.badWords.length; i++) {
			if (pw.toLowerCase().indexOf(o.badWords[i].toLowerCase()) > -1)
				return false;
		}
	
		// enforce the no sequential, identical characters rule
		if (o.noSequential && /([\S\s])\1/.test(pw))
			return false;
	
		// enforce alphanumeric/qwerty sequence ban rules
		if (o.badSequenceLength) {
			var	lower   = "abcdefghijklmnopqrstuvwxyz",
				upper   = lower.toUpperCase(),
				numbers = "0123456789",
				qwerty  = "qwertyuiopasdfghjklzxcvbnm",
				start   = o.badSequenceLength - 1,
				seq     = "_" + pw.slice(0, start);
			for (i = start; i < pw.length; i++) {
				seq = seq.slice(1) + pw.charAt(i);
				if (
					lower.indexOf(seq)   > -1 ||
					upper.indexOf(seq)   > -1 ||
					numbers.indexOf(seq) > -1 ||
					(o.noQwertySequences && qwerty.indexOf(seq) > -1)
				) {
					return false;
				}
			}
		}
	
		// enforce custom regex/function rules
		for (i = 0; i < o.custom.length; i++) {
			rule = o.custom[i];
			if (rule instanceof RegExp) {
				if (!rule.test(pw))
					return false;
			} else if (rule instanceof Function) {
				if (!rule(pw))
					return false;
			}
		}
	
		// great success!
		return true;
	}
	
	
	function isNumber(nr) {
		return /^-?\d+$/.test(nr);	
	}
	
	this.isDomain = function (url) {
	    var re = /^([a-z0-9]([-a-z0-9]*[a-z0-9])?\.)+((a[cdefgilmnoqrstuwxz]|aero|arpa)|(b[abdefghijmnorstvwyz]|biz)|(c[acdfghiklmnorsuvxyz]|cat|com|coop)|d[ejkmoz]|(e[ceghrstu]|edu)|f[ijkmor]|(g[abdefghilmnpqrstuwy]|gov)|h[kmnrtu]|(i[delmnoqrst]|info|int)|(j[emop]|jobs)|k[eghimnprwyz]|l[abcikrstuvy]|(m[acdghklmnopqrstuvwxyz]|mil|mobi|museum)|(n[acefgilopruz]|name|net)|(om|org)|(p[aefghklmnrstwy]|pro)|qa|r[eouw]|s[abcdeghijklmnortvyz]|(t[cdfghjklmnoprtvwz]|travel)|u[agkmsyz]|v[aceginu]|w[fs]|y[etu]|z[amw])$/i
	    if (!re.test(url)) return false;
	    return true;
	    
	}
	
	
	
	
}