// Client-side Validator
// Author: Tommy Lesmeister
// Company: Goes & Roos

// Determinate Client-side validation
var SFV_BALLOON 	= 2;
var SFV_HIGHLIGHT 	= 4;
var SFV_INFIELD 	= 8;
var SFV_COLORBOX	= 16;
var SFV_ONTHEFLY	= 32;
var SFV_TOOLTIP		= 64;

var SFV_TYPE 		= SFV_BALLOON|SFV_HIGHLIGHT|SFV_COLORBOX|SFV_ONTHEFLY|SFV_TOOLTIP;

//**************************************************************
// Validatie-types
var SFC_NOVALIDATE 			= 0; // Er hoeft geen validatie uitgevoerd te worden.
var SFC_VALIDATE_EMAIL 		= 1; // Er dient een email adres gevalideerd te worden.
var SFC_VALIDATE_INTEGER	= 2; // Het valideren van een getal
var SFC_VALIDATE_POSTCODE	= 3; // Het valideren van een postcode
var SFC_VALIDATE_CHARS		= 4; // Het valideren van karakters only!
var SFC_VALIDATE_INTCHARS   = 5; // Het valideren van getallen en karakters.
var SFC_VALIDATE_TELFAX		= 6; // Het valideren van een telefoon/fax nummer
var SFC_VALIDATE_DATE		= 7; // Het valideren van een datum
var SFC_VALIDATE_TEXT		= 8; // Het valideren van een textarea
var SFC_VALIDATE_CHECK		= 9; // Het controleren of een veld leeg is of niet.

var sfc_alerts = { 
	0 : " is niet ingevuld. Dit veld is verplicht.",
	1 : " is een ongeldig email adres.",
	2 : " mag alleen uit getallen bestaan.",
	3 : " is incorrect, correcte invoer is: 1234AB.",
	4 : " mag alleen uit karakters bestaan.",
	5 : " mag alleen uit karakters en cijfers bestaan.",
	6 : " is geen geldig telefoon nummer.",
	7 : " is geen geldige datum, correcte invoer is: DD/MM/YYYY of DD-MM-YYYY.",
	8 : " bevat ongeldige karakters.",
	9 : " is mogelijk geen keuze gemaakt."
};

var sfc_element = function( name, type ) {
	if( !name ) name = 0;
	if( !type ) type = 0;
	
	return { name : name, type : type };
}

// Slaat de niet-gevalideerde elementen op
var sfc_elements = [];

// ShowValidationLog
// Weergeeft een overzicht van de niet-gevalideerde elementen
//**************************************************************
function ShowValidationLog() {
	// Dit zou nooit mogen gebeuren 
	if( sfc_elements <= 0 )
		return;
		
	var logContent = "<div id=\"SmartFormColorLog\"><h4>De volgende velden dient u aan te passen of in te vullen.</h4>\n<ul>";
	var tmp, isRegistered = "";
	
	// Door de lijst heen iterate
	for( var e=0; e<sfc_elements.length; ++e ) {
		if( isRegistered.indexOf( sfc_elements[ e ].name ) == -1 ) {
			tmp = sfc_elements[ e ].name.replace( "*", "" ); // 02-03-2010 Voor het verwijderen van asteriks
			logContent += "<li>" + tmp + sfc_alerts[ sfc_elements[ e ].type ] + "</li>";
			isRegistered += sfc_elements[ e ].name;
		}
	}
	
	logContent += "</ul><p>Controleer uw ingevulde gegevens en probeer het nogmaals.</p></div>";

	// Even alles wegschrijven.
	if( isValMethod( SFV_COLORBOX ) ) {
		// Even controlleren of het jQuery lib wel bestaat
	//	if( typeof jQuery != 'undefined' )
	//		jQuery.fn.colorbox({transition:"elastic", width:"30%", height:"30%", html:'<p><b>Het formulier is niet correct ingevuld</b></p><p>'+logContent+'</p>', title:"Melding formulier", open:true}); 
		if( typeof Shadowbox != "undefined" ) 
		//logContent = "<p>"+logContent+"</p>";	
		Shadowbox.open( { content: logContent, player:"html", title:"Het formulier is niet correct ingevuld<br>", height:350, width:500 } );

	} else {
		document.getElementById( "SmartFormLog" ).innerHTML = logContent;
		document.getElementById( "SmartFormLog" ).style.display = "block";
	}
}

// sfc_getLabel
// Haalt de juiste label op bij het genoemde element
//**************************************************************
function sfc_getLabel( name ) {
	var labels = document.getElementById( name ).parentNode;
	
	if( !labels || labels == null||document.getElementById( name ).tagName.toLowerCase()=='textarea' )
		return name;
		
	// 19-03-10 - gewijzigd ivm label to div
	labels = labels.getElementsByTagName( "div" );
	for(var n=0,l=labels.length;n<l;++n) {
		if(labels[n].className == "smartlabel") return labels[n].innerHTML;
	}
	
	return name;
	// 19-03-10 - einde
	//labels = labels.getElementsByTagName( "label" );
	
	//return labels[0].innerHTML;
}


