/*
 *   Dallas : Slideshow horizontal et vertical.
 *   
 *   Developper par Le Phare.
 */

"use strict";

(function($) {
   $.extend($.fn, {
      dallas: function(method) {
         var defaults = {
               width:      '',
               height:     '',
               rows:       false,
               cols:       false
            },

            methods = {
               initialize: function(options) {
                  var viewport = $(this),
                      options  = $.extend(defaults, options),
                      props    = {
                        overflow : 'hidden'
                      };

                  if (options.width != '')
                     props.width = options.width;

                  if (options.height != '')
                     props.height = options.height;

                  $(window).load(function() {
                     viewport.trigger('load.dallas');
                  });

                  var canvas   = $('<div class="dallas-canvas"></div>').css({position: 'relative'});
                  $('body').append(canvas);
                  viewport.data('canvas', canvas);

                  var curcol   = 0;
                  var currow   = 0;
                  var childs   = viewport.css(props).children();

                  if (options.rows || options.cols) {
                     if (!options.cols)
                        options.cols = options.rows;
                     if (!options.rows)
                        options.rows = options.cols;
                  } else {
                     options.cols = options.rows = Math.floor(Math.sqrt(childs.size()));
                  }


                  var box      = {
                         width  : $(childs.get(0)).width(),
                         height  : $(childs.get(0)).height()
                      },
                      size     = {
                         width  :  options.cols * box.width,
                         height :  options.rows * box.height
                      },
                      matrix   = (function() {
                         var m = [];
                         for (var i=0; i < options.rows; i++) {
                            m[i] = [];
                            for (var j=0; j < options.cols; j++) {
                               m[i][j] = {x: j * box.width, y: i * box.height};
                            }
                         }
                         return m;
                      })();

                  viewport.data('options', options);
                  viewport.data('box', box);

                 $(childs).each(function(idx) {
                     var child = $(this);
                     var container = $('<div class="dallas-container ui-state-default"></div>')
                           .css({
                              display: 'block',
                              position: 'relative',
                              top:  matrix[currow][curcol].y,
                              left: matrix[currow][curcol].x,
                              width: 0,
                              height: 0
                           }).data('matrix', [currow, curcol]);

                     canvas.append(container.append(child));

                     if (currow < (options.rows - 1)) {
                        currow = currow + 1;
                     } else if (curcol < (options.cols - 1)) {
                        curcol = curcol + 1;
                        currow = 0;
                     }

                  });

                  canvas
                     .appendTo(viewport)
                     .css(size);

                  $(window).resize(function() {
                     viewport.trigger('resize.dallas');
                  });

                  viewport.bind({
                     'resize.dallas' : function() {
                       // return;
                        var vwidth = viewport.width();
                        var cwidth = canvas.width();
                        canvas.data('margin', (vwidth - cwidth) / 2);
                        canvas.css({
                           'margin-left' : (vwidth - cwidth) / 2
                        });
                     }
                  });

                  viewport.trigger('resize.dallas');

                  return this;
               },
               scroll : function(selector, options) {
                  var viewport = $(this),
                      options  = $.extend({duration: 1000, easing: 'swing'}, options),
                      canvas   = viewport.data('canvas'),
                      box      = viewport.data('box'),
                      element  = $(selector, viewport).closest('.dallas-container'),
                      cmatrix  = element.data('matrix');

                  var margin = (viewport.width() / 2 - box.width / 2) - canvas.data('margin');
                  var new_coordinates = {
                     top:   -1 * cmatrix[0] * box.height,
                     left:  -1 * cmatrix[1] * box.width + margin
                  };

                  canvas
                     .stop(true, true);

                  
                  var evt = $.Event('activate.dallas');
                  viewport.trigger(evt, $(element));
                  if (evt.result !== false) {
                     canvas
                        .animate(new_coordinates, options.duration, options.easing, function() {
                           if (evt.result === true) {
                              $('.ui-state-active', canvas)
                                 .removeClass('ui-state-active')
                                 .addClass('ui-state-default');
                              element
                                 .addClass('ui-state-active')
                                 .removeClass('ui-state-default');
                           }
                        });
                  }
               }
            };

         if (methods[method]) {
            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
         } else if (typeof method === 'object' || !method) {
            return methods.initialize.apply(this, arguments);
         } else {
            $.error('Method ' + method + ' does not exists on jQuery.dallas');
         }
      }
   });
})(jQuery);

