/**
 * Gestion d'un groupe d'image avec JQuery
 *
 * Permet de gÃ©rer un groupe d'images
 *
 * @author bbroussolle
 * @since 2009-10-22
 * @requires jquery
 * @copyrights SQLI 2009
 */


(function($) {
    $.fn.blockImage = function(params) {

        var elements = $(this);

        var obj = {
            idx: -1,
            tmp: new Array(),
            constructor: function(param) {
                this.saveParams(this.defaults);
                this.saveParams(param);
                var elem = this.params.arrElements;
                var count = 0

                elements.children().each(function() {
                    elem.push($(this));
                    obj.tmp.push($(this));
                    if ($.cookie("caroussel") == $(this).attr('src')) {
                        obj.idx = count;
                    }
                    count++;
                });
                this.saveParams({ osTo: this.params.osT * 2, osLo: this.params.osL * 2, osT: this.params.osT - this.params.iH / 2, osL: this.params.osL - this.params.iW / 2 });
                this.carouselInit();
                elements.css({ width: this.params.W * 2 + this.params.iW - this.params.osLo, height: this.params.H * 2 + this.params.iH - this.params.osTo, position: 'relative', overflow: 'hidden' });
                return obj;
            },
            defaults: { osT: 0, osL: 0, W: 200, H: 100, iH: 110, iW: 110, cp: 300, p: 2, s: 1500 },
            params: {
                arrElements: {
                    tableau: new Array(),
                    push: function(elem) { this.tableau.push(elem); },
                    each: function(callback) {
                        for (i = 0; i < this.length(); i++) {
                            this.tableau[i] = callback({ element: this.tableau[i], params: obj });
                        }
                    },
                    eachReadOnly: function(callback) {
                        for (i = 0; i < this.length(); i++) {
                            callback({ element: this.tableau[i], params: obj });
                        }
                    },
                    length: function() { return this.tableau.length; }
                }
            },
            saveParams: function(newParams) { this.params = $.extend(this.params, newParams); },
            carouselInit: function() {
                if (obj.idx != -1) {
                    var nb = obj.tmp.length;
                    for (i = 0; i < nb; i++) {
                        this.params.arrElements.tableau[i] = obj.tmp[(obj.idx + i) % nb];
                    }
                }
                var angle = (Math.PI * 2) / this.params.arrElements.length();
                this.saveParams({ angle: angle });
                var offsetPosition = 1 * Math.PI / 2;
                var count = 0
                this.params.arrElements.each(function(elemAndParam) {
                    var imageAngle = (angle * count) + offsetPosition;
                    var positionLeft = elemAndParam.params.carouselPosLeft(imageAngle);
                    var positionTop = elemAndParam.params.carouselPosTop(imageAngle);
                    var ratio = ((positionTop + elemAndParam.params.params.osT) - ((2 * elemAndParam.params.params.H) - elemAndParam.params.params.p)) / elemAndParam.params.params.p;
                    ratio = (ratio >= 0) ? ratio : 0;
                    var zindex = Math.round(ratio * 100);
                    var opacity = ((positionTop - elemAndParam.params.params.osT) - ((2 * elemAndParam.params.params.H) - elemAndParam.params.params.cp)) / elemAndParam.params.params.cp;
                    opacity = (opacity > 0) ? opacity : 0;
                    count = count + 1;
                    return elemAndParam.element.image({ imageAngle: imageAngle, x: positionLeft, y: positionTop, z: zindex, o: opacity, h: elemAndParam.params.params.iH, w: elemAndParam.params.params.iW, r: ratio, s: elemAndParam.params.params.s })
                });
            },
            carouselPosLeft: function(angle) {
                return (this.params.W + (Math.cos(angle) * this.params.W)) - this.params.osL;
            },
            carouselPosTop: function(angle) {
                return (this.params.H + (Math.sin(angle) * this.params.H)) - this.params.osT;
            },
            carouselMove: function(sens, callback) {
                var multiple = 0;
                switch (sens) {
                    case 'gauche': multiple = 1; break;
                    case 'droite': multiple = -1; break;
                }

                this.params.arrElements.each(function(elemAndParam) {
                    var imageAngle = (elemAndParam.element.params.imageAngle) + (multiple * elemAndParam.params.params.angle);
                    elemAndParam.element.saveParams({ imageAngle: imageAngle });
                    var positionLeft = elemAndParam.params.carouselPosLeft(imageAngle);
                    var positionTop = elemAndParam.params.carouselPosTop(imageAngle);
                    var ratio = ((positionTop + elemAndParam.params.params.osT) - ((2 * elemAndParam.params.params.H) - elemAndParam.params.params.p)) / elemAndParam.params.params.p;
                    ratio = (ratio >= 0) ? ratio : 0;
                    if (ratio == 1) {
                        $.cookie("caroussel", elemAndParam.element.attr('src'), {});
                    }
                    var zindex = Math.round(ratio * 100);
                    var opacity = ((positionTop - elemAndParam.params.params.osT) - ((2 * elemAndParam.params.params.H) - elemAndParam.params.params.cp)) / elemAndParam.params.params.cp;
                    opacity = (opacity > 0) ? opacity : 0;
                    elemAndParam.element.params.position.change(positionLeft, positionTop, zindex);
                    elemAndParam.element.params.scale.changeRatio(ratio);
                    elemAndParam.element.params.opacity.change(opacity);
                    elemAndParam.element.animateByCenter(callback);
                    return elemAndParam.element;
                });

            }
        };
        obj.constructor(params)
        return $.extend($(this), obj);
    };
})(jQuery);