// isValMethod
// Simpele controle of het validatie type voldoet aan onze 
// criteria.
//**************************************************************
function isValMethod( required ) {
	return ( SFV_TYPE & required ) > 0;
}


function ValidateMe( element ) {
	var ValidateType = document.getElementById( "valtype_" + element.id ).value;
		
	if( !ClientValidator.isEmpty( element.value ) ) {
		if( !ValidateFormItem( element.id, ValidateType ) ) {
			element.className = "validator_invalid";
			// Tooltip na het valideren
			if( isValMethod( SFV_TOOLTIP ) ) {
				if( typeof myGR_Tooltip != 'undefined' ) myGR_Tooltip.addElement( element.id );
			}
		} else {
			element.className = ""; //"validator_valid";
			// Tooltip na het valideren
			if( isValMethod( SFV_TOOLTIP ) ) {
				if( typeof myGR_Tooltip != 'undefined' ) myGR_Tooltip.rmElement( element.id );
			}
		}
	} else {
		element.className = "";
		// Tooltip na het valideren
		if( isValMethod( SFV_TOOLTIP ) ) {
			if( typeof myGR_Tooltip != 'undefined' ) myGR_Tooltip.rmElement( element.id );
		}
	}
}
// ValidateForm
// Valideert ieder form element
//**************************************************************
function ValidateForm() {
	var smartElements = document.getElementById( "SmartForm" ).getElementsByTagName( "*" );
	var smartElement, ValidateType, ValidateElement; // Pre-defineren
	
	// Resetten 
	sfc_elements = [];
	
	// Loop door de lijst heen
	for( var i=0,l=smartElements.length;i<l;++i ) {
		smartElement = smartElements[ i ].id;

		// Is er een validatie methode?
		if( smartElement.indexOf( "valtype_" ) == -1 )
			continue;
			
		// Instellingen overslaan...
		if( smartElement.indexOf( "sfc_" ) != -1 ) // Dubbel op maar ja 
			continue;
			
		ValidateType = smartElements[ i ].value;
		ValidateElement = smartElement.substr( 8, smartElement.length );
		
		if( ValidateType == '0' || ValidateType == 0 )
			continue;
			
		// Tijd om het element te valideren
		if( !ValidateFormItem( ValidateElement, ValidateType ) ) {
			// Force!!
			if( ClientValidator.isEmpty( document.getElementById( ValidateElement ).value ) )
				ValidateType = 0;
			
			// Eventuele highlighting toevoeging
			if( isValMethod( SFV_HIGHLIGHT ) ) {
				document.getElementById( ValidateElement ).className = "validator_invalid"; // LET OP: Deze word ook gebruikt voor de tooltip..
			}
			
			// Tooltip na het valideren
			if( isValMethod( SFV_TOOLTIP ) ) {
				if( typeof myGR_Tooltip != 'undefined' ) {
					myGR_Tooltip.addElement( ValidateElement );
				}
			}
			
			// Haal de label van het element op
			ValidateElement = sfc_getLabel( ValidateElement );
			
			sfc_elements.push( sfc_element( ValidateElement, ValidateType ) );
		} else {
			// Unsetting gebeurt hier voor highlight validatie bijvoorbeeld.
			
			// Als highlighting ge-activeerd is, reset de className on valid.
			if( isValMethod( SFV_HIGHLIGHT ) ) {
				document.getElementById( ValidateElement ).className = "";
			}
			
			// Tooltip uitschakelen
			if( isValMethod( SFV_TOOLTIP ) ) {
				if( typeof myGR_Tooltip != 'undefined' ) {
					myGR_Tooltip.rmElement( ValidateElement );
				}
			}
		}		
	}
	
	// Als de lijst niet leeg is moeten we natuurlijk returnen
	if( sfc_elements.length > 0 ) {
		if( isValMethod( SFV_BALLOON ) )
			ShowValidationLog();
		return false;
	}
	
	return true;
}

