/* 

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

var KamForms = 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 = KamForms.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) ? KamForms.generateFieldError(labelElement.get("for"),labelElement.get("html"),"is required") : null;
						}
						
						if ( elementValue!="" )	{
							if ( labelElement.hasClass("kamDataTypeEmail") ){
								(!KamForms.isEmailAddress(elementValue)) ? KamForms.generateFieldError(labelElement.get("for"),labelElement.get("html"),"is not an email address") : null ;
							}
							else if( labelElement.hasClass("kamDataTypeInteger") ){
								(!KamForms.isInteger(elementValue)) ? KamForms.generateFieldError(labelElement.get("for"),labelElement.get("html"),"is not a whole number") : null ;							
							}
							else if( labelElement.hasClass("kamDataTypeDecimal") ){
								(!KamForms.isDecimal(elementValue)) ? KamForms.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) ? KamForms.generateFieldError( null ,labelElement.get("html"),"is required") : null;	
							}
						}
					}
				}
			});
			
			if( KamForms.validationErrors )
			{
				this.notifyOfErrors( form );
				return false;
			}
		}
		else
		{
			KamForms.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 = KamForms.removeTags(labelText.replace(":", "").replace("*", ""), "span");
		if ( ! KamForms.validationErrors ){ KamForms.validationErrors = new Array(); }
		KamForms.validationErrors[KamForms.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 < KamForms.validationErrors.length; x++ )
		{
			var error = KamForms.validationErrors[x];
			message += error.label + ' ' + error.error + '\n';
		}
		alert( message );
		
		
		KamForms.validationErrors = null;
	}
});

/*
* image fader
*/

var kamAnimationInterval = null;
var kamAnimationTransitionLength = null;

var imageFader = new Class({
	baseElm: null,
	items: null,
	numItems: null,
	currentItem: null,
	periodical: null,
	transitionLength: 2000,
	moveTimeSecs: 5000,
	backgroundSet: false,
	
	initialize: function(baseElm,itemIdentifier,startItem){
		// set class properties
		this.baseElm = $(baseElm);
		this.items = baseElm.getElements(itemIdentifier);
		this.numItems = this.items.length;
		this.currentItem = 0;

		this.baseElm.setStyle("overflow-y","hidden");
		
		if( this.numItems > 1 ){
			// set background
			this.setBackground(this.items[this.currentItem]);

			// position all absolute so they sit at the same point
			var baseElmPos = baseElm.getPosition();			
			this.items.each( function(elm){
				elm.setStyle("display","block");	
				elm.setStyle("position","absolute");
				elm.setStyle("left",baseElmPos.x);
				elm.setStyle("top",baseElmPos.y);			
				elm.setStyle("opacity",0);
			});
		}	
	},
	setBackground: function(elm){
	
		if( elm ){
			if( elm.get("tag").toLowerCase()!="img" ){
				var currentImg = elm.getElement("img");
				if(currentImg){
					this.baseElm.setStyle("background-image","url("+currentImg.get("src")+")");
				}
			}
			else{
				this.baseElm.setStyle("background-image","url("+elm.get("src")+")");	
			}
		}
	},
	moveNext: function(){
		this.hideAll();
		( this.currentItem<(this.numItems-1) ) ? this.currentItem++ : this.currentItem=0;
		this.showCurrent();
	},
	movePrev: function(){
		this.hideAll();
		(this.currentItem==0 ) ? this.currentItem = (this.numItems-1) : this.currentItem--;
		this.showCurrent();
	},
	showCurrent: function(){
		this.hideAll();
		var fadeIn = new Fx.Morph( this.items[this.currentItem], { 
			duration: this.transitionLength,
			onComplete: function(){
				this.setBackground(this.items[this.currentItem]);
				var nextFunction = function(){
					this.moveNext();
				}.bind(this);
				this.periodical = nextFunction.delay(this.moveTimeSecs);
			}.bind(this)
		});
		fadeIn.start({"opacity":[0,1]});
	},
	hideAll: function(){
		this.items.each( function(elm,index){
			if( index!=this.currentItem ){
				elm.setStyle("opacity","0");
			}
		});
	},
	start: function(moveTimeSecs,transitionLength) {
		if( this.numItems>1 ){
			this.moveTimeSecs = moveTimeSecs*1000;
			this.transitionLength = transitionLength*1000;
			var nextFunction = function(){
				this.moveNext();
			}.bind(this);
			this.periodical = nextFunction.delay(this.moveTimeSecs);
			this.items[this.currentItem].setStyle("opacity",1);
		}
	}
	
});

/*
* dom ready
*/

var rotators = [];

window.addEvent("domready", function(){

	$("body").addClass("hasJS");

	$$("a").each( function(elm){
		// handle popups
		var rel = elm.get("rel");
		if( rel ){
			if( rel.indexOf("kamPopUp")!=-1 ){
				elm.addEvent("click", function(evt){
					evt.preventDefault();
					window.open(elm.href);
				});
			}
		}
	});

	$$("#colB div").each( function(elm,index){
		if( elm.hasClass("kamImageFade") ){
			 var newRotator = new imageFader(elm,".item");
			 if( kamAnimationInterval && kamAnimationInterval ){
				 newRotator.start(kamAnimationInterval,kamAnimationTransitionLength);						 
			 }
			 else{
				 newRotator.start(10,4);
			 }
			 rotators[rotators.length] = newRotator;
		}
	});

	return KamForms.initialise();
	
});
