/*
 * DFPageShadow - (for jQuery)
 * Version: 1.4.1 + (13/10/2010)
 * @requires jQuery v1.4 + , DFLib v1.3 +
 *
 *
 * Licensed under the MIT License: http://en.wikipedia.org/wiki/MIT_License
 *
 * Copyright (c) 2010 Dmytro Feshchenko www.df-studio.net
 *
 *
 * Usage:
 *
 * var animation = {
 *	 speed:200,
 *	 type:'fade'
 * };
 * $(document).ready(function(){
 *   $(document).dfPageShadow(animation);
 * });
 *
 * // to hide DFPageShadow
 * $(document).trigger($.dfPageShadow.events.hide);
 *
 * // to show DFPageShadow with default settings
 * $(document).trigger($.dfPageShadow.events.show);
 *
 *
 * // to show DFPageShadow with CSS class
 * $(document).trigger($.dfPageShadow.events.show,[{className:'myclass'}]);
 *
 *
 * // to show DFPageShadow with other settings
 * $(document).trigger($.dfPageShadow.events.show,[{style:{background:'#FF0000',opacity:'0.5'},animation:{type:'show',speed:'500'}}]);
 *
*/

;(function($) {

  $.dfPageShadow = function(settings, params) {
    $.dfPageShadow.init(settings);
    $.dfPageShadow.elems.main.trigger($.dfPageShadow.events.show,[params]);
  };

  $.extend(true, $.dfPageShadow, $.dfLib);
  var _this = $.dfPageShadow;

  $.extend(true, _this, {
    development: {
	  name:		'DFPageShadow',
	  version:	'1.4',
	  year:		'2010'
    },
    settings:{
      style:{
	  	  background:'#000000',
	  	  opacity:'0.2'
      },
      className:'',
      animation:{
    				type:'fade',  //  fade/slide/show
	    			speed:'fast'
      },
      id:'dfpsh'+Math.round(Math.random()*100000)
    },

    setEvents:function()
    {
      var events = ['show','hide'];

      var _name = _this.development.name;
      var eventsObj = {};
      for(i in events)
      {
        eventsObj[events[i]] = events[i]+'.'+_name;
      }
      $.extend(_this, {events:eventsObj});

      var _event = _this.events;
      var _e = _this.elems;

      $(_e.main).bind(_event.show, function(event,params) {      	event.stopPropagation();
     	params = params || {};
     	_this.show(params);
  	  });
      $(_e.main).bind(_event.hide, function(event) {      	event.stopPropagation();
   	    _this.hide();
  	  });
    },

    hide: function()
    {
  	  _this.showPageScrolls();
  	  _this.hideAnimation(_this.elems.main, _this.settings.animation);
    },

    show: function(params)
	{

   	  params = params || {};
   	  var _s = _this.settings;
   	  var _e = _this.elems;
      _s = $.extend(true, {}, _this.cache, params);
      _this.removePageScrolls();
      if(_s.className)
      {
        _e.main.removeClass().attr('style',{}).addClass(_s.className);
        var opacity = _e.main.css('opacity');
        _e.main.css({
  			filter:'alpha(opacity='+opacity*100+')',
  			MozOpacity:opacity,
  			KhtmlOpacity:opacity
  		});
      }
      else
      {
        _e.main.css({
  			background:_s.style.background,
  			filter:'alpha(opacity='+_s.style.opacity*100+')',
  			MozOpacity:_s.style.opacity,
  			KhtmlOpacity:_s.style.opacity,
		  	opacity:_s.style.opacity
  		});
  	  }
  	  _e.main.css({
  			position:'fixed',
  			display:'none',
  			zIndex:_s.animation.zIndex,
  			height:$.dfLib.clientHeight(),
  			width:$.dfLib.clientWidth()
  	  });
  	  var ScrollTop = 0;
	  if($.browser.msie)
	  {
	    _e.main.css({position:'absolute'});
	    ScrollTop = _this.scrollTop();
	  }
	  _e.main.css({
	  		top:ScrollTop,
	  		left:0
	  });
	  _this.showAnimation(_e.main, _s.animation);
	},

    build: function()
    {      var _id = _this.settings.id;
      if(!$("#"+_id).length)
      {
        $("body").prepend('<div style="display:none;" />').children('div:first').attr('id',_id);
      }

      $.extend(_this,{elems:{main:$('#'+_id)}});
    },

    reset: function()
    {
      _this.settings = _this.cache;
    },

    init: function(settings)
    {
      settings = settings || {};
      if(_this.cache)
      {
      	_this.reset();
      }
      else
      {
      	_this.settings = $.extend(true, _this.settings, settings);
      	_this.cache = _this.settings;
      }

      if (_this.inited) return true
      else _this.inited = true

      _this.build();
      _this.setEvents();
    }
  });

  $.fn.dfPageShadow = function(settings)
  {
    settings = settings || {};
    $.dfPageShadow.init(settings);

    this.bind($.dfPageShadow.events.hide, function(event){
    	        $.dfPageShadow.elems.main.trigger($.dfPageShadow.events.hide);
    });

    return this.bind($.dfPageShadow.events.show, function(event,params){
    	        $.dfPageShadow.elems.main.trigger($.dfPageShadow.events.show,[params]);
    });
  };

})(jQuery);
