/*
* form validation
*/

var KamUI = new Hash({
	validationErrors : null,
	
	initialise: function(){
		var bodyTag = document.id(document.body);
		if ( bodyTag ){
			this.setupForms( bodyTag );
		}
	},
	
	setupForms: function(element){
		document.id(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
			document.getElements('input.kamDataTypeDate').each( function(el){
				new DatePicker(el);
			});
		});
	},
	
	validate : function (form){
		form = document.id(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 = document.id(element).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 = document.id(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;
	}
});


/*
* 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 = document.id(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.setStyles({
					"display":"block",
					"position":"absolute",
					"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,
			onStart: function(){
				this.setStyle("display","block");
			}.bind(this.items[this.currentItem]),
			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");
				elm.setStyle("display","none");
			}
		});
	},
	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.hideAll();
			this.items[this.currentItem].setStyle("opacity",1);
			this.items[this.currentItem].setStyle("display","block");
		}
	}
	
});

var displayedTab = null;
var bannerContentElements = null;
var bannerNavElements = null;
var rotators = [];

window.addEvent("domready", function(){
	// hide outer while we do some work
	var outer = document.id("outer");
	if( outer ){
		outer.setStyle("display","none");	
	}
	
	var elm = document.id("banner_inner");
	if( elm ){
		 var newRotator = new imageFader(elm,".rotate");
		 if( kamAnimationInterval && kamAnimationInterval ){
			 newRotator.start(kamAnimationInterval,kamAnimationTransitionLength);						 
		 }
		 else{
			 newRotator.start(10,4);
		 }
		 rotators[rotators.length] = newRotator;
	}

	// if the admin user has not chosen a selected tab then display a random one
	var bannerContent = document.id("bannercontent");
	var bannerNav = document.id("bannernav");
	if( bannerContent && bannerNav ){
		// keep a counter of the number of elements
		var numberOfElements = 0;
		
		// hide all content
		bannerContentElements = bannerContent.getElements("li");
		bannerContentElements.each( function(elm,index){
			elm.setStyle("display","none");
			numberOfElements++;
		});

		// setup the events on the nav
		bannerNavElements = bannerNav.getElements("li");
		bannerNav.getElements("li").each( function(elm,index){
			if( elm.hasClass("selected") ){
				displayedTab = index;
			}
			elm.addEvent("click",function(evt){
				evt.stopPropagation();
				showTab(index);
			});
			elm.getElement("a").addEvent("click",function(evt){
				evt.preventDefault();
			});
		});

		// if there a tab is not yet displayed then pick one at random
		if( (! displayedTab && displayedTab != 0) && numberOfElements>1 ){
			displayedTab = $random(0,numberOfElements-1);
		}
		showCurrentTab();
	}
	
	var currentUrl = document.location;
	document.getElements("a").each( function(elm){
		// set the selected state on links
		if( elm.get("href")==currentUrl ){
			elm.addClass("selected");
			var parentNode = document.id(elm.parentNode);
			if(parentNode.get("tag")=="li"){
				parentNode.addClass("selected");	
			}
		}
		// handle videos
		var href = elm.get("href");
		var videoTitle = elm.get("title");
		if( href ){
			if( href.indexOf(".flv")!=-1 ){
				elm.addEvent("click", function(evt){
					evt.preventDefault();
					var modal = new kamVideoModal(href, {
						closeMaskOnClick: true,
						width: 640,
						height:430,
						autoPlay: true,
						title: ((videoTitle) ?  videoTitle : "Video")
					});
					modal.show();
				});
			}
		}
	});

	// add the hover event for topnav	
	document.getElements("#topnav li").each( function(elm){
		elm.addEvent("mouseenter", function(evt){
			this.addClass("hover");
		});
		elm.addEvent("mouseleave", function(evt){
			this.removeClass("hover");
		});
	});
	
	// setup form validation
	KamUI.initialise();
	
	// add event to clear text on quicksearch focus
	document.id("quickSearch").getElement("input.text").addEvent("focus", function(evt){
		this.set("value",""); 
	});
	
	// set date
	setCurrentDate();
	setCurrentDate.periodical("60000");
	
	//setup video
	kamUi.setInitialiseOptions({
		kamVideoModal:{
			width:640,
			height:430
		}
    });
	kamUi.initialise();
	
	// work is complete, show the outer
	if( outer ){
		outer.setStyle("display","block");	
	}
});

function showCurrentTab(){
	bannerContentElements[displayedTab].setStyle("display","block");
	bannerNavElements[displayedTab].addClass("selected");	
}

function showTab(num){
	displayedTab = num;
	bannerContentElements.each( function(elm,index){
		elm.setStyle("display","none");
	});
	bannerNavElements.each( function(elm,index){
		elm.removeClass("selected");
	});
	showCurrentTab();
}

function setCurrentDate(){
	var date = new Date();
	document.id("date").set("html",date.format("%d/%m/%Y %H:%M"));
}
