/* 

Script: ui.js
	KamUI - A Kameleon CMS User Interface 
	
*/

var KamUI = new Hash({
	validationErrors : null,
	
	initialise: function(){
		var bodyTag = $(document.body);
		if ( bodyTag ){
			this.setupForms( bodyTag );
		}
	},
	
	setupForms: function(element){
		$(element).getElements('form.kamValidate').each( function(formElement,index){
			// setup validation and ajax form submission
			formElement.removeEvents();
			formElement.addEvent("submit",	function(){
				
				// validate
				var validationResult = KamUI.validate(formElement);
				if( ! validationResult ){
					return false;
				}		
			});
			
			// setup date pickers
			$$('input.kamDataTypeDate').each( function(el){
				new DatePicker(el);
			});
		});
	},
	
	validate : function (form){
		var form = $(form);
		if( form ){
			var labels = form.getElements("label").each( function(labelElement){
				var controlId = labelElement.get("for");
				if ( controlId ){
					var element = form.getElementById(controlId);
					if ( element ){
						var elementTag = element.get("tag").toLowerCase();
						var controlType = "";
						var elementValue = "";
				
						if ( labelElement.hasClass("kamDataTypeFile") )
						{
							elementValue = element.getSelectedFile();
						}
						else
						{
							(elementTag == "select" || elementTag == "textarea")? controlType = elementTag: controlType = element.get("type");
							switch ( controlType )
							{
								case "select" :
									if ( element.options.length > 0 && element.selectedIndex >= 0 )
									{
										elementValue=$(element.options[element.selectedIndex]).get("value");
									}
									else
									{
										elementValue = "";
									}
									break;		
								default:
									elementValue=element.get("value");
									break;					
							}
						}
						
						elementValue = elementValue.replace(/^\s+|\s+$/g, '');
											
						if ( labelElement.hasClass("kamRequired") ){	
							var empty = false;
							if (controlType == "checkbox"){
								empty = (!element.checked) ?  true : false;
							}
							else{
								empty = (elementValue == "") ? true : false;
							}
							(empty) ? KamUI.generateFieldError(labelElement.get("for"),labelElement.get("html"),"is required") : null;
						}
						
						if ( elementValue!="" )	{
							if ( labelElement.hasClass("kamDataTypeEmail") ){
								(!KamUI.isEmailAddress(elementValue)) ? KamUI.generateFieldError(labelElement.get("for"),labelElement.get("html"),"is not an email address") : null ;
							}
							else if( labelElement.hasClass("kamDataTypeInteger") ){
								(!KamUI.isInteger(elementValue)) ? KamUI.generateFieldError(labelElement.get("for"),labelElement.get("html"),"is not a whole number") : null ;							
							}
							else if( labelElement.hasClass("kamDataTypeDecimal") ){
								(!KamUI.isDecimal(elementValue)) ? KamUI.generateFieldError(labelElement.get("for"),labelElement.get("html"),"is not a decimal number") : null ;							
							}
						}
	                }
					else{
						alert( controlId+" not found in document");
					}
				}
				else {
					if ( labelElement.hasClass( 'kamFieldLabel' ) && labelElement.hasClass( 'kamRequired' ) ){
						var parentElement = $(labelElement.parentNode);
						if ( parentElement.tagName == 'DIV' && parentElement.hasClass( 'kamCheckBox' ) ){
							var empty = true;
							var checkboxes = parentElement.getElements("input").each( function(inputElement){
								if ( inputElement.get('type') == 'checkbox' ){
									if ( inputElement.checked ){ 
										empty = false;
									}
								}
							});
							
							if ( empty ){
								(empty) ? KamUI.generateFieldError( null ,labelElement.get("html"),"is required") : null;	
							}
						}
					}
				}
			});
			
			if( KamUI.validationErrors )
			{
				this.notifyOfErrors( form );
				return false;
			}
		}
		else
		{
			KamUI.generateFieldError("Validation of form failed, form is null");
		}
		return true;
	},
	
	isEmailAddress : function(value){
		var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
		return emailPattern.test(value);
	},
	
	isInteger : function(value){
		return !(isNaN(value)||(value%1));
	},
	
	isDecimal : function(value)	{
		return !(isNaN(value));
	},
	
	removeTags : function(sourceString, tagName){
	   var regexp= new RegExp ("<" + tagName + "[^.]*\/" + tagName + ">", "gi");
	   return sourceString.replace(regexp,"").replace("  "," ");
	},
	
	generateFieldError : function(fieldId,labelText,message){
	    labelText = KamUI.removeTags(labelText.replace(":", "").replace("*", ""), "span");
		if ( ! KamUI.validationErrors ){ KamUI.validationErrors = new Array(); }
		KamUI.validationErrors[KamUI.validationErrors.length] = new Hash({
			id : fieldId,
			label : labelText,
			error : message
		});
	},
	
	notifyOfErrors : function( form ){
		var message = "There are problems with the form:\n\n";
		for ( var x = 0; x < KamUI.validationErrors.length; x++ )
		{
			var error = KamUI.validationErrors[x];
			message += error.label + ' ' + error.error + '\n';
		}
		alert( message );
		
		
		KamUI.validationErrors = null;
	}
});

window.addEvent("domready", function(){
	return KamUI.initialise();
});