//**************************************************************
function ValidateFormItem( ElementName, ValidateType ) {
	var		ValidateElement = document.getElementById( ElementName );

	// Als het element niet bestaat.
	if( !ValidateElement )
		return false;
	
	// Kies validatie methode
	switch( parseFloat( ValidateType ) ) {
		case SFC_NOVALIDATE:
			// Indien, de code hier toch beland, just break.
			break;
		case SFC_VALIDATE_EMAIL:
			if( !ClientValidator.isEmail( ValidateElement.value ) ) {
				return false;
			}
			break;
		case SFC_VALIDATE_INTEGER:
			if( !ClientValidator.isNumeric( ValidateElement.value ) ) {
				return false;
			}
			break;
		case SFC_VALIDATE_POSTCODE:
			if( !ClientValidator.isPostcode( ValidateElement.value ) ) {
				return false;
			}
			break;
		case SFC_VALIDATE_CHARS:
			if( !ClientValidator.isAlpha( ValidateElement.value ) ) {
				return false;
			}
			break;
		case SFC_VALIDATE_INTCHARS:
			if( !ClientValidator.isAlphaNum( ValidateElement.value ) ) {
				return false;
			}
			break;
		case SFC_VALIDATE_TELFAX:
			if( !ClientValidator.isTelephone( ValidateElement.value ) ) {
				return false;
			}
			break;
		case SFC_VALIDATE_DATE:
			if( !ClientValidator.isDate( ValidateElement.value ) ) {
				return false;
			}
			break;
		case SFC_VALIDATE_TEXT:
			if( !ClientValidator.isText( ValidateElement.value ) ) {
				return false;
			}
			break;
		// Tommy +- 28-04-2010 Radio button checking...
		case SFC_VALIDATE_CHECK:
			checks = document.forms['SmartForm'].elements[ElementName];
			for(var c=0;c<checks.length;++c) {
				if( checks[c].checked ) return true;
			}
			return false;
			//return document.forms['SmartForm'].elements[ElementName].checked;
			break;
		/* Tommy +- 28-04-2010
		case SFC_VALIDATE_EMPTY:
			if( ClientValidator.isEmpty( ValidateElement.value ) ) {
				return false;
			}
			break;
		*/
		default:
			break;
	}
	
	return true;
}

//**************************************************************
var ClientValidator = function() {
	return {
		isEmpty: function( value ) {
			return ( value == "" || value.length < 1 ) ? true : false;
		},
		
		// isDate - controleren van data
		// @date = de datum voor validatie
		isDate: function( date ) {
			// Maak van de string een object string...
			date = new String( date );

			// Als de Datum niet voldoet aan de onderstaande criteria? fail!
			if( !date.match( /^(0[1-9]|[12][0-9]|3[01])(\/|\-)(0[1-9]|1[012])(\/|\-)((19|20)\d{2})$/ ) ) {
				return false;
			}

			return true;
		},
		// isTelephone - controleren van een telefoon nummer
		// @telephone = het nummer voor de validatie
		isTelephone: function( telephone ) {
			var checkSum = /^[0-9]{2,4}-?\d{6,8}$/;
			
			if( !telephone.match( checkSum ) ) {
				return false;
			}
			
			return true;
		},
		// isPostcode - controleren van een postcode
		// @postcode - de postcode voor de validatie
		isPostcode: function( postcode ) {
			// Controleer op 1234AB en 1234 AB
			var checkSum = /^[1-9]{1}\d{3}\s?[a-zA-Z]{2}$/;
			
			if( !postcode.match( checkSum ) ) {
				return false;
			}
			
			return true;
		},
		// isEmail - controleren van een email adres
		// @email - het email voor het valideren
		isEmail: function( email ) {
			var checkSum = /^[a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$/;
			
			if( !email.match( checkSum ) ) {
				return false;
			}
			
			return true;
		},
		// isNumeric - controleer op getallen
		// @str - de str die gecontrolleerd moet worden
		isNumeric: function( str, len ) {
			var checkSum = /^[0-9]+$/;

			if( !str.match( checkSum ) ) {
				return false;
			}
			
			if( len != "" ) {
				if( str.length > len ) {
					return false;
				}
			}
			
			return true;
		},
		// isAlpha - controleren op karakters
		// @str - de str die gecontrolleerd moet worden
		isAlpha: function( str, len ) {
			var checkSum = /^[a-zA-Z]+$/;
			
			if( !str.match( checkSum ) ) {
				return false;
			}
			
			if( len != "" ) {
				if( str.length > len ) {
					return false;
				}
			}
			
			return true;
		},
		
		// isAlphaNum - controleren op karakters en getallen
		// @str - de string die gecontrolleerd moet worden
		isAlphaNum: function( str, len ) {
			var checkSum = /^[a-zA-Z0-9]+$/;
			
			if( !str.match( checkSum ) ) {
				return false;
			}
			
			if( len != "" ) {
				if( str.length > len ) {
					return false;
				}
			}
			
			return true;
		},
		
		// Replacement func
		isText: function( str ) {
			if( !str.match( /^[^$#%<>]+$/gi ) ) {
				return false;
			}
			
			return true;
		},
		
		// isText - contrleren op vreemde tekens
		// @str de string die gecontrolleerd moet worden.
		isTexts: function( str ) {
			var checkSum = /^[\w\s\?\/\.-_\\]+$/;
			
			if( !str.match( checkSum ) ) {
				return false;
			}
			
			return true;
		}
	};
}();