/**
 * Définit une classe applicative JavaScript, gérant l'inclusion de modules externes.
 * @requires	mootools core v1.2, mootools more v1.2
 * @author		fox@dogstudio.be
 * @file		bizzbooster-frontend.js
 * @date		7 novembre 2011
 */


/**
 * Définition d'une classe de gestion d'instance singleton
 * @see MooTools.Class
 */
Class.Singleton = new Class({

	initialize: function(classDefinition, options){
		var singletonClass = new Class(classDefinition);
		return new singletonClass(options);
	}

});


/**
 * Définition de la classe d'application (singleton) JavaScript
 * Cette classe est automatiquement instanciée lors de l'inclusion du fichier JavaScript
 */
var Bizzbooster = new Class.Singleton({
	
	/**
	 * Implémente Options et Events afin de permettre le lancement de méthodes de callback sur le chargement des modules
	 */
	Implements:[Options,Events],
	
	/**
	 * Initialise l'instance de l'application
	 * @param options les éventuelles options d'application
	 */
	initialize:function(options) {
		this.setOptions(options);
		this.initRoot();
		window.addEvent('domready',this.onload.bind(this));
	},
	
	/**
	 * Initialise la racine d'inclusion des javascripts
	 */
	initRoot:function(){
		// Recherche de la balise script d'inclusion de ce fichier
		$(document.head).getElements('script').some(function(tag){
			if(tag.get('src').match('bizzbooster-frontend.js')) {
				// On récupère le chemin d'accès à ce fichier JavaScript
				this.path = tag.get('src').replace('bizzbooster-frontend.js','');
				this.root = tag.get('src').replace('function/js/bizzbooster-frontend.js','');
				// On arrête de chercher d'autres balises
				return true;
			}
			return false;
		}.bind(this));
	},
	
	/**
	 * Charge la définition du module donné
	 * @param string module le nom du module à injecter
	 * @param callback callback la fonction de callback optionnelle à exécuter après chargement du module
	 * @depends Mootools.More.Asset
	 */
	importModule:function(module,callback){
		// Construit la balise script d'inclusion du module
		var options = {};
		if(callback) {
			options = {onLoad:callback};
		}
		Asset.javascript(this.path + 'modules/' + module + '.js',options);
	},
	
	/**
	 * Lance les actions à réaliser lors de la fin du chargement de l'application
	 */
	onload:function() {
		this.initModernizer();
		this.initFrontend();
		this.initSlider();
		this.initFocuser();
		this.initToggleinput();
		this.initLinkFollower();
		this.initHelpForm();
		this.initUiSlider();
		
		$$('span').each(function(el){
			sClass = el.get('class');
			if(sClass.contains('skype_pnh_print_container')){
				el.setStyles({
					display:'block'
				});
			};
		});
	},
	
	
	initSlider:function() {
		if($('home-slider') || $('partners-slider')) {
			this.importModule('dogslider',function(){
				if($('home-slider'))
					dogSlider('home-slider', '.slide', true, true, true);
				if($('partners-slider'))
				dogSlider('partners-slider', '.slide', true, false, true);
			});	
		}
	},
	
	initFrontend:function() {
		this.importModule('frontend',function(){
			checkBrowser();
			setFooter();
			
			$$('.offer').each(function(el){
				el.addEvents({
					'mouseenter':function(){
						el.addClass('offer-hover');	
					},
					'mouseleave':function(){
						el.removeClass('offer-hover');	
					}
				});
			});
			
			$(document.body).addEvent('click',function(e) {
				if($$('#header-search .field')) $$('#header-search .field').removeClass('on-focus');
			   	if($('other-flags')) $('other-flags').setStyle('display','none');
				if($('current-country')) $('current-country').removeClass('open');
			});
			if($('current-country')) {
				$('current-country').addEvent('click',function(el){
					el.stopPropagation();
					sState = $('other-flags').getStyle('display');
					if(sState == "none"){
						$('other-flags').setStyle('display','block');
						$(this).addClass('open');
					}else{
						$('other-flags').setStyle('display','none');
						$(this).removeClass('open');
					}
				});
			}
			
			if($('header-search-input')) {
				$('header-search-input').addEvent('focus',function(el){
					$$('#header-search .field').addClass('on-focus');
				}).addEvent('change',function(el){
					$$('#header-search .field').removeClass('on-focus');
				}).addEvent('click',function(el){
					el.stopPropagation();
				});
			}
			
			if($('submenu')) setMenu();
			
			setElementsHeight('.submenu-top');
			setElementsHeight('.submenu-bottom');
		});
	},
	
	
	initModernizer:function(){
		this.importModule('modernizr-2.0.6.min');
	},
	
	
	initFocuser:function(){
		if($$('.focus')) {
			this.importModule('focuser', function() {
				$$('.focus').each(function(toFocus){
					new Focuser(toFocus);
				});
			});
		}
	},
	
	
	initToggleinput:function() {
		if($$('input.toggle-input')) {
			this.importModule('toggle-input', function(){
				$$('input.toggle-input').each(function(input){
					new ToggleInput(input);
				});
			});
		}
	},
	
	
	initLinkFollower:function() {
		if($$('.follow-link-form')) {
			this.importModule('link-follower',function(){
				$$('.follow-link-form').each(function(form) {
					new LinkFollower(form);
				});
			});
		}
	},
	
	
	initHelpForm:function() {
		if($$('.help-form')) {
			this.importModule('helpForm',function(){
				$$('.help-form').each(function(form){
					new HelpForm(form);
				});
			});
		}
	},
	
	
	initUiSlider:function() {
		if($$('.slider')) {
			this.importModule('uiSlider',function(){
				$$('.slider').each(function(slider){
					new uiSlider(slider);
				});
			});
		}
	}
	
});

