box.dom(document).ready(function() {
	
	box.ui('form').addPatterns({
        phoneNumber:/^0[1-68]([\.|\-|\s]*[0-9]{2}){4}$/
    });

	/**
     * @section     Project Form
     */
	if ($('#projectForm').length) {
        box.ui('form').create({
            element: '#projectForm'
        }).addReplacement();
    }

	
	/**
     * @section     Callback Form
     */
    if ($('#callbackForm').length) {
        box.ui('form').create({
            element: '#callbackForm'
        }).addReplacement().mustValidate(function(form) {
            
            form.field('callbackPhoneNumber').mustValidate(function(field) {
                if(field.isEmpty()) {
                    return l10n.errors.required;
                } else if(!field.isMatching('phoneNumber')) {
                    return l10n.errors.badPhoneNumber;
                }
            });
            return l10n.errors.form;
        });
        //changeDaysOfMonth();
        changeMonthOfYear();


        // classe a  ajouter aux eleÂ©ments lors d'une erreur
        var errorCls = 'error';
        
        // recuperer l'eleÂ©ment adequat pour l'insertion de l'icone d'erreur
        var getErrorTarget = function(field) {
            if('radio' != field.type) {
                return field.getLabel();
            } else {
                return field.getElements().parent().parent().prev();
            }
        };
        
        // ajouter l'icone d'erreur ou changer son alt si deja  present
        var addErrorIcon = function(field, target) {
		    var id = field.name + 'Error';
            var img = box.dom('#' + id);
            if(img.length) {
                img.attr('alt', field.getError());
                img.attr('title', field.getError());
            } else {
                target.append('<img class="error" id="' + id + '" alt="' + field.getError() + '" title="' + field.getError() + '" src="' + l10n.url.imgError + '" />');
            }
        };

        // ajouter une erreur sur un champ
        var addFieldError = function(e) {
            addErrorIcon(e.source, getErrorTarget(e.source).addClass(errorCls));
        };

        // supprimer une erreur d'un champ
        var removeFieldError = function(e) {
            box.dom('#' + e.source.name + 'Error').remove();
            getErrorTarget(e.source).removeClass(errorCls);
        };

        // ajouter une erreur sur un formulaire
        var addFormError = function(e) {
            var id = e.source.id + 'Error';
            var msg = '<p>' + e.source.msg + '</p>';
            var error = box.dom('#' + id);
            if(error.length) {
                error.html(msg);
            } else {
                e.source.getElement().prepend('<div id="' + id + '" class="' + errorCls + '">' + msg + '</div>');
            }
        };

        // supprimer une erreur d'un formulaire
        var removeFormError = function(e) {
            box.dom('#' + e.source.id + 'Error').remove();
        };
        
        
        box.bind({     
            'error.form': addFormError,
            'valid.form': removeFormError,
            'error.field.text': addFieldError,
            'error.field.select': addFieldError,
            'valid.field.select': removeFieldError,
            'valid.field.text': removeFieldError,
            'change.field.select.callbackMonth': function(e) {
                changeDaysOfMonth();
            },
			 'change.field.select.callbackYear': function(e) {
                changeMonthOfYear();
            }
        });
    }

    
    /**
     * @section       Carousels
     * @note          Manage carousels
     */
    // boucler sur tous les div ayant une classe "carousel"
    box.dom('div.carousel').each(function(i, elm) {
        // attention box.ui('carousel') fait référence au composant de base
        // qui permet de créer / détruire / configurer
        // donc pour créer un nouveau carrousel, c'est obligé de passer par là 
        if (this.id == "testimonyCarousel") {
            box.ui('carousel').create({ 
                element: elm, 
                horizontal: true, 
                display: 1, // nombre d'items affichés 
                duration: 600 // temps des transitions (donc animation) 
            });
            /* box.ui('carousel.partners').startAutoplay(1000); // Autoplay*/
        } else {
            box.ui('carousel').create({
                element: elm,
                horizontal: true,
                display: 1, // nombre d'items affichés
                duration:600 // temps des transitions (donc animation)
            }); 
        }
    }); 
});

