/*
 * DFLoading - (for jQuery)
 * Version: 1.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 params={
 *	  lightsCount:15,
 *	  highLightsCount:5,
 *	  timeout:100,
 *	  showCallback:function(){$(document).trigger($.dfPageShadow.events.show);},
 *	  hideCallback:function(){$(document).trigger($.dfPageShadow.events.hide);}
 * };
 * $(document).dfPageShadow();
 * $(document).dfLoading(params);
 * $(document).trigger($.dfLoading.events.show);
 * $(window).load(function(){$(document).trigger($.dfLoading.events.hide);});
 *
 * $(document).trigger($.dfLoading.events.show,[{className:'dfldng2',showCallback:null,hideCallback:null}]);
 *
*/

;(function($) {

  $.dfLoading = function(settings, params) {
    $.dfLoading.init(settings);
    $.dfLoading.elems.main.trigger($.dfLoading.events.show,[params]);
  };

  $.extend(true, $.dfLoading, $.dfLib);

  var _this = $.dfLoading;
  $.extend(true, _this, {
    development: {
	  name:		'DFLoading',
	  version:	'1.1',
	  year:		'2010'
    },
    settings:{
      title:'Loading...',
      lightsCount:9,
      highLightsCount:3,
      className:'dfldng',
      id:'dfldng'+Math.round(Math.random()*100000),
      subId:{
      		titleBlock:		'tb',
      		lightsBlock:	'lb',
      		light:			'l',
      		left:			'left',
      		right:			'right',
      		highLight:		'hl'
      },
      timeout:100,
      animation:{
    				top:0,
    				left:0,
    				type:'fade',  //  fade/slide/show
	    			speed:'fast'
      },
      currLight:0
    },

    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()
    {
      var _s = _this.settings;
      _this.hideAnimation(_this.elems.main, _s.animation);
      clearInterval(_s.intervalId);
      if(typeof _s.hideCallback == 'function')
      {
        _s.hideCallback();
      }
    },

    show: function(params)
    {
      params = params || {};

      _this.settings = $.extend(true, {}, _this.cache, params);
      var _e = _this.elems;
      var _cn = _this.className;
      var _s = _this.settings;
      _e.titleBlock.html(_s.title);
      var _tr = _e.lightsBlock.find('tr:first');
      _tr.empty();
      for(i=0;i<_this.settings.lightsCount;i++)
      {
          _tr.append('<td><div /></td>').find('div:last').addClass(_cn.light);
          if(i==0)
          {
          	_tr.find('div:last').addClass(_cn.left);
          }
          if(i==(_this.settings.lightsCount-1))
          {
          	_tr.find('div:last').addClass(_cn.right);
          }
      }
      _s.intervalId = window.setInterval(animate,_s.timeout);
      _e.main.css({      	position:'fixed',
      	zIndex:_s.animation.zIndex
      }).removeClass().addClass(_s.className);
      var ScrollTop = 0;
	  if($.browser.msie)
	  {
	    _e.main.css({position:'absolute'});
	    ScrollTop = _this.scrollTop();
	  }
	  _e.main.css({
	  		top:_s.animation.top+ScrollTop,
      		left:_s.animation.left
	  });


      _this.showAnimation(_e.main, _s.animation);
      if(typeof _s.showCallback == 'function')
      {
        _s.showCallback();
      }
    },

    build: function()
    {
      var _id = _this.id;
      var _cn = _this.className;
      if(!$("#"+_id.main).length)
      {
        $("body").prepend('<div style="display:none;" />').children('div:first').attr('id',_id.main);

        var _e = {        	main:$("#"+_id.main)
        };
        _e.main.append('<div /><div />').children('div:first').attr('id',_id.titleBlock).addClass(_cn.titleBlock).next('div').attr('id',_id.lightsBlock).addClass(_cn.lightsBlock);
        _e.titleBlock = $('#'+_id.titleBlock);
        _e.lightsBlock = $('#'+_id.lightsBlock);
        _e.lightsBlock.html('<table />').children('table').html('<tr />');
        $.extend(_this,{
      	  elems:_e
        });
      }
    },

    init: function(settings)
    {
      settings = settings || {};

      if(_this.cache)
      {
      	_this.settings = _this.cache;
      }
      else
      {
      	_this.settings = $.extend(true, _this.settings, settings);
      	_this.cache = _this.settings;
      }
      if (_this.inited) return true
      else _this.inited = true

      var _s = _this.settings;
      var _id = {      	main:_s.id      };
      var _cn = {
      	main:_s.className
      };
      for(i in _s.subId)
      {        _id[i] = _s.id+_s.subId[i];
        _cn[i] = _s.subId[i];
      }

      $.extend(_this, {id:_id,className:_cn});

      _this.build();
      _this.setEvents();
    }
  });
  $.fn.dfLoading = function(settings)
  {
    settings = settings || {};
    $.dfLoading.init(settings);
    this.bind($.dfLoading.events.hide, function(event){
    	        $.dfLoading.elems.main.trigger($.dfLoading.events.hide);
    });

    return this.bind($.dfLoading.events.show, function(event,params){
    	        $.dfLoading.elems.main.trigger($.dfLoading.events.show,[params]);
    });
  };

  function animate()
  {    var _cn = _this.className;
    var _s = _this.settings;
    var _lights = _this.elems.lightsBlock.find('div');

    var lights = new Array();
    var highLightsClasses = '';
    _s.currLight = setPosition(_s.currLight);
    for(i=0;i<_s.highLightsCount;i++)
    {
      pos = _s.currLight - i;
      className = _cn.highLight+(i+1);
      lights[setPosition(pos)] = className;
      highLightsClasses += (' '+className);
    }
    _lights.removeClass(highLightsClasses.substr(1));
    for(i in lights)
    {
      _lights.eq(i).addClass(lights[i]);
    }
    _s.currLight = setPosition(_s.currLight+1);
  };

  function setPosition(pos)
  {    var _s = _this.settings;
    while(pos < 0)
    {
      pos += _s.lightsCount;
    }
    while(pos >= _s.lightsCount)
    {
      pos -= _s.lightsCount;
    }
    return pos;
  };

})(jQuery);
