// page init
$(function(){
  initPopups();
});

//overlay constructor
var _OVERLAY = function (options) {
  this.settings = $.extend({
    prependTo: 'body',
    id: 'lightbox-overlay',
    opacity:0.4,
    backgroundColor:'#000',
    speed:350,
    zIndex:1000
  }, options);

  this.overlay = $('#' + this.settings.id);

  if (!this.overlay.length) {
    this.overlay = $('<div />');
    this.overlay.attr('id', this.settings.id);
    $(this.settings.prependTo).prepend(this.overlay);
  }

  this.overlay.css({
    position:'fixed',
    top:0,
    left:0,
    display:'none',
    width:'100%',
    height:'100%',
    overflow:'hidden',
    zIndex:this.settings.zIndex,
    opacity:this.settings.opacity,
    backgroundColor:this.settings.backgroundColor
  });
  this.status = 'closed';
};

_OVERLAY.prototype = {
  open: function (callback) {
    var self = this,
      settings = self.settings;
    if (self.status !== 'opened') {
      self.overlay.fadeIn(settings.speed, callback);
    } else if (callback) {
      callback();
    }
    self.status = 'opened';
  },
  
  close: function (callback) {
    var self = this,
      settings = self.settings;
    self.overlay.fadeOut(settings.speed, callback);
    self.status = 'closed';
  },
  
  init: function() {
    this.overlay.css({
      opacity:0.4,
      backgroundColor:'#000'
    });
  },
  
  change: function() {
    this.overlay.css({
      opacity:0.5,
      backgroundColor:'#000'
    });
  }
};

// viewport constructor
var _VIEWPORT = function (win) {
  win = win || window;
  this.window = $(win);
  this.width = 0;
  this.height = 0;
  this.scrollTop = 0;
  this.scrollLeft = 0;
};

_VIEWPORT.prototype = {
  getDimension: function () {
    var win = this.window;
    this.width = win.width();
    this.height = win.height();
  },
  getScroll: function () {
    var win = this.window;
    this.scrollTop = win.scrollTop();
    this.scrollLeft = win.scrollLeft();
  },
  init: function () {
    var self = this,
      win = self.window;
    self.getDimension();
    self.getScroll();
    win
      .bind('resize', function () {
        self.getDimension();
        self.getScroll();
      })
      .bind('scroll', function () {
        self.getScroll();
      });
  }
};

// popup constructor
var _POPUP = function (obj, options) {
  this.settings = $.extend({
    closeLink:'.closearea a, a.close, a.cancel',
    zIndex:1000,
    fadeSpeed:350
  }, options);

  // Set Popup Data
  obj.data('wrapper', this);
  obj.data('parentPopup', obj.parents('.js-popup'));

  // Set Popup Object Properties
  this.container = obj.addClass('js-popup');
  this.closeLink = obj.find(this.settings.closeLink);
};

// Popup Object Methods
_POPUP.prototype = {
  setPosition: function () {
    var self = this,
      settings = self.settings,
      posTop = 0,
      posLeft = 0;
    if (self.hasDragged) {
      return;
    }
    self.width = self.container.outerWidth(true);
    self.height = self.container.outerHeight(true);

    // check vertical position
    if (viewport.height > self.height) {
      posTop = ((viewport.height - self.height) / 2);
    } else {
      posTop = 0;
    }

    // check horizontal position
    if (viewport.width > self.width) {
      posLeft = (viewport.width - self.width) / 2;
    } else {
      posLeft = 0;
    }

    // set position
    self.container.css({
      position:'fixed',
      top:posTop,
      left:posLeft
    });
  },
  
  getMaxZIndex: function () {
    if (!window.popupRegistry) {
      return this.settings.zIndex;
    }
    
    var self = this,
      settings = self.settings,
      i = popupRegistry.length,
      max = settings.zIndex,
      z = 0;
    
    while (i--) {
      z = parseInt(popupRegistry[i].container.css('z-index'), 10);
      if (z > max) {
        max = z;
      }
    }
    return max;
  },
  
  open: function (callback) {
    var self = this,
    settings = self.settings,
    opener = self.container.data('opener'),
    target =  self.container.data('target');
    
    self.parentPopup = (opener && $(opener).parents('.js-popup').length) ? $(opener).parents('.js-popup').data('wrapper') : null;

    if (self.parentPopup) {
      self.parentPopup.childPopup = self;
      self.parentPopup.close();
    }

    if (target == 'popup-extend-player') {
      fader.change();
      fader.overlay.click(function(event) {
        self.close();
        fader.overlay.unbind('click');
      });
    } else {
      fader.init();
    }
    
    fader.open(function () {
      self.setPosition();
      self.container.fadeIn(settings.fadeSpeed, function () {
        if (callback && typeof callback === 'function') {
          callback();
        }
        self.status = 'opened';
      }).css('z-index', self.getMaxZIndex() + 1);
      
      if($(opener).hasClass("noscroll"))
      {
      	$("body").css("overflow", "hidden");
      	$("body").css("position", "relative");
      }
    });
  },
  
  close: function (callback) {
    var self = this;
    var settings = self.settings;

    var popupname = self.container.data('name');
    if ($.browser.msie && (popupname == 'embed' || popupname == 'sponsor')) {
      callback = function() {
        try {
          location.reload();
          //thisMovie('embed-player').fn_play_stop('stop');
        } catch(e){}
      }
    }
    
    self.container.fadeOut(settings.fadeSpeed, function () {
      self.hasDragged = false;
      self.status = 'closed';

      if (self.parentPopup) {
        self.parentPopup.open(function () {
          self.parentPopup.childPopup = null;
          //self.parentPopup = null; 
        });
      } else if (!self.childPopup) {
        fader.close();
      }

      if (callback && typeof callback === 'function') {
        callback();
      }
      
      var opener = self.container.data('opener');

      if ($(opener).attr("name")) {
        self.container.removeClass($(opener).attr("name"));
      }
      
      if($(opener).hasClass("noscroll")) {
	      $("body").css("overflow", "visible");
	      $("body").css("position", "static");
      }
      
      var closeCallbackFuncList = $(opener).data('closeCallbackFuncList');
      
      if(closeCallbackFuncList && typeof closeCallbackFuncList != 'undefined') {
    	  for(var idx = 0; idx< closeCallbackFuncList.length ;idx++) {
    		  var callbackFunction = closeCallbackFuncList[idx];
    		  callbackFunction();
    	  }
      }
    });
  },
  
  register: function () {
    if (!window.popupRegistry) {
      window.popupRegistry = [];
    }
    if (!this.container.data('registered')) {
      popupRegistry.push(this);
      this.container.data('registered', true);
    }
  },
  
  init: function () {
    var self = this,
      settings = self.settings;

    // Initiate viewport object and fader object if needed
    if (!window.viewport) {
      window.viewport = new _VIEWPORT();
      viewport.init();
    }
    if (!window.fader) {
      window.fader = new _OVERLAY({prependTo: self.container.parent()});
    }

    if (self.isChildPopup) {
      self.closeLink.die('click.popup');
    }
    self.closeLink.live('click.popup', function (e) {
      e.preventDefault();
      self.close();
    });

    // Make It Draggable
    self.container.draggable({
      cursor: 'move',
      cancel: settings.closeLink + ', object, embed, textarea, input, select, option',
      distance: 50,
      start: function (event, ui) {
        var z = parseInt(self.container.css('z-index'), 10),
          max = self.getMaxZIndex();
        if (z < max) {
          self.container.css('z-index', max + 1);
        }
      },
      stop: function (event, ui) {
        self.hasDragged = true;
      }
    });
    $(window).bind('resize.popup', function () {
      self.setPosition();
    });
    self.register();
    self.initialized = true;
  }
};

