/* SWAP OBJECTS */
// $Id: jquery_swapdepths.src.js,v 1.0 2008/06/14 18:29:32 skilip Exp $
jQuery.fn.swapDepths = function(options) {
  var target_obj            = $(this);
  var options               = (options) || {};
  options.skip_exclusions   = (options.skip_exclusions !== 'undefined') ? options.skip_exclusions : true;
  options.reinit            = (options.reinit) || false;
  options.selectors         = (options.selectors) || ['div'];
  
  if(!window.depthsmanager) window.depthsmanager = {
    highest               : {zindex:0},
    next_highest          : {zindex:0},
    exclusions            : [],
    
    addExclusions : function(ids) {
      if(typeof(ids) == 'string') ids = [ids];
      $.each(ids, function(k, id) {
        if($.inArray(id, window.depthsmanager.exclusions) == -1) window.depthsmanager.exclusions.push(id);
      });
    }
  };
  var ref                   = window.depthsmanager;
      
  /**
   * 
   */
  ref.getTwoHighestElements = function() {
    var z, elem;
    
    $('body').find(options.selectors.join(', ')).each(function() {
      elem = $(this);
      z = elem.css('z-index');
      if(z !== 'auto' && z !== undefined && z !== '0') {
        if(!options.skip_exclusions || (options.skip_exclusions && $.inArray(elem.attr('id'), ref.exclusions) == -1)) {
          ref.next_highest = (ref.highest) ? {element:ref.highest.element, zindex:ref.highest.zindex} : {element:elem, zindex:z};
          if(parseInt(z) > ref.highest.zindex) {
            ref.highest = {element:elem, zindex:z};
          };
        };
      };
    });
    if(ref.next_highest.zindex == ref.highest.zindex) ref.next_highest.zindex--;
    // There's no highest element. This means the highest is as high as the second highest. 
    if(!ref.highest.element) ref.highest = ref.next_highest;
  };
  
  if(options.skip_exclusions && $.inArray(target_obj.attr('id'), ref.exclusions) > -1) return false;
  
  // If none highest exists or if reinit is set to true, try to find the highest two elements
  if(!ref.next_highest.element || options.reinit) ref.getTwoHighestElements();
  if(ref.next_highest.element) {
    ref.highest.element.css('z-index', ref.next_highest.zindex);
    target_obj.css('z-index', ref.highest.zindex);
    ref.highest = {element:target_obj, zindex:ref.highest.zindex};
    ref.next_highest = {element:ref.highest.element, zindex:ref.next_highest.zindex};
  } else {
    $('body').css('z-index', 1);
    target_obj.css('z-index', 2);
    ref.highest = {element:target_obj, zindex:2};
    ref.next_highest = {element:$('body'), zindex:1};
  };
  
  return target_obj;
};

$(function() {
  $('body').swapDepths();
});
