
/*
 * Copyright (C) 2010/2011 Im-At-Home BV
 * All Rights Reserved
 * No copying, duplication or replication of code permitted without
 * express permission of Im-At-Home BV
 * 
 */

App.Validate = {
	
	hasInit : false,
	aPopulate : [],
	
	commonValidators : new Hashtable(),
	
	aItems : [],
	
	__preinit : function() {
		
		if (this.hasInit) return;
		this.hasInit = true;
		
		this.setupRegExp();
		
		$('form').live('keypress', function(oEvent){ if(oEvent.which == 13) oEvent.preventDefault(); });
		$('.controldata :input').live('focusin', function(oEvent){ App.Validate.clearDefault(oEvent); });
		$('.controldata :input').live('focusout change', function(oEvent) { App.Validate.__checkContent(oEvent); });
		$('.controldata :input').live('change', function(oEvent) { App.Validate.__formChecker(oEvent); });				

		$('select.autopop[data-datasource!=""][data-target!=""]').live('change', function(oEvent) { App.Validate.autopopulate(oEvent); });
		
		
	},
	
	resetDefault : function(oEvent, oArgs) {
	
		if((oArgs == 'undefined') || (oArgs == null)) {
			oArgs = {};
			oArgs.form = $('#mainbody');
		}
		
		var items = $('#'+ oArgs.form).find(':input[type="text"][data-default|=""]');
		if (items.length > 0) {
			for (var counter=0; counter< items.length; counter++) {
				
				var defaultval = $(items[counter]).attr('data-default');
				
				switch ($(items[counter]).attr('type')) {
				
					case 'text': {
						$(items[counter]).val(defaultval);						
						break;				
					}
					
					default: {
						break;
					}
				
				}				
			}
		}
		
	},
	
	setupRegExp : function() {
		
		var sequences = [
		                 	{ 'name':'textonly', 'value':'[a-zA-Z0-9]+' },
		                 	{ 'name':'alltext', 'value':'[a-zA-Z0-9]+[a-zA-Z0-9_. \-]+' },
		                 	{ 'name':'alltextmin', 'value':'[a-zA-Z0-9]+[a-zA-Z0-9_. \-]{{0}}' },			                 	
		                 	{ 'name':'textminmax', 'value':'[a-zA-Z0-9]{{0},{1}}' },
		                 	{ 'name':'textmin', 'value':'[a-zA-Z0-9]{{0}}' },
		                 	{ 'name':'email', 'value':'^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}' },
							{ 'name':'zip_dutch', 'value':'[0-9]{4}[a-zA-Z]{2}' },
							{ 'name':'digits', 'value':'[0-9]+' },
							{ 'name':'quikname', 'value':'[a-zA-Z]+[a-zA-Z0-9_.]+' }
		                 ];
		
		for (var counter=0; counter<sequences.length; counter++) {
			this.commonValidators.add(sequences[counter].name, sequences[counter].value);
		}
				
	},
	
	checkPost : function(target){
	//	if(this.aItems.length > 0) this.aItems = 0;
		
		var oForm = $('#'+ target);
		var reqInputs = $(':input[data-req="true"]', oForm);
		var aItems = [];
		var fName;
		var response = '';
		var noPost = false;
		
		if(reqInputs.length > 0){
			
			for(var r=0; r < reqInputs.length; r++){
				var defValue = $(reqInputs[r]).attr('data-default');
				if(($(reqInputs[r]).val() == '') || ($(reqInputs[r]).val() == defValue)){
					strName = 'blank';
					noPost = true;
					aItems.push(strName);
				}
				
				if ($(reqInputs[r]).hasClass('error')) {
					strName = $(reqInputs[r]).attr('name');
					noPost = true;
					aItems.push(strName);
				}
				
			}
			
		}
		
		if(noPost) this.__formResponse(aItems);
		else return true;
	},
	
	__formResponse : function(aItems) {
		var items =  aItems;
		var response = '';
		if(items.length > 0){
			
			for(var r=0; r < items.length; r++){
				
				switch(items[r]){
					
					case 'name':{
						response += 'Please fill in your name\n';
						break;
					}
					
					case 'email':{
						response += 'Please fill in a valid emailaddress\n';
						break;
					}
					
					case 'firstname':{
						response += 'Please fill in your firstname\n';
						break;
					}
					
					case 'familyname':{
						response += 'Please fill in your familyname\n';
						break;
					}
					
					case 'companyname':{
						response += 'Please fill in your companyname\n';
						break;
					}
					
					case 'subject':{
						response += 'Please fill in a subject\n';
						break;
					}
					
					case 'subject':{
						response += 'Please fill in a subject\n';
						break;
					}
					
					case 'description':{
						response += 'Please fill in a description\n';
						break;
					}
					
					case 'blank':
					default:{
						response += 'You forgot to fill in a required field\n';
						break;
					}
				}
				
			}
				
		}
		
		alert(response);
		
		
	},
	
	__formChecker : function(oEvent) {
		
		if (oEvent == null) return;		
		var parent = $(oEvent.currentTarget).parents('.controldata'); // look for the form tag
		
		if (parent==null) return; // no form, no point !		
		var reqInputs = $(':input[data-req="true"]', parent);
		var failed = false;
		
		if (reqInputs.length > 0) {
			var counter = 0;
			// i need to validate these inputs....
			while (counter < reqInputs.length) {
				failed = !($(reqInputs[counter]).hasClass('ok'));
				if (failed) break;
				counter++;
			}
			if (failed) { 
				if ($(parent).hasClass('ok')) $(parent).removeClass('ok');
				if (!$(parent).hasClass('error')) $(parent).addClass('error');
			} else {
				if ($(parent).hasClass('error')) $(parent).removeClass('error');
				if (!$(parent).hasClass('ok')) $(parent).addClass('ok');
			}
		}
				
	},
	
	__checkContent : function(oEvent) {
		
		if (oEvent == null) return;
		
		var defaultval = $(oEvent.currentTarget).attr('data-default');
		if ((defaultval == 'undefined') || (defaultval == null)) defaultval = '';
		
		switch (oEvent.type) {
		
			case 'focusin': {
				if ($(oEvent.currentTarget).val() == defaultval) $(oEvent.currentTarget).val('');
				break;
			}
			
			case 'focusout': {
				if ($(oEvent.currentTarget).val() == '') $(oEvent.currentTarget).val(defaultval);
				break;
			}
			
			default: {
				break;
			}
		
		}		
		
		var oElement = oEvent.currentTarget.tagName.toLowerCase();
		var type = (oElement=='input') ? $(oEvent.currentTarget).attr('type') : oElement;
		
		var status = '';
		var valueToValidate = $(oEvent.currentTarget).val();		
		
		var required = $(oEvent.currentTarget).attr('data-req');
		required = ((required == 'undefined') || (required == null)) ? false : required.bool(); 
		
		switch (type)
		{
		
			case 'text': {

				var validatorIn = $(oEvent.currentTarget).attr('data-validator');		
				if ((validatorIn=='undefined') || (validatorIn == null) || (validatorIn == '')) return;
								
				var regExp = null;
				
				var exp = '';
				var posOfHash = validatorIn.indexOf('#');
				
				if (posOfHash != -1) {
					var vars = validatorIn.substring(posOfHash+1);
					vars = vars.split(',');
					exp = this.commonValidators.get(validatorIn.substring(0, posOfHash)).formatArray(vars);
				} else {
					exp = this.commonValidators.get(validatorIn);
				}

				regExp = new RegExp(exp);				
				if (regExp == null) return; // no validator
												
				var result = regExp.exec(valueToValidate);		
				
				if ((valueToValidate=='') && required) {
					status = 'error';
				} else {		
					status = (result == valueToValidate) ? 'ok' : 'error';
				}
				
				break;
			}
			
			case 'select':{
				if ((valueToValidate=='') && required) {
					status = 'error';
				} else {		
					status = 'ok';
				}
				break;
			}

			default: {				
				// unsupported object type (at the moment)...
				break;
			}
			
		}
								
		switch (status) {
		
			case "ok": {
				if (!$(oEvent.currentTarget).hasClass('ok')) {
					$(oEvent.currentTarget).addClass('ok');
				}
				if ($(oEvent.currentTarget).hasClass('error')) {
					$(oEvent.currentTarget).removeClass('error');
				}				
				break;
			}
			
			case "error": {
				if ($(oEvent.currentTarget).hasClass('ok')) {
					$(oEvent.currentTarget).removeClass('ok');
				}
				if (!$(oEvent.currentTarget).hasClass('error')) {
					$(oEvent.currentTarget).addClass('error');
				}						
				break;
			}
			
			default: {
				// no error or condition to set
				break;
			}
		
		}
		
	},
	
	clearDefault : function(oEvent){
		if(!$(oEvent.currentTarget) == true) return;
		var defaultval = $(oEvent.currentTarget).data('default');
		if ((defaultval == 'undefined') || (defaultval == null)) defaultval = '';
		if ($(oEvent.currentTarget).val() == defaultval) $(oEvent.currentTarget).val('');
	},
	
	autopopulate : function(oEvent) {
				
		var datasource = $(oEvent.currentTarget).attr('data-datasource');
		if ((datasource == 'undefined') || (datasource == null)) datasource = null;
		
		var target = $(oEvent.currentTarget).attr('data-target');
		if ((target == 'undefined') || (target == null)) target = null;

		var propname = $(oEvent.currentTarget).attr('data-propname');
		if ((propname == 'undefined') || (propname == null)) propname = 'display';

		if ((target==null) || (datasource==null)) return;
				
		var currentVal = $(oEvent.currentTarget).val();
		if ((currentVal != '') && (currentVal != null)) {
			datasource += '/' + currentVal;
		}
				
		$.ajax({
			type: "get",
			dataType: "text",
			error: function(data) {				
			},
			success: function(datain) {
				
				var data = jQuery.parseJSON(datain);
				if (data == null) return;
												
				var oHtml = '';
				if (data.length >0) {
					for (var counter=0; counter< data.length; counter++) {
						oHtml += '<option value="'+ data[counter].id +'">'+ data[counter][propname] +'</option>';												
					}
				}
				
				$('#'+ target).html(oHtml);
				$('#'+ target).change();
				
			},				
			url: datasource, 
			data: {}
		});	
		
	}
			
};


$(document).ready(function() {
	
	App.Validate.__preinit();
	
});
