/**
 * JQUERY Initializer
 */
jQuery(function($)
{
	
window.JModal = function(elm, options)
{
	JModal.instances.push(this);
	
	// TODO - 1) move these into options, 2) Add event listeners
	options = $.extend(
	{
		opacity: 0.8,
		hookCount: 0,
		title: '',
		fixed: true,
		closeable: true,
		closeText: 'close',
		x: null,
		y: null,
		hideHandler: function(modal) {},
		showHandler: function(modal) {},
		hideMove: false
	}, options);
  
  this._opacity = (typeof(options.opacity) === 'number')? options.opacity : 0.8;
  this._hookCount = (typeof(options.hookCount) === 'number')? options.hookCount : 0;
  this._titleHTML = (typeof(options.title) === 'string')? options.title : '';
  this._isFixedPos = (typeof(options.fixed) === 'boolean')? options.fixed : true;
  this._isModal = (typeof(options.modal) === 'boolean')? options.modal : true;
  this._closeButton = (typeof(options.closeable) === 'boolean')? options.closeable : true;
  this._closeButtonText = (typeof(options.closeText) === 'string')? options.closeText : 'close';
  this._overrideX = (typeof(options.x) === 'number')? options.x : null;
  this._overrideY = (typeof(options.y) === 'number')? options.y : null;
  this._hideHandler = options.hideHandler;
  this._showHandler = options.showHandler;
  this._hideMove = options.hideMove;
  this._hidden = false;
  
  this._initialized = false;
  
  var ie6 = ($.browser.msie && jQuery.browser.version.charAt(0) === '6');
  
  var scope = this;
  var elms = { cover:null, content:elm, wrapper:elm };
  
  var win = $(window);
  var createCover = function()
  {
	if (!scope._isModal) { return; }
    
	elms.cover = $('#jmodal-cover');
	if (elms.cover.length === 1) { return; }
	
	// Set up the cover
    var coverHTML = ['<div id="jmodal-cover" style="display:none;position:'];
    coverHTML[coverHTML.length] = (!ie6)? 'fixed;' : 'absolute;';
    if ($.browser.msie)
    {
      coverHTML[coverHTML.length] = 'zoom:1;';
    }
    coverHTML[coverHTML.length] = 'top:0;left:0;z-index:9999;width:100%;height:100%;overflow:hidden;background-color:#000;"></div>';
    $(coverHTML.join('')).appendTo(document.body);

    elms.cover = $('#jmodal-cover');
    elms.cover.css('opacity', scope._opacity);
    elms.cover.bgiframe();
  }
  var position = function(viewportWidth, viewportHeight)
  {
	if (scope._hidden) { return; }
    var y = (typeof(scope._overrideY) === 'number')? scope._overrideY : Math.round((viewportHeight - elms.wrapper.outerHeight()) / 2);
    var x = (typeof(scope._overrideX) === 'number')? scope._overrideX : Math.round((viewportWidth - elms.wrapper.outerWidth()) / 2);
    if (ie6 && scope._isFixedPos)
    {
      y += win.scrollTop();
      x += win.scrollLeft();
    }
    elms.wrapper.css({ top: y+'px', left: x+'px' });
  };
  var resizeCover = function(viewportWidth, viewportHeight)
  {
    if (scope._hidden || !ie6 || !scope._isModal) { return; }
    var doc = $(document.body);
    var width = doc.outerWidth();
    var height = doc.outerHeight();
    elms.cover.css({ width:width+'px', height:height+'px' });
  };
  var handleResize = function()
  {
	if (scope._hidden) { return; }
    var viewportWidth = win.width();
    var viewportHeight = win.height();
    resizeWrapper();
    position(viewportWidth, viewportHeight);
    resizeCover(viewportWidth, viewportHeight);
  };
  var handleScroll = function()
  {
    if (scope._hidden || !ie6 || !scope._isFixedPos) { return; }
    var viewportWidth = win.width();
    var viewportHeight = win.height();
    position(viewportWidth, viewportHeight);
  };
  var resizeWrapper = function()
  {
    if (!ie6) { return; }
    elms.wrapper.css({ width:elms.content.outerWidth()+'px' });
  };
  var init = function()
  {
    createCover();
    
    // Wrap the element
    var style = 'display:none;float:none;top:0;left:0;z-index:10000;width:auto;height:auto;overflow:visible;position:';
    var styleInner = 'position:relative;display:block;width:auto;height:auto;overflow:visible;';
    if (!ie6 && scope._isFixedPos)
    {
      style += 'fixed;'
    }
    else
    {
      style += 'absolute;';
    }
    if ($.browser.msie)
    {
      style += 'zoom:1;';
      styleInner += 'zoom:1;';
    }
    
	elms.content.addClass('jmodal-content');
    elms.content.wrap('<div class="jmodal" style="' + style + '"><div class="jmodal-inner" style="' + styleInner + '"></div></div>');
    elms.content.css('display', 'block');
	
    var innerWrapper = elms.content.parent();
    elms.wrapper = innerWrapper.parent();
    if (!scope._isModal)
    {
      elms.wrapper.bgiframe();
    }
	
	// Add the title
	if (scope._titleHTML)
    {
      innerWrapper.prepend(scope._titleHTML);
    }
	
	// Add the close button
    if (scope._closeButton)
    {
      innerWrapper.append('<a href="#" class="jmodal-close" title="close"><span>' + scope._closeButtonText + '</span></a>');
      $('a.jmodal-close', elms.wrapper).click(function(evt) { evt.preventDefault(); scope.hide(); });
    }
    if (scope._hookCount > 0)
    {
      var hookHTML = [];
      for (var idx = 1; idx <= scope._hookCount; idx++)
      {
        hookHTML[hookHTML.length] = '<span class="hk' + idx + '"></span>';
      }
      innerWrapper.append(hookHTML.join(''));
    }

	elms.wrapper.appendTo(document.body);

    resizeWrapper();
    
    var viewportWidth = win.width();
    var viewportHeight = win.height();
    position(viewportWidth, viewportHeight);
    resizeCover(viewportWidth, viewportHeight);
    
    win.resize(handleResize);
    win.scroll(handleScroll);
  };
  
  
  /**
   * PUBLIC METHODS
   */
  this.getContentElm = function()
  {
    return elms.content;
  };
  this.show = function(options)
  {
	this._hidden = false;
	if (options)
	{
    	if (typeof(options.x) === 'number' || options.x === null) { this._overrideX = options.x; }
	    if (typeof(options.y) === 'number' || options.y === null) { this._overrideY = options.y; }
	    if (typeof(options.isFixedPos) === 'boolean') { this._isFixedPos = options.isFixedPos; }
	    if (typeof(options.isModal) === 'boolean') { this._isModal = options.isModal; }
    }
    if (this._isModal)
    {
      elms.cover.css('opacity', scope._opacity);
      elms.cover.show();
    }
    elms.wrapper.show();
    if (!this._initialized)
    {
      this._initialized = true;
      handleResize();
    }
    else
    {
      var viewportWidth = win.width();
      var viewportHeight = win.height();
      position(viewportWidth, viewportHeight);
    }
    this._showHandler(this);
  };
  
  this.hide = function()
  {
    if (this._isModal)
    {
      elms.cover.animate({ opacity:0 }, 200, 'linear', function(evt){ elms.cover.hide(); });
    }
    if (!this._hideMove)
    {
	elms.wrapper.hide();
    }
    else
    {
	elms.wrapper.css({ left:'-10000px', top:'-10000px' });
    }
    this._hidden = true;
    this._hideHandler(this);
  };
  init();
	
	return this;
};

JModal.instances = [];
JModal.get = function(elm)
{
  var modal = null;
  var domElm = elm.get(0);
  for (var idx = 0, len = JModal.instances.length; idx < len; idx++)
  {
    if (JModal.instances[idx].getContentElm().get(0) == domElm)
    {
      modal = JModal.instances[idx];
      break;
    }
  }
  return modal;
};

});