/*
*  Base64 encode / decode
*/
 
var Base64 = {
	_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
	encode : function (input) {
		var output = "";
		var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
		var i = 0;
		input = Base64._utf8_encode(input);
		while (i < input.length) {
			chr1 = input.charCodeAt(i++);
			chr2 = input.charCodeAt(i++);
			chr3 = input.charCodeAt(i++);
			enc1 = chr1 >> 2;
			enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
			enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
			enc4 = chr3 & 63;
			if (isNaN(chr2)) {
				enc3 = enc4 = 64;
			} else if (isNaN(chr3)) {
				enc4 = 64;
			}
			output = output +
			this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
			this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
		}
		return output;
	},
	decode : function (input) {
		var output = "";
		var chr1, chr2, chr3;
		var enc1, enc2, enc3, enc4;
		var i = 0;
		input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
		while (i < input.length) {
			enc1 = this._keyStr.indexOf(input.charAt(i++));
			enc2 = this._keyStr.indexOf(input.charAt(i++));
			enc3 = this._keyStr.indexOf(input.charAt(i++));
			enc4 = this._keyStr.indexOf(input.charAt(i++));
			chr1 = (enc1 << 2) | (enc2 >> 4);
			chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
			chr3 = ((enc3 & 3) << 6) | enc4;
			output = output + String.fromCharCode(chr1);
			if (enc3 != 64) {
				output = output + String.fromCharCode(chr2);
			}
			if (enc4 != 64) {
				output = output + String.fromCharCode(chr3);
			}
		}
		output = Base64._utf8_decode(output);
		return output;
	},
	_utf8_encode : function (string) {
		string = string.replace(/\r\n/g,"\n");
		var utftext = "";
		for (var n = 0; n < string.length; n++) {
			var c = string.charCodeAt(n);
			if (c < 128) {
				utftext += String.fromCharCode(c);
			}
			else if((c > 127) && (c < 2048)) {
				utftext += String.fromCharCode((c >> 6) | 192);
				utftext += String.fromCharCode((c & 63) | 128);
			}
			else {
				utftext += String.fromCharCode((c >> 12) | 224);
				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
				utftext += String.fromCharCode((c & 63) | 128);
			}
		}
		return utftext;
	},
	_utf8_decode : function (utftext) {
		var string = "";
		var i = 0;
		var c = c1 = c2 = 0;
		while ( i < utftext.length ) {
			c = utftext.charCodeAt(i);
			if (c < 128) {
				string += String.fromCharCode(c);
				i++;
			}
			else if((c > 191) && (c < 224)) {
				c2 = utftext.charCodeAt(i+1);
				string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
				i += 2;
			}
			else {
				c2 = utftext.charCodeAt(i+1);
				c3 = utftext.charCodeAt(i+2);
				string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
				i += 3;
			}
		}
		return string;
	}
}

/*
* video popup
*/

var kamBodyContent = null;
var kamMask = null;
var kamPopUp = null;
var kamPendingVideoUrl = null;
var kamVideo = null;
var kamPlayerLoadedFlag = false;

function kamLoadVideo(url){
	if( kamPlayerLoadedFlag ){
		kamVideo.movieURL(url);
	}
	else{
		kamPendingVideoUrl = url;
	}
}

function kamPlayerLoaded(loaded){
	kamPlayerLoadedFlag = loaded;
	if( kamPendingVideoUrl ){
		kamVideo.movieURL(kamPendingVideoUrl);
	}
}

function showVideoPopup( url ){
	if( !kamBodyContent ){
		kamBodyContent = $(document.body);
	}

	if( !kamMask || !kamPopUp ){
		kamMask = new Mask(kamBodyContent,{
			id: "kamMask",
			hideOnClick : true,
			useIframeShim : true,
			style : {
				"backgroundColor": "#000",
				"opacity": 0.8
			}
		});
		
		kamPopUp = new Element("div",{ "id": "kamPopUp", "styles": { "width":640,"height":480 } } );
		$("kamMask").grab(kamPopUp);
	}
	
	if( !kamVideo ){
		kamVideo = new Element("div",{ id:"kamVideo" });
		kamPopUp.grab(kamVideo);
		if( kamVideo ){
			var kamPlaylist = '{ "videos": [ { "url":"'+Base64.encode(url)+'" } ],"labels": { "next":"next","previous":"previous","play": "play","pause": "pause","stop": "stop"}}';
			var kamConfig = { "config": Base64.encode(kamPlaylist) };
			swfobject.embedSWF("/style/flash/KamVideoPlayer.swf", "kamVideo", 640	, 480, "9.0.0", null, kamConfig );
			kamVideo = $("kamVideo");
		}
	}

	kamMask.show();
	kamPopUp.setStyle( 'display', 'block' );
	kamPopUp.setStyle( 'left', -999999 );
	centrePopup();
	kamLoadVideo(url);

}

function centrePopup(){
	if( kamMask && kamPopUp ){
		var containerDimensions = kamBodyContent.getCoordinates();
		var popUpDimensions = kamPopUp.getCoordinates();
		var posTop = (containerDimensions.height * .5) - (popUpDimensions.height * .5);
		var posLeft = (containerDimensions.width * .5) - (popUpDimensions.width * .5);
		kamPopUp.setStyle( 'top', posTop );
		kamPopUp.setStyle( 'left', posLeft );
		kamPopUp.setStyle( 'z-index', "999999" );
		kamPopUp.setStyle( 'position', "absolute" );
		kamMask.position();
	}
}

/*
* form validation
*/

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){
		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;
	}
});

var displayedTab = null;
var bannerContentElements = null;
var bannerNavElements = null;

window.addEvent("domready", function(){
	// hide outer while we do some work
	var outer = $("outer");
	if( outer ){
		outer.setStyle("display","none");	
	}

	// if the admin user has not chosen a selected tab then display a random one
	var bannerContent = $("bannercontent");
	var bannerNav = $("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;
	$$("a").each( function(elm){
		// set the selected state on links
		if( elm.get("href")==currentUrl ){
			elm.addClass("selected");
			var parentNode = $(elm.parentNode);
			if(parentNode.get("tag")=="li"){
				parentNode.addClass("selected");	
			}
		}
		// handle videos
		var href = elm.get("href");
		if( href ){
			if( href.indexOf(".flv")!=-1 ){
				elm.addEvent("click", function(evt){
					evt.preventDefault();
					showVideoPopup(elm.href);
				});
			}
		}
	});

	// add the hover event for topnav	
	$$("#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
	$("quickSearch").getElement("input.text").addEvent("focus", function(evt){
		this.set("value",""); 
	});
	
	// set date
	setCurrentDate();
	setCurrentDate.periodical("60000");
	
	window.addEvent("resize", function(evt){
		centrePopup();
	});
	
	// 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();
	$("date").set("html",date.format("%d/%m/%Y %H:%M"));
}