/**
 * TrenzUP! Javascript definition file
 * 
 * @author fox@dogstudio.be
 */

window.addEvent('domready',function(){
	$$('ul.menu').each(function(list){
		var parent = list.getParent('li');
		if($defined(parent)) {
			var label = parent.getChildren('.expander');
			if($defined(label)) {
				label.addEvent('click',function(){
					list.toggleClass('hidden');
				});
				list.addClass('hidden');
			}
		}
	});
	
	$$('.scrollTo').each(function(el){
		var myElement = $(document.body);
		var myFx = new Fx.Scroll(myElement);
		var sUrl = el.getProperty('href');
		
		el.addEvent('click', function() {
			el.setProperty('href', '#');
			sAnchor = sUrl.substring(1);
			myFx.toElement(sAnchor);
			return false;
		});
	});
	
	/**
	 * Gère automatiquement les labels internes à des champs textes
	 */
	$$('.toggling').each(function(input,index){
		var initial = input.value;
		input.addEvents({
			focus:function(){
				if(input.value == initial) {
					input.value = '';
				}
			},
			blur:function(){
				if(input.value == '') {
					input.value = initial;
				}
			}
		});
	});
	
	/**
	 * Gère la disparition des éléments de classe 'to-hide'
	 */
	$$('.to-hide').setStyle('display','none');
	
});

function login_box_toggle() {
	if($defined($('open-login'))) {
		$('open-login').set('id','close-login');
	} else if($defined($('close-login'))){
		$('close-login').set('id','open-login');
	}
}

/**
 * Définition d'une classe de gestion d'instance singleton ("à-la-flash")
 */
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 de Trenzup
 */
