// jQuery.bbrk.home.viewer.js

(function ($) {
  
  if (typeof $.bbrk === "undefined") {
    $.bbrk = {};
  }
  
  if (typeof $.bbrk.home === "undefined") {
    $.bbrk.home = {};
  }
  
  $.bbrk.home.viewer = function ($content) {
    
    var $viewer;
    var $logo;
    var $preloader;
    var $slider;
    var $toolTip;
    var $specGallery;
    var $thumbList;
    var $shopLink;
    var $imageInfo;
    
    var preloaderEvents = $.bbrk.home.preloader.events;
    var imageInfoEvents = $.imageInfo.events;
    var sliderEvents = $.bbrk.home.slider.events;
    var specGalleryEvents = $.bbrk.home.specGallery.events;
    var thumbListEvents = $.bbrk.home.thumbList.events;
    
    var jsonPath = $.bbrk.home.viewer.JSON_PATH;
    
    var events = $.bbrk.home.viewer.events;
    
    var isComplete = false;

    
    $viewer = $("<div>", {
      id: "viewer"
    });

    $logo = $.bbrk.home.logo($content.find("header:eq(0) h1").html());

    $preloader = $.bbrk.home.preloader();

    $viewer.append($logo, $preloader);
    
    function onShowComplete() {

      $preloader.off(preloaderEvents.SHOW_COMPLETE, onShowComplete);

      $.ajax({
        url: jsonPath,
        dataType: "json",
        cache: false,
        success: onJSONLoad
      });
    }
    
    function onJSONLoad(data, textStatus, jqXHR) {

      $preloader.on(preloaderEvents.COMPLETE, onPreloaderComplete);
      
      $slider = $.bbrk.home.slider(data.productData);
      $toolTip = $.bbrk.home.toolTip();
      $specGallery = $.bbrk.home.specGallery(data.productData);
      $thumbList = $.bbrk.home.thumbList(data.productData);
      $shopLink = $.bbrk.home.shopLink(data.shopLink);

      $slider.hide(0);
      $thumbList.hide(0);
      $shopLink.hide(0);
      
      $viewer.append($slider, $toolTip, $specGallery, $thumbList, $shopLink);
      
      $slider.on("click", onSliderClick);
      $slider.on("mouseenter", onSliderEnter);
      $slider.on("mouseleave", onSliderLeave);
      $slider.on(sliderEvents.SLIDE_START, onSlideStart);
      $slider.on(sliderEvents.SLIDE_END, onSlideEnd);
      
      $specGallery.on(specGalleryEvents.HIDE, onSpecGalleryHide);

      $thumbList.on(thumbListEvents.THUMB_CLICK, onThumbListItemClick);
      
      $imageInfo = $.imageInfo($viewer, true);
      $imageInfo.on(imageInfoEvents.CHANGE, onImageInfoChange);
      $imageInfo.on(imageInfoEvents.COMPLETE, onImageInfoComplete);
      $imageInfo.load();
    }
    
    function onImageInfoChange(e) {
      $preloader.setPercentage($imageInfo.getImageLoaded() / $imageInfo.getImageTotal());
    }
    
    function onImageInfoComplete(e) {
      isComplete = true;
      $viewer.trigger(events.COMPLETE);
      $imageInfo.off(imageInfoEvents.COMPLETE, onImageInfoComplete);
    }
    
    function onPreloaderComplete(e) {
      
      $preloader.off(preloaderEvents.COMPLETE, onPreloaderComplete);
      
      setTimeout(function () {
        $preloader.on(preloaderEvents.HIDE_COMPLETE, onHideComplete);
        $preloader.hide();
      }, 600);

      setTimeout(function () {
        $shopLink.show(600, "easeOutExpo");
      }, 1000);

      setTimeout(function () {
        $thumbList.show(600, "easeOutExpo");
      }, 1200);

      setTimeout(function () {
        $slider.show(900, "easeInOutExpo");
        $slider.play();
      }, 1000);
      
    }
    
    function onHideComplete(e) {
      $preloader.off(preloaderEvents.HIDE_COMPLETE, onHideComplete);
      $preloader.remove();
    }
    
    function onSliderClick(e) {
      var index = $slider.getCurrentPage();
      $slider.pause();
      $specGallery.show(index, 300, "easeInOutExpo");
      $toolTip.fadeOut(600);
    }
    
    function onSliderEnter(e) {
      $toolTip.fadeIn(300, "easeOutExpo", e.pageY, e.pageX);
    }
    
    function onSliderLeave(e) {
      $toolTip.fadeOut(600);
    }
    
    function onSlideStart(e) {
      $thumbList.move($slider.getCurrentPage());
    }
    
    function onSlideEnd(e) {
      $thumbList.setActive($slider.getCurrentPage());
    }
    
    function onThumbListItemClick(e, i) {
      $slider.slideTo(i, 300, "easeInOutExpo");
      $slider.pause();
      $specGallery.show(i, 300, "easeInOutExpo");
      $thumbList.move(i);
      $thumbList.setActive(i);
      $toolTip.fadeOut(400);
    }
    
    function onSpecGalleryHide(e) {
      $slider.play();
    }
    
    
    $viewer.setHeight = function (height) {
      $viewer.css({
        height: height
      });
    };
    
    $viewer.show = function () {
      $preloader.on(preloaderEvents.SHOW_COMPLETE, onShowComplete);
      $preloader.show();
    };
    
    $viewer.play = function () {
      $slider.play();
    };
    
    $viewer.pause = function () {
      $slider.pauseAll();
    };
    
    $viewer.resizeCurrent = function (width, height) {
      if (!isComplete) {
        return;
      }
      $slider.resizeCurrent(width, height);
    };
    
    $viewer.resizeAll = function (width, height) {
      if (!isComplete) {
        return;
      }
      $slider.resizeAll(width, height);
    };
    
    return $viewer;
  };
  
  $.bbrk.home.viewer.JSON_PATH = "./assets/json/viewer.json";

  $.bbrk.home.viewer.events = {
    COMPLETE: "complete"
  };  

})(jQuery);