function closeAllPopups() {
  if (!window.popupRegistry) {
    return;
  }
  var i = popupRegistry.length;
  while (i--) {
    popupRegistry[i].close();
  }
}

//popups function
var opener;
function initPopups() {
  $("a.open-popup")
  .die('click.initPopups')
  .live('click.initPopups', function (e) {
    e.preventDefault();
    
    var _ajaxClass = 'ajax-load';
    var _popup = "popup";
    var settings = {};

    opener = this;
    var $opener = $(opener),
      target = $opener.attr("href"),
      $target;
    //console.log(target);

    if (target.indexOf('#') < 0) {
      return;
    } else {
      target = target.split('#');
      if (target.length > 1) {
        target = target[1];
        
        if ($opener.attr("target")) {
          _popup = $opener.attr("target")
        }
        
        if($opener.hasClass(_ajaxClass)) {
          $target = $("#"+_popup);
          $target.removeClass();
          $target.addClass("popup");
          
          if ($opener.attr("name")) {
            $target.addClass($opener.attr("name"));
          }

          $.ajax({
            url: target,
            type: "GET",
            dataType: "html",
            success: function(msg){
              //log(msg);
              init(settings);
              $("div.contarea", $target).html(msg);
            },
            error: function(msg){
              alert('AJAX error!');
              return false;
            }
          });
        } else {
          $target = $('#' + target);
          init(settings);
        }
      } else {
        return;
      }
    }

    function init(settings) {
      opener.popup = new _POPUP($target, settings);
      opener.popup.init();
  
      opener.popup.container.data('opener', opener);
      opener.popup.container.data('target', target);
      opener.popup.container.data('name', $(opener).attr("name"));
      opener.popup.open();
    }
  });
}

// crop popup
function openCropPopup(options) {
  if (window.cropPopup) {
    cropPopup.cropper.destroy();
    cropPopup = null;
  }

  var settings = $.extend({
    popupSelector: '#popup',
    imgHolder: '#cropImgHolder',
    coordsSave: 'input:hidden#cropCoords'
  }, options);
  
  window.cropPopup = new _POPUP($(settings.popupSelector));
  cropPopup.init();
  cropPopup.imgHolder = $(settings.imgHolder);
  cropPopup.coordsSave = $(settings.coordsSave);
  
  $(cropPopup.container).addClass("crop");
 
  /*
  if (!cropPopup.coordsSave.length) {
    cropPopup.coordsSave = $('<input />');
    cropPopup.coordsSave.attr({
      'type':'hidden',
      'id':'cropCoords',
      'name':'cropCoords'
    });
    cropPopup.popup.append(cropPopup.coordsSave);
  }
  */
  cropPopup.open(initCrop);

  function initCrop() {
    var data;
    cropPopup.cropper = $.Jcrop(cropPopup.imgHolder, {
      bgColor: 'black',
      bgOpacity: .4,
      aspectRatio: settings.aspectRatio,
      setSelect: settings.setSelect,
      minSize: settings.minSize,
      onSelect: saveCoords
    });
    function saveCoords(c) {
      data = 'x1=' + c.x + '&x2=' + c.x2 + '&y1=' + c.y + '&y2=' + c.y2 + '&w=' + c.w + '&h=' + c.h;
      //console.log(data);
      cropPopup.coordsSave.val(data);
    }
  }
}