var Application = 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',function(event){
			this.onload();
		}.bind(this));
	},
	
	/**
	 * Initialise la racine d'inclusion des javascripts
	 */
	initRoot:function(){
		$(document).getElements('script').some(function(tag){
			if(tag.get('src').match('trenzup.js')) {
				this.root = tag.get('src').replace('trenzup.js','');
				this.baseurl = tag.get('src').replace('function/js/trenzup.js','');
				return true;
			}
			return false;
		}.bind(this));
	},
	
	/**
	 * Lance les actions à réaliser lors de la fin du chargement de l'application
	 */
	onload:function() {
		// Initialise les actions Javascript automatiques
		this.initPerformer();
		
		// Initialise le gestionnaire de popup
		this.initPopup();
		
		// Initialise les éventuels panels
		this.initPanels();
		
		// Initialise l'éventuelle auto-complétion des marques
		this.initBrandAutoComplete();
		
		// Initialise l'éventuel carousel
		this.initCarousel();
		
		// Initialise les tooltips (sur l'inscription par exemple)
		this.initTips();
	},
	
	
	
	// Gestion des inclusions de modules automatiques
	
	/**
	 * 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
	 */
	importModule:function(module,callback){
		// Définit l'événement lié au chargement du module à partir du nom du module et de la fonction de callback optionnelle
		if(callback != undefined) {
			this.addEvent(module+'Loaded',callback);
		}
		
		// Construit la balise script d'inclusion du module
		var el = new Element('script',{
			src:this.root + module + '.js',
			type:'text/javascript'
		});
		
		// Chargement du module sur la page
		$(document.head).adopt(el);
	},
	
	
	
	// Gestion des actions automatiques
	
	/**
	 * Initialisation des actions automatiques
	 */
	initPerformer:function() {
		$$('.actionSource').each(function(el){
			var event = el.get('ei:performer');
			var action = el.get('ei:action');
			var param = el.get('ei:param');
			el.addEvent(event,this.perform(action, param));
		}.bind(this));
	},
	
	/**
	 * Lance une action sur le système
	 * @param string action l'action à lancer
	 * @param string param le paramètre éventuel de l'action
	 */
	perform:function(action,param) {
		var ajax = new Request.JSON({
			url:'../../service.php?module=trenzup&action=dispatcher'
		}).post({action_name:action,action_param:param});
	},
	
	
	
	// Gestion des interfaces utilisateur
	
	confirm:function(message,callbackTrue,callbackFalse) {
		if(window.confirm(message)) {
			callbackTrue();
		} else {
			callbackFalse();
		}
	},
	
	
	
	// Gestion des réactivations en un clic
	
	/**
	 * Provoque la réactivation "one-click" d'une annonce
	 * @param integer auctionID l'identifiant de l'annonce à réactiver
	 */
	instantReactivate:function(auctionID) {
		var form = new Element('form',{
			action:window.location.href,
			method:'post'
		});
		var input = new Element('input',{
			type:'hidden',
			name:'resale_iId',
			value:auctionID
		});
		form.adopt(input);
		$(document.body).adopt(form);
		form.submit();
	},
	
	
	
	// Gestion des annulations d'annonces
	
	/**
	 * Provoque l'annulation de l'annonce dont on renseigne l'identifiant
	 * @param integer auctionID l'identifiant de l'annonce à annuler
	 */
	cancel:function(auctionID) {
		var form = new Element('form',{
			action:window.location.href,
			method:'post'
		});
		var input = new Element('input',{
			type:'hidden',
			name:'cancel_iId',
			value:auctionID
		});
		form.adopt(input);
		$(document.body).adopt(form);
		form.submit();
	},
	
	
	
	// Gestion des actions de la page d'inscription
	
	/**
	 * Initialise les volets
	 */
	initPanels:function() {
		$$('.panelSwitcher').each(function(panel){
			if(!panel.hasClass('visible')) {
				panel.setStyle('display','none');
			}
		});
	},
	
	/**
	 * Provoque l'alternance de visibilité de panneaux
	 */
	switchPanel:function(toShow) {
		var el = $(toShow);
		$$('.panelSwitcher').setStyle('display','none');
		el.setStyle('display','block');
	},
	
	/**
	 * Gère le formattage et l'envoi du formulaire d'inscription
	 */
	submitRegisterForm:function(formID) {
		var form = $(formID);
		var isProfessional = form.getElement('#user_iProfessional_yes').get('checked');
		if(isProfessional) {
			form.getElement('#private-form').dispose();
		} else {
			form.getElement('#professional-form').dispose();
		}
		form.submit();
	},
	
	
	// Gestion de l'autocomplétion
	
	/**
	 * Initialise l'autocomplétion par import du module
	 */
	initBrandAutoComplete:function(){
		if($$('.autocomplete')) {
			this.importModule('cwcomplete', function() {
				$$('.autocomplete').each(function(input){
					var options = {
						ajaxMethod:'post',
						ajaxParam:'search_sQuery',
						clearChoicesOnBlur:true,
						inputMinLength:3,
						onChoose:function(choosen){
							window.location.assign(choosen.key);
						}
					};
					var source = input.get('ei:source');
					var target = input.get('ei:target');
					if(target) {
						options.targetFieldForKey = target;
					}
					var container = input.get('ei:container');
					if(container) {
						options.suggestionContainer = container;
					}
					
					new CwAutocompleter(input,source,options);
				});
			});
		}
	},
	
	
	// Gestion des carousel
	
	
	initCarousel:function() {
		if($$('.carousel') || $$('.brand-carousel')) {
			this.importModule('slide-gallery', function() {
				$$('.carousel').each(function(carousel){
					var options = {
						holder:'.carousel_content',
						elementsParent:'.carousel_slider',
						elements:'.carousel-box',
						nextItem:'.carousel_to_right',
						prevItem:'.carousel_to_left',
						autoplay:false,
						stopOnHover:true,
						steps:2,
						mode:'circle'
					};
					new slideGallery(carousel,options);
				});
				$$('.brand-carousel').each(function(brands){
					var options = {
						holder:'.brand-wrapper',
						elementsParent:'.brand-slider',
						elements:'.brand-list',
						autoplay:true,
						stopOnHover:true,
						steps:1,
						mode:'circle',
						direction:'vertical'
					};
					new slideGallery(brands,options);
				});
			});
		}
	},
	
	
	
	// Gestion du popup
	
	
	initPopup:function() {
		this.importModule('popup',function(){
			// création du popup
			//this.popup = new Popup(this.baseurl);
			// remplacement du popup d'alerte par défaut
			//window.alert = this.popup.alert.bind(this.popup);
		}.bind(this));
	},
	
	
	initTips:function() {
		if($$('.tipped')) {
			$$('.tipped').each(function(field){
				var tip = $(field).get('ei:element-tip');
				if($(tip)) {
					$(tip).setStyle('display','none');
					$(field).addEvents({
						'mouseenter':function(){
							var tip = $(field).get('ei:element-tip');
							if($(tip)) {
								$(tip).setStyle('display','block');
							}
						}.bind(this),
						'mouseleave':function(){
							var tip = $(field).get('ei:element-tip');
							if($(tip)) {
								$(tip).setStyle('display','none');
							}
						}.bind(this)
					});
					if($(field).getElements('input')) {
						$(field).getElements('input').addEvents({
							'focus':function(){
								var tip = $(field).get('ei:element-tip');
								if($(tip)) {
									$(tip).setStyle('display','block');
								}
							}.bind(this),
							'blur':function(){
								var tip = $(field).get('ei:element-tip');
								if($(tip)) {
									$(tip).setStyle('display','none');
								}
							}.bind(this)
						});
					}
				}
			}.bind(this));
		}
	}
	
	
});

