/* 

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

/*
*  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;

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

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

function showVideoPopup( url ){
	alert("show: "+url);
	if( !kamBodyContent ){
		kamBodyContent = $(document.body);
	}

	if( !kamMask || !kamPopUp ){
		mask = new Mask(bodyContent,{
			hideOnClick : true,
			useIframeShim : true,
			style : {
				"backgroundColor": "#000",
				"opacity": 0.8
			},
			onClick: function(evt){
				popUp.setStyle( 'display', 'none' );
			}
		});
		
		kamPopUp = new Element("div",{ id:"kamPopUp" });
		kamBodyContent.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"}};
			swfobject.embedSWF("/style/flash/KamVideoPlayer.swf", "kamVideo", 400, 300, "9.0.0", null, kamPlaylist );
			kamVideo = $("kamVideo");
		}
	}

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

}

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

/*
* 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);
		}
	}
	
});

/*
* 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);
				});
			}
		}
	});
	
	window.addEvent("resize", function(){
		centrePopup();							   
	});
	
	$$("#colB div").each( function(elm,index){
		if( elm.hasClass("kamImageFade") ){
			 var newRotator = new imageFader(elm,".item");
			 if( kamAnimationInterval && kamAnimationInterval ){
				 newRotator.start(kamAnimationInterval,kamAnimationInterval);						 
			 }
			 else{
				 newRotator.start(10,4);
			 }
			 rotators[rotators.length] = newRotator;
		}
	});

	return KamForms.initialise();
	
});