var FP = {
	faderAnchors: ['general-physiotherapy', 'clinical-pilates', 'sports-physiotherapy', 'womens-health', 'performance-division', 'post-surgery-rehab', 'realtime-ultrasound'],
	currentFaderItem: undefined,
	duration: 300,
	autoFader: undefined,
	currentFader1Item: undefined,
	currentFader1ItemZIndex: undefined,
	autoFader1Interval: 5000,
	autoFader1Duration: 1000,
	autoFaderInterval: 5000,
	autoFaderDuration: 1000,
	heroItems: [],
	apptFormValidator: undefined,
	
	init: function() { // Run at DOM ready
		// new Fx.SmoothScroll();

		FP.substituteSubmits();
		FP.iQlogo();

		if(typeof(ReMooz) !== 'undefined') {
			ReMooz.assign($$('.thumbnails a'), {
				origin: 'img'
			});
			
			ReMooz.assign($$('.newsimage a'), {
				origin: 'img'
			});
			
			ReMooz.assign($$('.profilephoto a'), {
				origin: 'img'
			});
		}
		
		if($('appointmentform')) {
			FP.initFormValidator();
		}
		
		new QuickBox();
	},
	
	substituteSubmits: function() {
		$$('input[type=submit].replace').each(function(el) {
			var replacementSubmit = new Element('a');
			replacementSubmit.set('class', el.className);
			replacementSubmit.removeClass('replace');
			replacementSubmit.addClass('button');
			replacementSubmit.set('text', el.value);
			replacementSubmit.setStyle('cursor', 'pointer');
			replacementSubmit.onclick = function() {
				this.getParent('form').submit();
			}
			replacementSubmit.replaces(el);
		});
	},
	
	initFader: function() {
	    FP.imageFader();
		if($('fader2')) {
			$$('#fader2 ul a').each(function(item, index) {
				item.onclick = FP.faderButtonClick;
				item.onfocus = function() {
					if(this.blur) {
						this.blur();
					}
				};
			});
	
			FP.autoFader = setInterval(FP.fadeToNext, FP.autoFaderInterval);
			
			$$('#fader2 > div').each(function(item, index) {
				if(window.location.hash && FP.faderAnchors.contains(window.location.hash.substring(1))) {
					if(window.location.hash.substring(1) === item.getProperty('id')) {
						if(FP.autoFader) {
							clearInterval(FP.autoFader);
						}
						FP.currentFaderItem = item;
						item.fade('show');
						
						// Get its matching header
						$$('#fader2 selected')[0].removeClass('selected');
						$$('#fader2 li')[index].addClass('selected');
					} else {
						item.fade('hide');
					}
				} else {
					if(item.getStyle('visibility') == 'hidden') {
						item.setStyle('visibility', 'visible');
						item.fade('hide');
					} else {
						FP.currentFaderItem = item;
						item.fade('show');
					}
				}
			});
		}
	},
	
	imageFader: function() {
	    if($('fader1')) {
	        FP.heroItems = $$('#fader1 > img');
	        FP.currentFader1Item = 0;
	        FP.currentFader1ItemZIndex = FP.heroItems.length+1;
	        FP.autoFader1 = setInterval(FP.fadeToNextImage, FP.autoFader1Interval);
	    }
	},
	
	fadeToNextImage: function() {
		FP.currentFader1Item++;
		if (FP.currentFader1Item >= FP.heroItems.length) {
		    FP.currentFader1Item = 0;
		}
		
		FP.heroItems[FP.currentFader1Item].fade('hide');
		FP.heroItems[FP.currentFader1Item].setStyle('z-index', FP.currentFader1ItemZIndex++);
		FP.heroItems[FP.currentFader1Item].set('tween', {
		    duration: FP.autoFaderDuration
		});
		FP.heroItems[FP.currentFader1Item].fade('in');
	},
        
	faderButtonClick: function() {
		if(FP.autoFader) {
			clearInterval(FP.autoFader);
		}
	
		if(!this.hasClass('selected')) {
			// Deselect current list item
			this.getParent('ul').getElement('li.selected').removeClass('selected');
			// Select the new one
			this.getParent('li').addClass('selected');
			
			// Fade the current module out
			FP.currentFaderItem.fade('hide');
			
			// Change to the selected module
			FP.currentFaderItem = $(this.href.substring(this.href.lastIndexOf('#') + 1));
			FP.currentFaderItem.set('tween', {duration: FP.duration, link: 'cancel', onComplete: FP.checkIfCurrentFaderItem});
			FP.currentFaderItem.fade('in');
		}
		
		return false;
	},
	
	fadeToNext: function() {
		// Get the currently selected item
		var currentlySelectedItem = $$('#fader2 li.selected')[0];
		var currentlySelectedLink = currentlySelectedItem.getElement('a');
		var currentlySelectedAnchor = currentlySelectedLink.href.substring(currentlySelectedLink.href.lastIndexOf('#') + 1);
		var currentlySelectedIndex = FP.faderAnchors.indexOf(currentlySelectedAnchor);
		if(currentlySelectedIndex != -1) {
			currentlySelectedIndex++;
			if(!FP.faderAnchors[currentlySelectedIndex]) {
				currentlySelectedIndex = 0;
			}
			
			// Deselect current list item
			$$('#fader2 li.selected')[0].removeClass('selected');
			// Select the new one
			$$('#fader2 li')[currentlySelectedIndex].addClass('selected');
			
			// Fade the current module out
			FP.currentFaderItem.set('tween', {duration: FP.autoFaderDuration, link: 'cancel'});
			FP.currentFaderItem.fade('out');
			
			// Change to the selected module
			FP.currentFaderItem = $(FP.faderAnchors[currentlySelectedIndex]);
			FP.currentFaderItem.set('tween', {duration: FP.autoFaderDuration, link: 'cancel', onComplete: FP.checkIfCurrentFaderItem});
			FP.currentFaderItem.fade('in');
		}
	},
	
	checkIfCurrentFaderItem: function() {
		if(this.element.get('opacity') == 1 && this.element != FP.currentFaderItem) { // Just faded in, but this is no longer the current item
			this.element.fade('hide');
		}
	},
	
	iQlogo: function() {
		$('iqmultimedia').set('tween', {duration: 150, link: 'cancel'});
	
		$('iqmultimedia').addEvents({
			'mouseover': FP.iQlogoFocus,
			'focus': FP.iQlogoFocus,
			'mouseout': FP.iQReset,
			'blur': FP.iQReset
		});
	},
	
	iQlogoFocus: function() {
		if(!this.getNext().hasClass('logoduplicate')) {
			// Duplicate the element
			var duplicate = this.clone();
			duplicate.addClass('logoduplicate');
			duplicate.injectAfter(this);
			duplicate.addEvent('mouseout', FP.iQReset);
		}
		
		FP.iQHover();
	},
	
	iQHover: function() {
		$('iqmultimedia').fade('out');
	},
	
	iQReset: function(evt) {
		evt.stop();
		$('iqmultimedia').fade('in');
	},
	
	initFormValidator: function() {
		MooTools.lang.set('en-US', 'FormValidator', {
			email: 'Invalid email address.'
		});

		FP.apptFormValidator = new FormValidator.Inline('appointmentform', {
			serial: false,
			evaluateOnSubmit: true
		});
		
		FP.apptFormValidator.add('validate-one-checkbox', {
			errorMsg: 'You must select at least one item.',
			test: function(element) {
				return element.getParent('div').getParent('div').getElements('input').some(function(otherField) {
					return otherField.get('checked');
				});
			}
		});
		
		FP.apptFormValidator.add('validate-dob', {
			errorMsg: 'Invalid date.',
			test: function(element) {
				if(FormValidator.getValidator("IsEmpty").test(element)) {
					return false;
				}

				var pattern = /^(\d{1,2})\/(\d{1,2})\/(\d{2,4})$/;
				if(!pattern.test(element.get("value"))) {
					return false;
				}
				
				var yearValue = RegExp.$3;
				if(yearValue.length == 2) {
					if(parseInt(yearValue, 10) > parseInt(new Date().getFullYear().toString().substring(2), 10)) {
						yearValue = '19' + yearValue;
					} else {
						yearValue = '20' + yearValue;
					}
				}

				var dateObject = new Date();
				dateObject.setFullYear(parseInt(yearValue, 10), parseInt(RegExp.$2, 10) - 1, parseInt(RegExp.$1, 10));
				if(parseInt(RegExp.$1, 10) == dateObject.getDate() && parseInt(RegExp.$2, 10) == (1 + dateObject.getMonth()) && parseInt(yearValue, 10) == dateObject.getFullYear()) {
					var dateRepresentation = dateObject.format('%d/%m/%Y');
					if(dateRepresentation != "invalid date"){
						element.set("value", dateRepresentation);
						return true;
					}
				}

				return false;
			}
		});

		$$('#addressfields input[type=radio]').addEvent('click', function() {
			var formType = $('addressfields').getElement('input[checked]').get('value');
			
			switch(formType) {
				case 'New Client':
					$('newclientfields').setStyle('display','block');
					$$('#newclientfields input').each(function(item, index) {
						FP.apptFormValidator.enforceField(item);
					});
					$('existingclientfields').setStyle('display','none');
					$$('#existingclientfields input').each(function(item, index) {
						FP.apptFormValidator.ignoreField(item);
					});
					break;

				case 'Existing Client':
					$('newclientfields').setStyle('display','none');
					$$('#newclientfields input').each(function(item, index) {
						FP.apptFormValidator.ignoreField(item);
					});
					$('existingclientfields').setStyle('display','block');
					$$('#existingclientfields input').each(function(item, index) {
						FP.apptFormValidator.enforceField(item);
					});
					break;
			}
		});
	},
	
	iQfuzzyDate: function(date_str) {
		// heavily modified from http://webdesign.onyou.ch/2010/08/04/javascript-time-ago-pretty-date/
		
		var time_formats = [
				[60, 'just now', 1], // 60
				[120, '1 minute ago', '1 minute from now'], // 60*2
				[3600, 'minutes', 60], // 60*60, 60
				[7200, '1 hour ago', '1 hour from now'], // 60*60*2
				[86400, 'hours', 3600], // 60*60*24, 60*60
				[172800, 'yesterday', 'tomorrow'], // 60*60*24*2
				[604800, 'days', 86400], // 60*60*24*7, 60*60*24
				[1209600, 'last week', 'next week'], // 60*60*24*7*4*2
				[2419200, 'weeks', 604800], // 60*60*24*7*4, 60*60*24*7
				[4838400, 'last month', 'next month'], // 60*60*24*7*4*2
				[29030400, 'months', 2419200], // 60*60*24*7*4*12, 60*60*24*7*4
				[58060800, 'last year', 'next year'], // 60*60*24*7*4*12*2
				[2903040000, 'years', 29030400], // 60*60*24*7*4*12*100, 60*60*24*7*4*12
				[5806080000, 'last century', 'next century'], // 60*60*24*7*4*12*100*2
				[58060800000, 'centuries', 2903040000] // 60*60*24*7*4*12*100*20, 60*60*24*7*4*12*100
			];

		// date_str comes from twitter feed and is already in a format we can plug straight into javascript Date()
		var seconds = Math.abs((new Date() - new Date(date_str)) / 1000);
		
		// assume the item to be displayed is in the past
		var token = 'ago', list_choice = 1;
		
		// if not, we set the text to a future tense
		if (seconds < 0) {
			token = 'from now';
			list_choice = 2;
		}
		
		// init counter and time stamp
		var i = 0, time = date_str;
		
		// find the time period in the array
		while (time_formats[i][0] <= seconds)
			i++;

		// format the output
		if (typeof time_formats[i][2] == 'string')
			time = time_formats[i][list_choice];
		else
			time = Math.floor(seconds / time_formats[i][2]) + ' ' + time_formats[i++][1] + ' ' + token;
		
		return time;
	},
	
	getTweets: function(count) {
		var twitterFeed = new Request.Twitter('FigtreePhysio', {
			linkify: true,
			data: {
				count: count
			},
			onComplete: function(tweets, user) {
				tweets.each(function(tweet, i) {
					var content = new Element('p');
					if (i == (tweets.length - 1))
						content.addClass('last');
					content.set('html', tweet.text);
					var lineBreak = new Element('br');
					lineBreak.inject(content);
					var dateStamp = new Element('h4');
					dateStamp.set('text', FP.iQfuzzyDate(tweet.created_at));
					dateStamp.inject(content)
					content.inject($('latest_tweets'));
				})
			}
		}).send();
	}
};

window.addEvent('domready', FP.init);
window.addEvent('load', FP.initFader);