(function() {
        
	
    $(document).ready(function () {
        slideShow.init('#scopeCarousel');
        $('#schedule').click(manageCalendar);
    });
    
    var slideShow = {
        duration: 1000, // fading time (ms)
        interval: 10000, // interval between two fades (ms)
        alea: false, // if true, next item defined randomly else sequentialy
        firstItem: 0, // firstItem to be display. If 0 first item is set randomly
        currentItem:1, // Item currently displayed
        nextItem:2, // Next item to display
        nbItems:1, // Total item
        init: function (elmt) {
            if ($(elmt + " .carouselInner ul").hasClass('alea')) {
                slideShow.alea = true;
            }
            if ($(elmt + " .carouselInner ul").hasClass('firstItem')) {
                slideShow.firstItem = 1;
            }
            
            slideShow.nbItems = $(elmt + " .carouselInner ul li").length;
            slideShow.firstItem = (slideShow.firstItem > slideShow.nbItems) ? 0 : slideShow.firstItem;
            if (slideShow.nbItems > 1) {
                slideShow.currentItem = slideShow.firstItem;
                if (slideShow.firstItem == 0) {
                    slideShow.currentItem = Math.floor(Math.random() * slideShow.nbItems) + 1;
                }
                
                // Pagination
                var pagination = '<div class="pagination"><ul>';
                for (var i=1; i <= slideShow.nbItems; i++) {
                    strClassOn = (i == slideShow.currentItem) ? " class='on'" : '';
                    pagination += '<li'+strClassOn+'><a href="#">'+i+'</a></li>';
                }
                pagination += '</ul></div>';
                $(elmt).find('.carouselInner').before(pagination);
    
                // Initialize items display
                var aLi = $(elmt).find('.carouselInner ul li');
                for (var j=0; j < slideShow.nbItems; j++) {
                    cpt = j+1;
                    if (cpt != slideShow.currentItem) {
                        $(aLi[j]).hide();
                    }
                }
                // Bind click
                slideShow.bindClick(elmt);
                // Go to next slide
                slideShow.nextSlide(elmt);
            }
        },
        bindClick: function (elmt) {
            $(elmt).find('.pagination a').click(function () {
                if(!$(elmt).hasClass('move') && !$(this).parent().hasClass('on')) {
                    slideShow.nextItem = parseInt($(this).text());
                    slideShow.slide(elmt);
                }
                return false;
            });
        },
        nextSlide: function(elmt) {
            if (slideShow.alea) {
                // randomly
                slideShow.nextItem = slideShow.currentItem;
                while (slideShow.nextItem == slideShow.currentItem) {
                    slideShow.nextItem = Math.floor(Math.random() * slideShow.nbItems) + 1;
                }
            } else {
                // sequentialy
                if (slideShow.currentItem == slideShow.nbItems ) {
                    slideShow.nextItem = 1;
                } else {
                    slideShow.nextItem = slideShow.currentItem + 1;
                }
            }
            if (this.timer) {
               clearTimeout(this.timer);
            }
            this.timer = setTimeout(function(){slideShow.slide(elmt)}, slideShow.interval);
        },
        slide: function (elmt) {
            $(elmt).addClass('move');
            var aLi = $(elmt).find('.carouselInner ul li');
            var aLiNewIndex = slideShow.nextItem - 1;
            var aLiOldIndex = slideShow.currentItem - 1;

            $(aLi[aLiNewIndex]).fadeIn(slideShow.duration);
            $(aLi[aLiOldIndex]).hide();
            
            // Update pagination
            var aPages = $(elmt).find('.pagination ul li');
            $(aPages[aLiOldIndex]).removeClass('on');
            $(aPages[aLiNewIndex]).addClass('on');

            // Update Slideshow
            slideShow.currentItem = slideShow.nextItem;
            $(elmt).removeClass('move');
            
            // Next slide
            slideShow.nextSlide(elmt);
        }
    };
    
    /**
     * @section     Home Calendar
     */
    var calendar = box.dom('#schedule'),
        rePrevNextLinks = /\b(prev|next)\b/;
    
    /**
     * @description  change the block to be loaded with a loader
     */
    var openLoader = function(where) {
        if (where == 'calendar') {
            var h = $("#schedule").height();
            var w = $("#schedule").width();
            $("#schedule").replaceWith('<div id="schedule"><img src="' + l10n.url.transparent + '" alt="' + l10n.loading + '" style="height:'+h+'px; width:'+w+'px; background:url('+l10n.url.loader+') no-repeat 50% 50%" /></div>');
        }
    };
    

    /**
     * @description  change the content of div#asideCalendar done by clicking on the previous / next buttons in the table caption
     */
    var changeCalendar = function(e, lk) {
        openLoader('calendar');
        var paramsVals = lk.href.replace(/.+\?/, '').split('&');
        var paramval = new Array();
        var date = new Array();
        var oMyVars = {};
        for (i=0; i<paramsVals.length; i++) {
            paramval[i] = paramsVals[i].split('=');
            oMyVars[paramval[i][0]] = paramval[i][1];
        }
        $.get(l10n.url.agenda.homeCalendar, 
            oMyVars, 
            function(data){
                $("#schedule").replaceWith(data);
                $("#schedule").click(manageCalendar);
                $("#schedule").click();
                //changeExhibitions(e,lk);
            }
        );
    };
    
    /**
     * @description  manage all clicks on div#asideCalendar
     */
    var manageCalendar = function(e) {
        var t = e.target;
        while(t && t != this) {
            if(t.nodeName.toLowerCase() == 'a') {
                if(rePrevNextLinks.test(t.className)) {
                    e.preventDefault();
                    changeCalendar(e, t);
                    break;
                }
            }
            t = t.parentNode;
        }
    };
    
})();