var application = {
	initImageFading: function(selector, options) {
		var images = $$(selector),
			options = options || {};
		
		if(options.excludeSelector) {
			var exclude_images = $$(options.excludeSelector);
			
			images = images.reject(function(image){
				return exclude_images.include(image);
			});
		}
	
		images.each(function(image) {
			var overEffect, outEffect;
			
			image.setOpacity(options.from);
			
			image.observe('mouseover', function(event) {
				overEffect = new Effect.Appear(image, { 
					from: options.from, 
					duration: options.fadeDuration, 
					beforeStart: function(){ 
						if (outEffect) outEffect.cancel(); 
					}
				});
			});
			
			image.observe('mouseout', function(event) {
				outEffect = new Effect.Fade(image, { 
					to: options.from, 
					duration: options.resetDuration, 
					beforeStart: function(){ 
						if (overEffect) overEffect.cancel();
					} 
				});
			});
		});
	},
	
	initBorderFading: function(selector, options) {
		var elements = $$(selector),
			options = options || {};
		
		if(options.excludeSelector) {
			var exclude_elements = $$(options.excludeSelector);
			
			elements = elements.reject(function(element){
				return exclude_elements.include(element);
			});
		}
	
		elements.each(function(element) {
			var overEffect, outEffect;
						
			element.setStyle({ borderColor: options.from });
			
			element.observe('mouseover', function(event) {
				overEffect = new Effect.Morph(element, { 
					style: {
						borderColor: options.to
					}, 
					duration: options.fadeDuration, 
					beforeStart: function(){ 
						if (outEffect) outEffect.cancel(); 
					}
				});
			});
			
			element.observe('mouseout', function(event) {
				outEffect = new Effect.Morph(element, { 
					style: {
						borderColor: options.from
					},
					duration: options.resetDuration, 
					beforeStart: function(){ 
						if (overEffect) overEffect.cancel();
					} 
				});
			});
		});
	},
	
	initHeaderAnimation: function(options) {
		if(options.animate == true) {
			var arrow = $('headerSubTitle');
				
			var moveTo = parseInt(arrow.getStyle('top')),
				moveFrom = -parseInt(arrow.getStyle('height')) * 1.5;

			arrow.setStyle({
				top: moveFrom + 'px'
			});
			
			arrow.morph({ top: moveTo + 'px' }, {
				duration: 1.2,
				transition: Effect.Transitions.BouncePast,
				delay: 0.2
			});
		}
	},
	
	initPulsate: function(selector, options) {
		var elements = $$(selector),
			options = options || {},
			type = 'fade';
		
		elements.each(function(element) {
			new PeriodicalExecuter(function(pe) {
				if(type == 'fade') {
					element.fade({ to: options.to });
					type = 'appear';
				} else {
					element.appear({ from: options.to });
					type = 'fade';
				}
			}, options.speed);
		});
	},
	
	initMinHeight: function(selector, minHeight, options) {
		var elements = $$(selector);
		
		elements.each(function(element){
			if (element.getHeight() < minHeight) {
				element.setStyle({ height: minHeight + 'px' });
			}
		});
	},
	
	initButtonReplacement: function(selector, imageSrc, imageAltText) {
		var element = $$(selector)[0],
			image = new Element('img', { src: imageSrc, alt: imageAltText });
				
		if(element) {
			element.observe('click', function(event) {
				if(element.hide()) {
					element.insert({ after: image });
				}
			});
		}
	}
}

document.observe('dom:loaded', function() {	
	application.initImageFading('.submitButton button', { 
		from: 0.75, 
		fadeDuration: 0.25, 
		resetDuration: 0.15 
	});
	
	application.initBorderFading('.image a img', {
		from: '#e2e2e2',
		to: '#5289ab',
		fadeDuration: 0.25,
		resetDuration: 0.15
	});
			
	application.initHeaderAnimation({ animate: animateHeader });
	
	application.initPulsate('#headerSubTitle', { to: 0.5, speed: 1 });
	application.initPulsate('#headerNavigation .upload', { to: 0.5, speed: 1 });
});