/*!
* jQuery UI 1.8.2
*
* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT (MIT-LICENSE.txt)
* and GPL (GPL-LICENSE.txt) licenses.
*
* http://docs.jquery.com/UI
*/

(function($) {
  
  // prevent duplicate loading
  // this is only a problem because we proxy existing functions
  // and we don't want to double proxy them
  $.ui = $.ui || {};
  if ($.ui.version) {
    return;
  }
  
  //Helper functions and ui object
  $.extend($.ui, {
    version: "1.8.2",
           
           // $.ui.plugin is deprecated.  Use the proxy pattern instead.
           plugin: {
             add: function(module, option, set) {
               var proto = $.ui[module].prototype;
               for(var i in set) {
                 proto.plugins[i] = proto.plugins[i] || [];
                 proto.plugins[i].push([option, set[i]]);
               }
             },
           call: function(instance, name, args) {
             var set = instance.plugins[name];
             if(!set || !instance.element[0].parentNode) { return; }
             
             for (var i = 0; i < set.length; i++) {
               if (instance.options[set[i][0]]) {
                 set[i][1].apply(instance.element, args);
               }
             }
           }
           },
           
           contains: function(a, b) {
             return document.compareDocumentPosition
             ? a.compareDocumentPosition(b) & 16
             : a !== b && a.contains(b);
           },
           
           hasScroll: function(el, a) {
             
             //If overflow is hidden, the element might have extra content, but the user wants to hide it
             if ($(el).css('overflow') == 'hidden') { return false; }
             
             var scroll = (a && a == 'left') ? 'scrollLeft' : 'scrollTop',
                           has = false;
                           
                           if (el[scroll] > 0) { return true; }
                           
                           // TODO: determine which cases actually cause this to happen
                           // if the element doesn't have the scroll set, see if it's possible to
                           // set the scroll
                           el[scroll] = 1;
                           has = (el[scroll] > 0);
                           el[scroll] = 0;
                           return has;
           },
                           
                           isOverAxis: function(x, reference, size) {
                             //Determines when x coordinate is over "b" element axis
                             return (x > reference) && (x < (reference + size));
                           },
                           
                           isOver: function(y, x, top, left, height, width) {
                             //Determines when x, y coordinates is over "b" element
                             return $.ui.isOverAxis(y, top, height) && $.ui.isOverAxis(x, left, width);
                           },
                           
                           keyCode: {
                             ALT: 18,
                           BACKSPACE: 8,
                           CAPS_LOCK: 20,
                           COMMA: 188,
                           COMMAND: 91,
                           COMMAND_LEFT: 91, // COMMAND
                           COMMAND_RIGHT: 93,
                           CONTROL: 17,
                           DELETE: 46,
                           DOWN: 40,
                           END: 35,
                           ENTER: 13,
                           ESCAPE: 27,
                           HOME: 36,
                           INSERT: 45,
                           LEFT: 37,
                           MENU: 93, // COMMAND_RIGHT
                           NUMPAD_ADD: 107,
                           NUMPAD_DECIMAL: 110,
                           NUMPAD_DIVIDE: 111,
                           NUMPAD_ENTER: 108,
                           NUMPAD_MULTIPLY: 106,
                           NUMPAD_SUBTRACT: 109,
                           PAGE_DOWN: 34,
                           PAGE_UP: 33,
                           PERIOD: 190,
                           RIGHT: 39,
                           SHIFT: 16,
                           SPACE: 32,
                           TAB: 9,
                           UP: 38,
                           WINDOWS: 91 // COMMAND
                           }
  });
  
  //jQuery plugins
  $.fn.extend({
    _focus: $.fn.focus,
              focus: function(delay, fn) {
                return typeof delay === 'number'
                ? this.each(function() {
                  var elem = this;
                  setTimeout(function() {
                    $(elem).focus();
                    (fn && fn.call(elem));
                  }, delay);
                })
                : this._focus.apply(this, arguments);
              },
              
              enableSelection: function() {
                return this
                .attr('unselectable', 'off')
                .css('MozUserSelect', '');
              },
 
 disableSelection: function() {
   return this
   .attr('unselectable', 'on')
   .css('MozUserSelect', 'none');
 },
        
        scrollParent: function() {
          var scrollParent;
          if(($.browser.msie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) {
            scrollParent = this.parents().filter(function() {
              return (/(relative|absolute|fixed)/).test($.curCSS(this,'position',1)) && (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
            }).eq(0);
          } else {
            scrollParent = this.parents().filter(function() {
              return (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
            }).eq(0);
          }
          
          return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent;
        },
        
        zIndex: function(zIndex) {
          if (zIndex !== undefined) {
            return this.css('zIndex', zIndex);
          }
          
          if (this.length) {
            var elem = $(this[0]), position, value;
            while (elem.length && elem[0] !== document) {
              // Ignore z-index if position is set to a value where z-index is ignored by the browser
              // This makes behavior of this function consistent across browsers
              // WebKit always returns auto if the element is positioned
              position = elem.css('position');
              if (position == 'absolute' || position == 'relative' || position == 'fixed')
              {
                // IE returns 0 when zIndex is not specified
                // other browsers return a string
                // we ignore the case of nested elements with an explicit value of 0
                // <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
                value = parseInt(elem.css('zIndex'));
                if (!isNaN(value) && value != 0) {
                  return value;
                }
              }
              elem = elem.parent();
            }
          }
          
          return 0;
        }
  });
  
  
  //Additional selectors
  $.extend($.expr[':'], {
    data: function(elem, i, match) {
      return !!$.data(elem, match[3]);
    },
           
           focusable: function(element) {
             var nodeName = element.nodeName.toLowerCase(),
           tabIndex = $.attr(element, 'tabindex');
           return (/input|select|textarea|button|object/.test(nodeName)
           ? !element.disabled
           : 'a' == nodeName || 'area' == nodeName
           ? element.href || !isNaN(tabIndex)
           : !isNaN(tabIndex))
           // the element and all of its ancestors must be visible
           // the browser may report that the area is hidden
           && !$(element)['area' == nodeName ? 'parents' : 'closest'](':hidden').length;
           },
           
           tabbable: function(element) {
             var tabIndex = $.attr(element, 'tabindex');
             return (isNaN(tabIndex) || tabIndex >= 0) && $(element).is(':focusable');
           }
  });
  
})(jQuery);
/*!
* jQuery UI Widget 1.8.2
*
* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT (MIT-LICENSE.txt)
* and GPL (GPL-LICENSE.txt) licenses.
*
* http://docs.jquery.com/UI/Widget
*/
(function( $ ) {
  
  var _remove = $.fn.remove;
  
  $.fn.remove = function( selector, keepData ) {
    return this.each(function() {
      if ( !keepData ) {
        if ( !selector || $.filter( selector, [ this ] ).length ) {
          $( "*", this ).add( this ).each(function() {
            $( this ).triggerHandler( "remove" );
          });
        }
      }
      return _remove.call( $(this), selector, keepData );
    });
  };
  
  $.widget = function( name, base, prototype ) {
    var namespace = name.split( "." )[ 0 ],
    fullName;
    name = name.split( "." )[ 1 ];
    fullName = namespace + "-" + name;
    
    if ( !prototype ) {
      prototype = base;
      base = $.Widget;
    }
    
    // create selector for plugin
    $.expr[ ":" ][ fullName ] = function( elem ) {
      return !!$.data( elem, name );
    };
    
    $[ namespace ] = $[ namespace ] || {};
    $[ namespace ][ name ] = function( options, element ) {
      // allow instantiation without initializing for simple inheritance
      if ( arguments.length ) {
        this._createWidget( options, element );
      }
    };
    
    var basePrototype = new base();
    // we need to make the options hash a property directly on the new instance
    // otherwise we'll modify the options hash on the prototype that we're
    // inheriting from
    //  $.each( basePrototype, function( key, val ) {
      //    if ( $.isPlainObject(val) ) {
        //      basePrototype[ key ] = $.extend( {}, val );
        //    }
        //  });
        basePrototype.options = $.extend( {}, basePrototype.options );
        $[ namespace ][ name ].prototype = $.extend( true, basePrototype, {
          namespace: namespace,
                                                     widgetName: name,
                                                     widgetEventPrefix: $[ namespace ][ name ].prototype.widgetEventPrefix || name,
                                                     widgetBaseClass: fullName
        }, prototype );
        
        $.widget.bridge( name, $[ namespace ][ name ] );
  };
  
  $.widget.bridge = function( name, object ) {
    $.fn[ name ] = function( options ) {
      var isMethodCall = typeof options === "string",
      args = Array.prototype.slice.call( arguments, 1 ),
      returnValue = this;
      
      // allow multiple hashes to be passed on init
      options = !isMethodCall && args.length ?
      $.extend.apply( null, [ true, options ].concat(args) ) :
      options;
      
      // prevent calls to internal methods
      if ( isMethodCall && options.substring( 0, 1 ) === "_" ) {
        return returnValue;
      }
      
      if ( isMethodCall ) {
        this.each(function() {
          var instance = $.data( this, name ),
                  methodValue = instance && $.isFunction( instance[options] ) ?
                  instance[ options ].apply( instance, args ) :
                  instance;
                  if ( methodValue !== instance && methodValue !== undefined ) {
                    returnValue = methodValue;
                    return false;
                  }
        });
      } else {
        this.each(function() {
          var instance = $.data( this, name );
          if ( instance ) {
            if ( options ) {
              instance.option( options );
            }
            instance._init();
          } else {
            $.data( this, name, new object( options, this ) );
          }
        });
      }
      
      return returnValue;
    };
  };
  
  $.Widget = function( options, element ) {
    // allow instantiation without initializing for simple inheritance
    if ( arguments.length ) {
      this._createWidget( options, element );
    }
  };
  
  $.Widget.prototype = {
    widgetName: "widget",
    widgetEventPrefix: "",
    options: {
      disabled: false
    },
    _createWidget: function( options, element ) {
      // $.widget.bridge stores the plugin instance, but we do it anyway
      // so that it's stored even before the _create function runs
      this.element = $( element ).data( this.widgetName, this );
      this.options = $.extend( true, {},
                               this.options,
                               $.metadata && $.metadata.get( element )[ this.widgetName ],
                               options );
                               
                               var self = this;
                               this.element.bind( "remove." + this.widgetName, function() {
                                 self.destroy();
                               });
                               
                               this._create();
                               this._init();
    },
    _create: function() {},
    _init: function() {},
    
    destroy: function() {
      this.element
      .unbind( "." + this.widgetName )
      .removeData( this.widgetName );
      this.widget()
      .unbind( "." + this.widgetName )
      .removeAttr( "aria-disabled" )
      .removeClass(
      this.widgetBaseClass + "-disabled " +
      "ui-state-disabled" );
    },
                   
                   widget: function() {
                     return this.element;
                   },
                   
                   option: function( key, value ) {
                     var options = key,
                   self = this;
                   
                   if ( arguments.length === 0 ) {
                     // don't return a reference to the internal hash
                     return $.extend( {}, self.options );
                   }
                   
                   if  (typeof key === "string" ) {
                     if ( value === undefined ) {
                       return this.options[ key ];
                     }
                     options = {};
                     options[ key ] = value;
                   }
                   
                   $.each( options, function( key, value ) {
                     self._setOption( key, value );
                   });
                   
                   return self;
                   },
                   _setOption: function( key, value ) {
                     this.options[ key ] = value;
                     
                     if ( key === "disabled" ) {
        this.widget()
        [ value ? "addClass" : "removeClass"](
        this.widgetBaseClass + "-disabled" + " " +
        "ui-state-disabled" )
        .attr( "aria-disabled", value );
      }
      
      return this;
                   },
                                              
                                              enable: function() {
                                                return this._setOption( "disabled", false );
                                              },
                                              disable: function() {
                                                return this._setOption( "disabled", true );
                                              },
                                              
                                              _trigger: function( type, event, data ) {
                                                var callback = this.options[ type ];
                                                
                                                event = $.Event( event );
                                                event.type = ( type === this.widgetEventPrefix ?
                                                type :
                                                this.widgetEventPrefix + type ).toLowerCase();
                                                data = data || {};
                                                
                                                // copy original event properties over to the new event
                                                // this would happen if we could call $.event.fix instead of $.Event
                                                // but we don't have a way to force an event to be fixed multiple times
                                                if ( event.originalEvent ) {
                                                  for ( var i = $.event.props.length, prop; i; ) {
                                                    prop = $.event.props[ --i ];
                                                    event[ prop ] = event.originalEvent[ prop ];
                                                  }
                                                }
                                                
                                                this.element.trigger( event, data );
                                                
                                                return !( $.isFunction(callback) &&
                                                callback.call( this.element[0], event, data ) === false ||
                                                event.isDefaultPrevented() );
                                              }
  };
  
})( jQuery );
/*!
* jQuery UI Mouse 1.8.2
*
* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT (MIT-LICENSE.txt)
* and GPL (GPL-LICENSE.txt) licenses.
*
* http://docs.jquery.com/UI/Mouse
*
* Depends:
*  jquery.ui.widget.js
*/
(function($) {
  
  $.widget("ui.mouse", {
    options: {
      cancel: ':input,option',
 distance: 1,
 delay: 0
    },
 _mouseInit: function() {
   var self = this;
   
   this.element
   .bind('mousedown.'+this.widgetName, function(event) {
     return self._mouseDown(event);
   })
   .bind('click.'+this.widgetName, function(event) {
     if(self._preventClickEvent) {
       self._preventClickEvent = false;
       event.stopImmediatePropagation();
       return false;
     }
   });
   
   this.started = false;
 },
 
 // TODO: make sure destroying one instance of mouse doesn't mess with
 // other instances of mouse
 _mouseDestroy: function() {
   this.element.unbind('.'+this.widgetName);
 },
 
 _mouseDown: function(event) {
   // don't let more than one widget handle mouseStart
   // TODO: figure out why we have to use originalEvent
   event.originalEvent = event.originalEvent || {};
   if (event.originalEvent.mouseHandled) { return; }
   
   // we may have missed mouseup (out of window)
   (this._mouseStarted && this._mouseUp(event));
   
   this._mouseDownEvent = event;
   
   var self = this,
 btnIsLeft = (event.which == 1),
 elIsCancel = (typeof this.options.cancel == "string" ? $(event.target).parents().add(event.target).filter(this.options.cancel).length : false);
 if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
   return true;
 }
 
 this.mouseDelayMet = !this.options.delay;
 if (!this.mouseDelayMet) {
   this._mouseDelayTimer = setTimeout(function() {
     self.mouseDelayMet = true;
   }, this.options.delay);
 }
 
 if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
   this._mouseStarted = (this._mouseStart(event) !== false);
   if (!this._mouseStarted) {
     event.preventDefault();
     return true;
   }
 }
 
 // these delegates are required to keep context
 this._mouseMoveDelegate = function(event) {
   return self._mouseMove(event);
 };
 this._mouseUpDelegate = function(event) {
   return self._mouseUp(event);
 };
 $(document)
 .bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
 .bind('mouseup.'+this.widgetName, this._mouseUpDelegate);
 
 // preventDefault() is used to prevent the selection of text here -
 // however, in Safari, this causes select boxes not to be selectable
 // anymore, so this fix is needed
 ($.browser.safari || event.preventDefault());
 
 event.originalEvent.mouseHandled = true;
 return true;
 },
 
 _mouseMove: function(event) {
   // IE mouseup check - mouseup happened when mouse was out of window
   if ($.browser.msie && !event.button) {
     return this._mouseUp(event);
   }
   
   if (this._mouseStarted) {
     this._mouseDrag(event);
     return event.preventDefault();
   }
   
   if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
     this._mouseStarted =
     (this._mouseStart(this._mouseDownEvent, event) !== false);
     (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
   }
   
   return !this._mouseStarted;
 },
 
 _mouseUp: function(event) {
   $(document)
   .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
   .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
   
   if (this._mouseStarted) {
     this._mouseStarted = false;
     this._preventClickEvent = (event.target == this._mouseDownEvent.target);
     this._mouseStop(event);
   }
   
   return false;
 },
 
 _mouseDistanceMet: function(event) {
   return (Math.max(
   Math.abs(this._mouseDownEvent.pageX - event.pageX),
                    Math.abs(this._mouseDownEvent.pageY - event.pageY)
                    ) >= this.options.distance
                    );
 },
 
 _mouseDelayMet: function(event) {
   return this.mouseDelayMet;
 },
 
 // These are placeholder methods, to be overriden by extending plugin
 _mouseStart: function(event) {},
 _mouseDrag: function(event) {},
 _mouseStop: function(event) {},
 _mouseCapture: function(event) { return true; }
  });
  
})(jQuery);
/*
* jQuery UI Draggable 1.8.2
*
* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT (MIT-LICENSE.txt)
* and GPL (GPL-LICENSE.txt) licenses.
*
* http://docs.jquery.com/UI/Draggables
*
* Depends:
*  jquery.ui.core.js
*  jquery.ui.mouse.js
*  jquery.ui.widget.js
*/
(function($) {
  
  $.widget("ui.draggable", $.ui.mouse, {
    widgetEventPrefix: "drag",
 options: {
   addClasses: true,
 appendTo: "parent",
 axis: false,
 connectToSortable: false,
 containment: false,
 cursor: "auto",
 cursorAt: false,
 grid: false,
 handle: false,
 helper: "original",
 iframeFix: false,
 opacity: false,
 refreshPositions: false,
 revert: false,
 revertDuration: 500,
 scope: "default",
 scroll: true,
 scrollSensitivity: 20,
 scrollSpeed: 20,
 snap: false,
 snapMode: "both",
 snapTolerance: 20,
 stack: false,
 zIndex: false
 },
 _create: function() {
   
   if (this.options.helper == 'original' && !(/^(?:r|a|f)/).test(this.element.css("position")))
     this.element[0].style.position = 'relative';
   
   (this.options.addClasses && this.element.addClass("ui-draggable"));
   (this.options.disabled && this.element.addClass("ui-draggable-disabled"));
   
   this._mouseInit();
   
 },
    
    destroy: function() {
      if(!this.element.data('draggable')) return;
      this.element
      .removeData("draggable")
      .unbind(".draggable")
      .removeClass("ui-draggable"
      + " ui-draggable-dragging"
      + " ui-draggable-disabled");
      this._mouseDestroy();
      
      return this;
    },
                   
                   _mouseCapture: function(event) {
                     
                     var o = this.options;
                     
                     // among others, prevent a drag on a resizable-handle
                     if (this.helper || o.disabled || $(event.target).is('.ui-resizable-handle'))
                       return false;
                     
                     //Quit if we're not on a valid handle
                     this.handle = this._getHandle(event);
                     if (!this.handle)
                       return false;
                     
                     return true;
                     
                   },
                   
                   _mouseStart: function(event) {
                     
                     var o = this.options;
                     
                     //Create and append the visible helper
                     this.helper = this._createHelper(event);
                     
                     //Cache the helper size
                     this._cacheHelperProportions();
                     
                     //If ddmanager is used for droppables, set the global draggable
                     if($.ui.ddmanager)
                       $.ui.ddmanager.current = this;
                     
                     /*
                     * - Position generation -
                     * This block generates everything position related - it's the core of draggables.
                     */
                     
                     //Cache the margins of the original element
                     this._cacheMargins();
                     
                     //Store the helper's css position
                     this.cssPosition = this.helper.css("position");
                     this.scrollParent = this.helper.scrollParent();
                     
                     //The element's absolute position on the page minus margins
                     this.offset = this.positionAbs = this.element.offset();
                     this.offset = {
                       top: this.offset.top - this.margins.top,
                   left: this.offset.left - this.margins.left
                     };
                     
                     $.extend(this.offset, {
                       click: { //Where the click happened, relative to the element
                       left: event.pageX - this.offset.left,
                              top: event.pageY - this.offset.top
                     },
                              parent: this._getParentOffset(),
                              relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
                   });
                   
                   //Generate the original position
                   this.originalPosition = this.position = this._generatePosition(event);
                   this.originalPageX = event.pageX;
                   this.originalPageY = event.pageY;
                   
                   //Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
                   (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
                   
                   //Set a containment if given in the options
                   if(o.containment)
                     this._setContainment();
                   
                   //Trigger event + callbacks
                   if(this._trigger("start", event) === false) {
        this._clear();
        return false;
      }
      
      //Recache the helper size
      this._cacheHelperProportions();
      
      //Prepare the droppable offsets
      if ($.ui.ddmanager && !o.dropBehaviour)
        $.ui.ddmanager.prepareOffsets(this, event);
      
      this.helper.addClass("ui-draggable-dragging");
      this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position
      return true;
  },
                                                 
                                                 _mouseDrag: function(event, noPropagation) {
                                                   
                                                   //Compute the helpers position
                                                   this.position = this._generatePosition(event);
                                                   this.positionAbs = this._convertPositionTo("absolute");
                                                   
                                                   //Call plugins and callbacks and use the resulting position if something is returned
                                                   if (!noPropagation) {
                                                     var ui = this._uiHash();
                                                     if(this._trigger('drag', event, ui) === false) {
                                                       this._mouseUp({});
                                                       return false;
                                                     }
                                                     this.position = ui.position;
                                                   }
                                                   
                                                   if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
                                                   if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
                                                   if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
                                                   
                                                   return false;
                                                 },
                                                      
                                                      _mouseStop: function(event) {
                                                        
                                                        //If we are using droppables, inform the manager about the drop
                                                        var dropped = false;
                                                        if ($.ui.ddmanager && !this.options.dropBehaviour)
                                                          dropped = $.ui.ddmanager.drop(this, event);
                                                        
                                                        //if a drop comes from outside (a sortable)
                                                        if(this.dropped) {
                                                          dropped = this.dropped;
                                                          this.dropped = false;
                                                        }
                                                        
                                                        //if the original element is removed, don't bother to continue
                                                        if(!this.element[0] || !this.element[0].parentNode)
                                                          return false;
                                                        
                                                        if((this.options.revert == "invalid" && !dropped) || (this.options.revert == "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {
                                                          var self = this;
                                                          $(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {
                                                            if(self._trigger("stop", event) !== false) {
                                                              self._clear();
                                                            }
                                                          });
                                                        } else {
                                                          if(this._trigger("stop", event) !== false) {
                                                            this._clear();
                                                          }
                                                        }
                                                        
                                                        return false;
                                                      },
                                                      
                                                      cancel: function() {
                                                        
                                                        if(this.helper.is(".ui-draggable-dragging")) {
                                                          this._mouseUp({});
                                                        } else {
                                                          this._clear();
                                                        }
                                                        
                                                        return this;
                                                        
                                                      },
                                                      
                                                      _getHandle: function(event) {
                                                        
                                                        var handle = !this.options.handle || !$(this.options.handle, this.element).length ? true : false;
                                                        $(this.options.handle, this.element)
                                                        .find("*")
                                                        .andSelf()
                                                        .each(function() {
                                                          if(this == event.target) handle = true;
                                                        });
                                                        
                                                        return handle;
                                                        
                                                      },
                                                      
                                                      _createHelper: function(event) {
                                                        
                                                        var o = this.options;
                                                        var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper == 'clone' ? this.element.clone() : this.element);
                                                        
                                                        if(!helper.parents('body').length)
                                                          helper.appendTo((o.appendTo == 'parent' ? this.element[0].parentNode : o.appendTo));
                                                        
                                                        if(helper[0] != this.element[0] && !(/(fixed|absolute)/).test(helper.css("position")))
                                                        helper.css("position", "absolute");
                                                        
                                                        return helper;
                                                        
                                                      },
                                                 
                                                 _adjustOffsetFromHelper: function(obj) {
                                                   if (typeof obj == 'string') {
                                                     obj = obj.split(' ');
                                                   }
                                                   if ($.isArray(obj)) {
                                                     obj = {left: +obj[0], top: +obj[1] || 0};
                                                   }
                                                   if ('left' in obj) {
                                                     this.offset.click.left = obj.left + this.margins.left;
                                                   }
                                                   if ('right' in obj) {
                                                     this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
                                                   }
                                                   if ('top' in obj) {
                                                     this.offset.click.top = obj.top + this.margins.top;
                                                   }
                                                   if ('bottom' in obj) {
                                                     this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
                                                   }
                                                 },
                                                 
                                                 _getParentOffset: function() {
                                                   
                                                   //Get the offsetParent and cache its position
                                                   this.offsetParent = this.helper.offsetParent();
                                                   var po = this.offsetParent.offset();
                                                   
                                                   // This is a special case where we need to modify a offset calculated on start, since the following happened:
                                                   // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
                                                   // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
                                                   //    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
                                                   if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) {
                                                     po.left += this.scrollParent.scrollLeft();
                                                     po.top += this.scrollParent.scrollTop();
                                                   }
                                                   
                                                   if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
                                                     || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix
                                                     po = { top: 0, left: 0 };
                                                   
                                                   return {
                                                     top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
       left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
                                                   };
                                                   
                                                 },
 
 _getRelativeOffset: function() {
   
   if(this.cssPosition == "relative") {
     var p = this.element.position();
     return {
       top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
                     left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
     };
   } else {
     return { top: 0, left: 0 };
   }
   
 },
                     
                     _cacheMargins: function() {
                       this.margins = {
                         left: (parseInt(this.element.css("marginLeft"),10) || 0),
      top: (parseInt(this.element.css("marginTop"),10) || 0)
                       };
                     },
      
      _cacheHelperProportions: function() {
        this.helperProportions = {
          width: this.helper.outerWidth(),
      height: this.helper.outerHeight()
        };
      },
      
      _setContainment: function() {
        
        var o = this.options;
        if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
        if(o.containment == 'document' || o.containment == 'window') this.containment = [
          0 - this.offset.relative.left - this.offset.parent.left,
      0 - this.offset.relative.top - this.offset.parent.top,
      $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
      ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
      ];
      
      if(!(/^(document|window|parent)$/).test(o.containment) && o.containment.constructor != Array) {
        var ce = $(o.containment)[0]; if(!ce) return;
        var co = $(o.containment).offset();
        var over = ($(ce).css("overflow") != 'hidden');
        
        this.containment = [
        co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
 co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
                                                                      co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,
                    co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top
                    ];
      } else if(o.containment.constructor == Array) {
        this.containment = o.containment;
      }
      
      },
      
      _convertPositionTo: function(d, pos) {
        
        if(!pos) pos = this.position;
        var mod = d == "absolute" ? 1 : -1;
        var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
        
        return {
          top: (
          pos.top                                 // The absolute mouse position
          + this.offset.relative.top * mod                    // Only for relative positioned nodes: Relative offset from element to offset parent
          + this.offset.parent.top * mod                      // The offsetParent's offset without borders (offset + border)
          - ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
          ),
          left: (
          pos.left                                // The absolute mouse position
          + this.offset.relative.left * mod                   // Only for relative positioned nodes: Relative offset from element to offset parent
          + this.offset.parent.left * mod                     // The offsetParent's offset without borders (offset + border)
          - ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
          )
        };
        
      },
      
      _generatePosition: function(event) {
        
        var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
        var pageX = event.pageX;
        var pageY = event.pageY;
        
        /*
        * - Position constraining -
        * Constrain the position to a mix of grid, containment.
        */
        
        if(this.originalPosition) { //If we are not dragging yet, we won't check for options
          
          if(this.containment) {
            if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left;
            if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top;
            if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left;
            if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top;
          }
          
          if(o.grid) {
            var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
            pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
            
            var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
            pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
          }
          
      }
      
      return {
        top: (
        pageY                               // The absolute mouse position
        - this.offset.click.top                         // Click offset (relative to the element)
        - this.offset.relative.top                        // Only for relative positioned nodes: Relative offset from element to offset parent
        - this.offset.parent.top                        // The offsetParent's offset without borders (offset + border)
        + ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
        ),
           left: (
           pageX                               // The absolute mouse position
           - this.offset.click.left                        // Click offset (relative to the element)
           - this.offset.relative.left                       // Only for relative positioned nodes: Relative offset from element to offset parent
           - this.offset.parent.left                       // The offsetParent's offset without borders (offset + border)
          + ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
          )
      };
      
},

_clear: function() {
  this.helper.removeClass("ui-draggable-dragging");
  if(this.helper[0] != this.element[0] && !this.cancelHelperRemoval) this.helper.remove();
  //if($.ui.ddmanager) $.ui.ddmanager.current = null;
  this.helper = null;
  this.cancelHelperRemoval = false;
},
                          
                          // From now on bulk stuff - mainly helpers
                          
                          _trigger: function(type, event, ui) {
                            ui = ui || this._uiHash();
                            $.ui.plugin.call(this, type, [event, ui]);
                            if(type == "drag") this.positionAbs = this._convertPositionTo("absolute"); //The absolute position has to be recalculated after plugins
                              return $.Widget.prototype._trigger.call(this, type, event, ui);
                          },
                          
                          plugins: {},
                          
                          _uiHash: function(event) {
                            return {
                              helper: this.helper,
                          position: this.position,
                          originalPosition: this.originalPosition,
                          offset: this.positionAbs
                            };
                          }
                          
                          });
                          
                          $.extend($.ui.draggable, {
                            version: "1.8.2"
                          });
                          
                          $.ui.plugin.add("draggable", "connectToSortable", {
                            start: function(event, ui) {
                              
                              var inst = $(this).data("draggable"), o = inst.options,
                              uiSortable = $.extend({}, ui, { item: inst.element });
                              inst.sortables = [];
                              $(o.connectToSortable).each(function() {
                                var sortable = $.data(this, 'sortable');
                                if (sortable && !sortable.options.disabled) {
                                  inst.sortables.push({
                                    instance: sortable,
                                                      shouldRevert: sortable.options.revert
                                  });
                                  sortable._refreshItems(); //Do a one-time refresh at start to refresh the containerCache
                              sortable._trigger("activate", event, uiSortable);
                                }
                              });
                              
                            },
                            stop: function(event, ui) {
                              
                              //If we are still over the sortable, we fake the stop event of the sortable, but also remove helper
                              var inst = $(this).data("draggable"),
                              uiSortable = $.extend({}, ui, { item: inst.element });
                              
                              $.each(inst.sortables, function() {
                                if(this.instance.isOver) {
                                  
                                  this.instance.isOver = 0;
                                  
                                  inst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance
                                  this.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work)
                                  
                                  //The sortable revert is supported, and we have to set a temporary dropped variable on the draggable to support revert: 'valid/invalid'
                                  if(this.shouldRevert) this.instance.options.revert = true;
                                  
                                  //Trigger the stop of the sortable
                                  this.instance._mouseStop(event);
                                  
                                  this.instance.options.helper = this.instance.options._helper;
                                  
                                  //If the helper has been the original item, restore properties in the sortable
                                  if(inst.options.helper == 'original')
                                    this.instance.currentItem.css({ top: 'auto', left: 'auto' });
                                  
                              } else {
                                this.instance.cancelHelperRemoval = false; //Remove the helper in the sortable instance
                                this.instance._trigger("deactivate", event, uiSortable);
                              }
                              
                            });
                            
                          },
                          drag: function(event, ui) {
                            
                            var inst = $(this).data("draggable"), self = this;
                            
                            var checkPos = function(o) {
                              var dyClick = this.offset.click.top, dxClick = this.offset.click.left;
                              var helperTop = this.positionAbs.top, helperLeft = this.positionAbs.left;
                              var itemHeight = o.height, itemWidth = o.width;
                              var itemTop = o.top, itemLeft = o.left;
                              
                              return $.ui.isOver(helperTop + dyClick, helperLeft + dxClick, itemTop, itemLeft, itemHeight, itemWidth);
                            };
                            
                            $.each(inst.sortables, function(i) {
                              
                              //Copy over some variables to allow calling the sortable's native _intersectsWith
                              this.instance.positionAbs = inst.positionAbs;
                              this.instance.helperProportions = inst.helperProportions;
                              this.instance.offset.click = inst.offset.click;
                              
                              if(this.instance._intersectsWith(this.instance.containerCache)) {
                                
                                //If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once
                                if(!this.instance.isOver) {
                                  
                                  this.instance.isOver = 1;
                                  //Now we fake the start of dragging for the sortable instance,
                                   //by cloning the list group item, appending it to the sortable and using it as inst.currentItem
                                   //We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one)
                                   this.instance.currentItem = $(self).clone().appendTo(this.instance.element).data("sortable-item", true);
                                   this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it
                                   this.instance.options.helper = function() { return ui.helper[0]; };
                                   
                                   event.target = this.instance.currentItem[0];
                                   this.instance._mouseCapture(event, true);
                                   this.instance._mouseStart(event, true, true);
                                   
                                   //Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes
                                   this.instance.offset.click.top = inst.offset.click.top;
                                   this.instance.offset.click.left = inst.offset.click.left;
                                   this.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left;
                                   this.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top;
                                   
                                   inst._trigger("toSortable", event);
                                   inst.dropped = this.instance.element; //draggable revert needs that
                                   //hack so receive/update callbacks work (mostly)
                                   inst.currentItem = inst.element;
                                   this.instance.fromOutside = inst;
                                   
                                }
                                
                                //Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable
                                if(this.instance.currentItem) this.instance._mouseDrag(event);
                                
                              } else {
                                
                                //If it doesn't intersect with the sortable, and it intersected before,
                                //we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval
                                if(this.instance.isOver) {
                                  
                                  this.instance.isOver = 0;
                                  this.instance.cancelHelperRemoval = true;
                                  
                                  //Prevent reverting on this forced stop
                                  this.instance.options.revert = false;
                                  
                                  // The out event needs to be triggered independently
                                  this.instance._trigger('out', event, this.instance._uiHash(this.instance));
                                  
                                  this.instance._mouseStop(event, true);
                                  this.instance.options.helper = this.instance.options._helper;
                                  
                                  //Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size
                                  this.instance.currentItem.remove();
                                  if(this.instance.placeholder) this.instance.placeholder.remove();
                                  
                                  inst._trigger("fromSortable", event);
                                  inst.dropped = false; //draggable revert needs that
                                }
                                
                              };
                              
                            });
                            
                          }
                          });
                          
                          $.ui.plugin.add("draggable", "cursor", {
                            start: function(event, ui) {
                              var t = $('body'), o = $(this).data('draggable').options;
                              if (t.css("cursor")) o._cursor = t.css("cursor");
                              t.css("cursor", o.cursor);
                            },
                                        stop: function(event, ui) {
                                          var o = $(this).data('draggable').options;
                                          if (o._cursor) $('body').css("cursor", o._cursor);
                                        }
                          });
                          
                          $.ui.plugin.add("draggable", "iframeFix", {
                            start: function(event, ui) {
                              var o = $(this).data('draggable').options;
                              $(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() {
                                $('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>')
                                .css({
                                  width: this.offsetWidth+"px", height: this.offsetHeight+"px",
                                     position: "absolute", opacity: "0.001", zIndex: 1000
                                })
                                .css($(this).offset())
                                .appendTo("body");
                              });
                            },
                                        stop: function(event, ui) {
                                          $("div.ui-draggable-iframeFix").each(function() { this.parentNode.removeChild(this); }); //Remove frame helpers
                                        }
                          });
                          
                          $.ui.plugin.add("draggable", "opacity", {
                            start: function(event, ui) {
                              var t = $(ui.helper), o = $(this).data('draggable').options;
                              if(t.css("opacity")) o._opacity = t.css("opacity");
                              t.css('opacity', o.opacity);
                            },
                                       stop: function(event, ui) {
                                         var o = $(this).data('draggable').options;
                                         if(o._opacity) $(ui.helper).css('opacity', o._opacity);
                                       }
                          });
                          
                          $.ui.plugin.add("draggable", "scroll", {
                            start: function(event, ui) {
                              var i = $(this).data("draggable");
                              if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') i.overflowOffset = i.scrollParent.offset();
                            },
                                          drag: function(event, ui) {
                                            
                                            var i = $(this).data("draggable"), o = i.options, scrolled = false;
                                            
                                            if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') {
                                              
                                              if(!o.axis || o.axis != 'x') {
                                                if((i.overflowOffset.top + i.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
                                                  i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop + o.scrollSpeed;
                                                else if(event.pageY - i.overflowOffset.top < o.scrollSensitivity)
                                                  i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop - o.scrollSpeed;
                                              }
                                              
                                              if(!o.axis || o.axis != 'y') {
                                                if((i.overflowOffset.left + i.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
                                                  i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft + o.scrollSpeed;
                                                else if(event.pageX - i.overflowOffset.left < o.scrollSensitivity)
                                                  i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft - o.scrollSpeed;
                                              }
                                              
                                            } else {
                                              
                                              if(!o.axis || o.axis != 'x') {
                                                if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
                                                  scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
                                                else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
                                                  scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
                                              }
                                              
                                              if(!o.axis || o.axis != 'y') {
                                                if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
                                                  scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
                                                else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
                                                  scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
                                              }
                                              
                                            }
                                            
                                            if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
                                              $.ui.ddmanager.prepareOffsets(i, event);
                                            
                                          }
                          });
                          
                          $.ui.plugin.add("draggable", "snap", {
                            start: function(event, ui) {
                              
                              var i = $(this).data("draggable"), o = i.options;
                              i.snapElements = [];
                              
                              $(o.snap.constructor != String ? ( o.snap.items || ':data(draggable)' ) : o.snap).each(function() {
                                var $t = $(this); var $o = $t.offset();
                                if(this != i.element[0]) i.snapElements.push({
                                  item: this,
                                                                             width: $t.outerWidth(), height: $t.outerHeight(),
                                                                             top: $o.top, left: $o.left
                                });
                              });
                              
                            },
                                        drag: function(event, ui) {
                                          
                                          var inst = $(this).data("draggable"), o = inst.options;
                                          var d = o.snapTolerance;
                                          
                                          var x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
                                        y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
                                        
                                        for (var i = inst.snapElements.length - 1; i >= 0; i--){
                                          
                                          var l = inst.snapElements[i].left, r = l + inst.snapElements[i].width,
                                        t = inst.snapElements[i].top, b = t + inst.snapElements[i].height;
                                        
                                        //Yes, I know, this is insane ;)
                                        if(!((l-d < x1 && x1 < r+d && t-d < y1 && y1 < b+d) || (l-d < x1 && x1 < r+d && t-d < y2 && y2 < b+d) || (l-d < x2 && x2 < r+d && t-d < y1 && y1 < b+d) || (l-d < x2 && x2 < r+d && t-d < y2 && y2 < b+d))) {
                                          if(inst.snapElements[i].snapping) (inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
                                          inst.snapElements[i].snapping = false;
                                          continue;
                                        }
                                        
                                        if(o.snapMode != 'inner') {
                                          var ts = Math.abs(t - y2) <= d;
                                          var bs = Math.abs(b - y1) <= d;
                                          var ls = Math.abs(l - x2) <= d;
                                          var rs = Math.abs(r - x1) <= d;
                                          if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
                                          if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top - inst.margins.top;
                                          if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left - inst.margins.left;
                                          if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left - inst.margins.left;
                                        }
                                        
                                        var first = (ts || bs || ls || rs);
                                        
                                        if(o.snapMode != 'outer') {
                                          var ts = Math.abs(t - y1) <= d;
                                          var bs = Math.abs(b - y2) <= d;
                                          var ls = Math.abs(l - x1) <= d;
                                          var rs = Math.abs(r - x2) <= d;
                                          if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top - inst.margins.top;
                                          if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
                                          if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left - inst.margins.left;
                                          if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left - inst.margins.left;
                                        }
                                        
                                        if(!inst.snapElements[i].snapping && (ts || bs || ls || rs || first))
                                          (inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
                                        inst.snapElements[i].snapping = (ts || bs || ls || rs || first);
                                        
                                        };
                                        
                                        }
                          });
                          
                          $.ui.plugin.add("draggable", "stack", {
                            start: function(event, ui) {
                              
                              var o = $(this).data("draggable").options;
                              
                              var group = $.makeArray($(o.stack)).sort(function(a,b) {
                                return (parseInt($(a).css("zIndex"),10) || 0) - (parseInt($(b).css("zIndex"),10) || 0);
                              });
                              if (!group.length) { return; }
                              
                              var min = parseInt(group[0].style.zIndex) || 0;
                              $(group).each(function(i) {
                                this.style.zIndex = min + i;
                              });
                              
                              this[0].style.zIndex = min + group.length;
                              
                            }
                          });
                          
                          $.ui.plugin.add("draggable", "zIndex", {
                            start: function(event, ui) {
                              var t = $(ui.helper), o = $(this).data("draggable").options;
                              if(t.css("zIndex")) o._zIndex = t.css("zIndex");
                              t.css('zIndex', o.zIndex);
                            },
                                       stop: function(event, ui) {
                                         var o = $(this).data("draggable").options;
                                         if(o._zIndex) $(ui.helper).css('zIndex', o._zIndex);
                                       }
                          });
                          
                          })(jQuery);
                          /*
                          * jQuery UI Droppable 1.8.2
                          *
                          * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
                          * Dual licensed under the MIT (MIT-LICENSE.txt)
                          * and GPL (GPL-LICENSE.txt) licenses.
                          *
                          * http://docs.jquery.com/UI/Droppables
                          *
                          * Depends:
                          *  jquery.ui.core.js
                          *  jquery.ui.widget.js
                          *  jquery.ui.mouse.js
                          *  jquery.ui.draggable.js
                          */
                          (function($) {
                            
                            $.widget("ui.droppable", {
                              widgetEventPrefix: "drop",
                                     options: {
                                       accept: '*',
                                     activeClass: false,
                                     addClasses: true,
                                     greedy: false,
                                     hoverClass: false,
                                     scope: 'default',
                                     tolerance: 'intersect'
                                     },
                                     _create: function() {
                                       
                                       var o = this.options, accept = o.accept;
                                       this.isover = 0; this.isout = 1;
                                       
                                       this.accept = $.isFunction(accept) ? accept : function(d) {
                                         return d.is(accept);
                                       };
                                       
                                       //Store the droppable's proportions
                                       this.proportions = { width: this.element[0].offsetWidth, height: this.element[0].offsetHeight };
                                       
                                       // Add the reference and positions to the manager
                                       $.ui.ddmanager.droppables[o.scope] = $.ui.ddmanager.droppables[o.scope] || [];
                                       $.ui.ddmanager.droppables[o.scope].push(this);
                                       
                                       (o.addClasses && this.element.addClass("ui-droppable"));
                                       
                                     },
                                     
                                     destroy: function() {
                                       var drop = $.ui.ddmanager.droppables[this.options.scope];
                                       for ( var i = 0; i < drop.length; i++ )
                                         if ( drop[i] == this )
                                           drop.splice(i, 1);
                                         
                                         this.element
                                         .removeClass("ui-droppable ui-droppable-disabled")
                                         .removeData("droppable")
                                         .unbind(".droppable");
                                       
                                       return this;
                                     },
                           
                           _setOption: function(key, value) {
                             
                             if(key == 'accept') {
                               this.accept = $.isFunction(value) ? value : function(d) {
                                 return d.is(value);
                               };
                             }
                             $.Widget.prototype._setOption.apply(this, arguments);
                           },
                           
                           _activate: function(event) {
                             var draggable = $.ui.ddmanager.current;
                             if(this.options.activeClass) this.element.addClass(this.options.activeClass);
                             (draggable && this._trigger('activate', event, this.ui(draggable)));
                           },
                           
                           _deactivate: function(event) {
                             var draggable = $.ui.ddmanager.current;
                             if(this.options.activeClass) this.element.removeClass(this.options.activeClass);
                             (draggable && this._trigger('deactivate', event, this.ui(draggable)));
                           },
                           
                           _over: function(event) {
                             
                             var draggable = $.ui.ddmanager.current;
                             if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element
                               
                               if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
                                 if(this.options.hoverClass) this.element.addClass(this.options.hoverClass);
                                 this._trigger('over', event, this.ui(draggable));
                               }
                               
                           },
                                 
                                 _out: function(event) {
                                   
                                   var draggable = $.ui.ddmanager.current;
                                   if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element
                                     
                                     if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
                                       if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass);
                                       this._trigger('out', event, this.ui(draggable));
                                     }
                                     
                                 },
                                       
                                       _drop: function(event,custom) {
                                         
                                         var draggable = custom || $.ui.ddmanager.current;
                                         if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return false; // Bail if draggable and droppable are same element
                                           
                                           var childrenIntersection = false;
                                         this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function() {
                                           var inst = $.data(this, 'droppable');
                                           if(
                                             inst.options.greedy
                                             && !inst.options.disabled
                                             && inst.options.scope == draggable.options.scope
                                             && inst.accept.call(inst.element[0], (draggable.currentItem || draggable.element))
                                             && $.ui.intersect(draggable, $.extend(inst, { offset: inst.element.offset() }), inst.options.tolerance)
                                             ) { childrenIntersection = true; return false; }
                                         });
                                         if(childrenIntersection) return false;
                                         
                                         if(this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
                                           if(this.options.activeClass) this.element.removeClass(this.options.activeClass);
                                           if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass);
                                           this._trigger('drop', event, this.ui(draggable));
                                           return this.element;
                                         }
                                         
                                         return false;
                                         
                                       },
                                 
                                 ui: function(c) {
                                   return {
                                     draggable: (c.currentItem || c.element),
                                 helper: c.helper,
                                 position: c.position,
                                 offset: c.positionAbs
                                   };
                                 }
                                 
                            });
                            
                            $.extend($.ui.droppable, {
                              version: "1.8.2"
                            });
                            
                            $.ui.intersect = function(draggable, droppable, toleranceMode) {
                              
                              if (!droppable.offset) return false;
                              
                              var x1 = (draggable.positionAbs || draggable.position.absolute).left, x2 = x1 + draggable.helperProportions.width,
                           y1 = (draggable.positionAbs || draggable.position.absolute).top, y2 = y1 + draggable.helperProportions.height;
                           var l = droppable.offset.left, r = l + droppable.proportions.width,
                           t = droppable.offset.top, b = t + droppable.proportions.height;
                           
                           switch (toleranceMode) {
                             case 'fit':
                               return (l < x1 && x2 < r
                               && t < y1 && y2 < b);
                               break;
                             case 'intersect':
                               return (l < x1 + (draggable.helperProportions.width / 2) // Right Half
                               && x2 - (draggable.helperProportions.width / 2) < r // Left Half
                               && t < y1 + (draggable.helperProportions.height / 2) // Bottom Half
                               && y2 - (draggable.helperProportions.height / 2) < b ); // Top Half
                               break;
                             case 'pointer':
                               var draggableLeft = ((draggable.positionAbs || draggable.position.absolute).left + (draggable.clickOffset || draggable.offset.click).left),
                           draggableTop = ((draggable.positionAbs || draggable.position.absolute).top + (draggable.clickOffset || draggable.offset.click).top),
                           isOver = $.ui.isOver(draggableTop, draggableLeft, t, l, droppable.proportions.height, droppable.proportions.width);
                           return isOver;
                           break;
                             case 'touch':
                               return (
                               (y1 >= t && y1 <= b) || // Top edge touching
                               (y2 >= t && y2 <= b) || // Bottom edge touching
                               (y1 < t && y2 > b)    // Surrounded vertically
                               ) && (
                               (x1 >= l && x1 <= r) || // Left edge touching
                               (x2 >= l && x2 <= r) || // Right edge touching
                               (x1 < l && x2 > r)    // Surrounded horizontally
                               );
                               break;
                             default:
                               return false;
                               break;
                           }
                           
                            };
                            
                            /*
                            This manager tracks offsets of draggables and droppables
                            */
                            $.ui.ddmanager = {
                              current: null,
                                droppables: { 'default': [] },
                                prepareOffsets: function(t, event) {
                                  
                                  var m = $.ui.ddmanager.droppables[t.options.scope] || [];
                                  var type = event ? event.type : null; // workaround for #2317
                                  var list = (t.currentItem || t.element).find(":data(droppable)").andSelf();
                                  
                                  droppablesLoop: for (var i = 0; i < m.length; i++) {
                                    
                                    if(m[i].options.disabled || (t && !m[i].accept.call(m[i].element[0],(t.currentItem || t.element)))) continue; //No disabled and non-accepted
                                      for (var j=0; j < list.length; j++) { if(list[j] == m[i].element[0]) { m[i].proportions.height = 0; continue droppablesLoop; } }; //Filter out elements in the current dragged item
                                        m[i].visible = m[i].element.css("display") != "none"; if(!m[i].visible) continue;                   //If the element is not visible, continue
                                        
                                        m[i].offset = m[i].element.offset();
                                        m[i].proportions = { width: m[i].element[0].offsetWidth, height: m[i].element[0].offsetHeight };
                                        
                                        if(type == "mousedown") m[i]._activate.call(m[i], event); //Activate the droppable if used directly from draggables
                                          
                                      }
                                      
                                      },
                                                                                                 drop: function(draggable, event) {
                                                                                                   
                                                                                                   var dropped = false;
                                                                                                   $.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
                                                                                                     
                                                                                                     if(!this.options) return;
                                                                                                     if (!this.options.disabled && this.visible && $.ui.intersect(draggable, this, this.options.tolerance))
                                                                                                       dropped = dropped || this._drop.call(this, event);
                                                                                                     
                                                                                                     if (!this.options.disabled && this.visible && this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
                                                                                                       this.isout = 1; this.isover = 0;
                                                                                                       this._deactivate.call(this, event);
                                                                                                     }
                                                                                                     
                                                                                                   });
                                                                                                   return dropped;
                                                                                                   
                                                                                                 },
                                                                                                 drag: function(draggable, event) {
                                                                                                   
                                                                                                   //If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.
                                                                                                   if(draggable.options.refreshPositions) $.ui.ddmanager.prepareOffsets(draggable, event);
                                                                                                   
                                                                                                   //Run through all droppables and check their positions based on specific tolerance options
                                                                                                   $.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
                                                                                                     
                                                                                                     if(this.options.disabled || this.greedyChild || !this.visible) return;
                                                                                                     var intersects = $.ui.intersect(draggable, this, this.options.tolerance);
                                                                                                     
                                                                                                     var c = !intersects && this.isover == 1 ? 'isout' : (intersects && this.isover == 0 ? 'isover' : null);
                                                                                                     if(!c) return;
                                                                                                     
                                                                                                     var parentInstance;
                                                                                                     if (this.options.greedy) {
                                                                                                       var parent = this.element.parents(':data(droppable):eq(0)');
                                                                                                       if (parent.length) {
                                                                                                         parentInstance = $.data(parent[0], 'droppable');
                                                                                                         parentInstance.greedyChild = (c == 'isover' ? 1 : 0);
                                                                                                       }
                                                                                                     }
                                                                                                     
                                                                                                     // we just moved into a greedy child
                                                                                                     if (parentInstance && c == 'isover') {
                                                                                                       parentInstance['isover'] = 0;
                                                                                                       parentInstance['isout'] = 1;
                                                                                                       parentInstance._out.call(parentInstance, event);
                                                                                                     }
                                                                                                     
                                                                                                     this[c] = 1; this[c == 'isout' ? 'isover' : 'isout'] = 0;
                                                                                                     this[c == "isover" ? "_over" : "_out"].call(this, event);
                                                                                                     
                                                                                                     // we just moved out of a greedy child
                                                                                                     if (parentInstance && c == 'isout') {
                                                                                                       parentInstance['isout'] = 0;
                                                                                                       parentInstance['isover'] = 1;
                                                                                                       parentInstance._over.call(parentInstance, event);
                                                                                                     }
                                                                                                   });
                                                                                                   
                                                                                                 }
                                  };
                                  
                                })(jQuery);
                                /*
                                * jQuery UI Resizable 1.8.2
                                *
                                * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
                                * Dual licensed under the MIT (MIT-LICENSE.txt)
                                * and GPL (GPL-LICENSE.txt) licenses.
                                *
                                * http://docs.jquery.com/UI/Resizables
                                *
                                * Depends:
                                *  jquery.ui.core.js
                                *  jquery.ui.mouse.js
                                *  jquery.ui.widget.js
                                */
                                (function($) {
                                  
                                  $.widget("ui.resizable", $.ui.mouse, {
                                    widgetEventPrefix: "resize",
                                           options: {
                                             alsoResize: false,
                                           animate: false,
                                           animateDuration: "slow",
                                           animateEasing: "swing",
                                           aspectRatio: false,
                                           autoHide: false,
                                           containment: false,
                                           ghost: false,
                                           grid: false,
                                           handles: "e,s,se",
                                           helper: false,
                                           maxHeight: null,
                                           maxWidth: null,
                                           minHeight: 10,
                                           minWidth: 10,
                                           zIndex: 1000
                                           },
                                           _create: function() {
                                             
                                             var self = this, o = this.options;
                                             this.element.addClass("ui-resizable");
                                             
                                             $.extend(this, {
                                               _aspectRatio: !!(o.aspectRatio),
                                                      aspectRatio: o.aspectRatio,
                                                      originalElement: this.element,
                                                      _proportionallyResizeElements: [],
                                                      _helper: o.helper || o.ghost || o.animate ? o.helper || 'ui-resizable-helper' : null
                                             });
                                             
                                             //Wrap the element if it cannot hold child nodes
                                             if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)) {
                                  
                                  //Opera fix for relative positioning
                                  if (/relative/.test(this.element.css('position')) && $.browser.opera)
                                    this.element.css({ position: 'relative', top: 'auto', left: 'auto' });
                                  
                                  //Create a wrapper element and set the wrapper to the new current internal element
                                  this.element.wrap(
                                  $('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({
                                    position: this.element.css('position'),
                                                                                                    width: this.element.outerWidth(),
                                                                                                    height: this.element.outerHeight(),
                                                                                                    top: this.element.css('top'),
                                                                                                    left: this.element.css('left')
                                  })
                                  );
                                  
                                  //Overwrite the original this.element
                                  this.element = this.element.parent().data(
                                  "resizable", this.element.data('resizable')
                                  );
                                  
                                  this.elementIsWrapper = true;
                                  
                                  //Move margins to the wrapper
                                  this.element.css({ marginLeft: this.originalElement.css("marginLeft"), marginTop: this.originalElement.css("marginTop"), marginRight: this.originalElement.css("marginRight"), marginBottom: this.originalElement.css("marginBottom") });
                                  this.originalElement.css({ marginLeft: 0, marginTop: 0, marginRight: 0, marginBottom: 0});
                                  
                                  //Prevent Safari textarea resize
                                  this.originalResizeStyle = this.originalElement.css('resize');
                                  this.originalElement.css('resize', 'none');
                                  
                                  //Push the actual element to our proportionallyResize internal array
                                  this._proportionallyResizeElements.push(this.originalElement.css({ position: 'static', zoom: 1, display: 'block' }));
                                  
                                  // avoid IE jump (hard set the margin)
                                  this.originalElement.css({ margin: this.originalElement.css('margin') });
                                  
                                  // fix handlers offset
                                  this._proportionallyResize();
                                  
                                }
                                
                                this.handles = o.handles || (!$('.ui-resizable-handle', this.element).length ? "e,s,se" : { n: '.ui-resizable-n', e: '.ui-resizable-e', s: '.ui-resizable-s', w: '.ui-resizable-w', se: '.ui-resizable-se', sw: '.ui-resizable-sw', ne: '.ui-resizable-ne', nw: '.ui-resizable-nw' });
                                if(this.handles.constructor == String) {
                                  
                                  if(this.handles == 'all') this.handles = 'n,e,s,w,se,sw,ne,nw';
                                  var n = this.handles.split(","); this.handles = {};
                                  
                                  for(var i = 0; i < n.length; i++) {
                                    
                                    var handle = $.trim(n[i]), hname = 'ui-resizable-'+handle;
                                    var axis = $('<div class="ui-resizable-handle ' + hname + '"></div>');
                                    
                                    // increase zIndex of sw, se, ne, nw axis
                                    //TODO : this modifies original option
                                    if(/sw|se|ne|nw/.test(handle)) axis.css({ zIndex: ++o.zIndex });
                                    
                                    //TODO : What's going on here?
                                    if ('se' == handle) {
                                      axis.addClass('ui-icon ui-icon-gripsmall-diagonal-se');
                                    };
                                    
                                    //Insert into internal handles object and append to element
                                    this.handles[handle] = '.ui-resizable-'+handle;
                                    this.element.append(axis);
                                  }
                                  
                                }
                                
                                this._renderAxis = function(target) {
                                  
                                  target = target || this.element;
                                  
                                  for(var i in this.handles) {
                                    
                                    if(this.handles[i].constructor == String)
                                      this.handles[i] = $(this.handles[i], this.element).show();
                                    
                                    //Apply pad to wrapper element, needed to fix axis position (textarea, inputs, scrolls)
                                    if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/textarea|input|select|button/i)) {
                                      
                                      var axis = $(this.handles[i], this.element), padWrapper = 0;
                                      
                                      //Checking the correct pad and border
                                      padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();
                                      
                                      //The padding type i have to apply...
                                      var padPos = [ 'padding',
                                       /ne|nw|n/.test(i) ? 'Top' :
                                       /se|sw|s/.test(i) ? 'Bottom' :
                                       /^e$/.test(i) ? 'Right' : 'Left' ].join("");
                                       
                                       target.css(padPos, padWrapper);
                                       
                                       this._proportionallyResize();
                                       
                                    }
                                    
                                    //TODO: What's that good for? There's not anything to be executed left
                                    if(!$(this.handles[i]).length)
                                      continue;
                                    
                                  }
                                };
                                
                                //TODO: make renderAxis a prototype function
                                this._renderAxis(this.element);
                                
                                this._handles = $('.ui-resizable-handle', this.element)
                                .disableSelection();
                                
                                //Matching axis name
                                this._handles.mouseover(function() {
                                  if (!self.resizing) {
                                    if (this.className)
                                      var axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);
                                    //Axis, default = se
                                    self.axis = axis && axis[1] ? axis[1] : 'se';
                                  }
                                });
                                
                                //If we want to auto hide the elements
                                if (o.autoHide) {
                                  this._handles.hide();
                                  $(this.element)
                                  .addClass("ui-resizable-autohide")
                                  .hover(function() {
                                    $(this).removeClass("ui-resizable-autohide");
                                    self._handles.show();
                                  },
                                         function(){
                                           if (!self.resizing) {
                                             $(this).addClass("ui-resizable-autohide");
                                             self._handles.hide();
                                           }
                                         });
                                }
                                
                                //Initialize the mouse interaction
                                this._mouseInit();
                                
                                  },
                                
                                destroy: function() {
                                  
                                  this._mouseDestroy();
                                  
                                  var _destroy = function(exp) {
                                    $(exp).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing")
                                    .removeData("resizable").unbind(".resizable").find('.ui-resizable-handle').remove();
                                  };
                                  
                                  //TODO: Unwrap at same DOM position
                                  if (this.elementIsWrapper) {
                                    _destroy(this.element);
                                    var wrapper = this.element;
                                    wrapper.after(
                                    this.originalElement.css({
                                      position: wrapper.css('position'),
                                                             width: wrapper.outerWidth(),
                                                             height: wrapper.outerHeight(),
                                                             top: wrapper.css('top'),
                                                             left: wrapper.css('left')
                                    })
                                    ).remove();
                                  }
                                  
                                  this.originalElement.css('resize', this.originalResizeStyle);
                                  _destroy(this.originalElement);
                                  
                                  return this;
                                },
                                
                                _mouseCapture: function(event) {
                                  var handle = false;
                                  for (var i in this.handles) {
                                    if ($(this.handles[i])[0] == event.target) {
                                      handle = true;
                                    }
                                  }
                                  
                                  return !this.options.disabled && handle;
                                },
                                
                                _mouseStart: function(event) {
                                  
                                  var o = this.options, iniPos = this.element.position(), el = this.element;
                                  
                                  this.resizing = true;
                                  this.documentScroll = { top: $(document).scrollTop(), left: $(document).scrollLeft() };
                                  
                                  // bugfix for http://dev.jquery.com/ticket/1749
                                  if (el.is('.ui-draggable') || (/absolute/).test(el.css('position'))) {
                                 el.css({ position: 'absolute', top: iniPos.top, left: iniPos.left });
                               }
                               
                               //Opera fixing relative position
                               if ($.browser.opera && (/relative/).test(el.css('position')))
                               el.css({ position: 'relative', top: 'auto', left: 'auto' });
                               
                               this._renderProxy();
                               
                               var curleft = num(this.helper.css('left')), curtop = num(this.helper.css('top'));
                               
                               if (o.containment) {
                                 curleft += $(o.containment).scrollLeft() || 0;
                                 curtop += $(o.containment).scrollTop() || 0;
                               }
                               
                               //Store needed variables
                               this.offset = this.helper.offset();
                               this.position = { left: curleft, top: curtop };
                               this.size = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
                               this.originalSize = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
                               this.originalPosition = { left: curleft, top: curtop };
                               this.sizeDiff = { width: el.outerWidth() - el.width(), height: el.outerHeight() - el.height() };
                               this.originalMousePosition = { left: event.pageX, top: event.pageY };
                               
                               //Aspect Ratio
                               this.aspectRatio = (typeof o.aspectRatio == 'number') ? o.aspectRatio : ((this.originalSize.width / this.originalSize.height) || 1);
                               
                               var cursor = $('.ui-resizable-' + this.axis).css('cursor');
                               $('body').css('cursor', cursor == 'auto' ? this.axis + '-resize' : cursor);
                               
                               el.addClass("ui-resizable-resizing");
                               this._propagate("start", event);
                               return true;
                                },
                                
                                _mouseDrag: function(event) {
                                  
                                  //Increase performance, avoid regex
                                  var el = this.helper, o = this.options, props = {},
                                  self = this, smp = this.originalMousePosition, a = this.axis;
                                  
                                  var dx = (event.pageX-smp.left)||0, dy = (event.pageY-smp.top)||0;
                                  var trigger = this._change[a];
                                  if (!trigger) return false;
                                  
                                  // Calculate the attrs that will be change
                                  var data = trigger.apply(this, [event, dx, dy]), ie6 = $.browser.msie && $.browser.version < 7, csdif = this.sizeDiff;
                                  
                                  if (this._aspectRatio || event.shiftKey)
                                    data = this._updateRatio(data, event);
                                  
                                  data = this._respectSize(data, event);
                                  
                                  // plugins callbacks need to be called first
                                  this._propagate("resize", event);
                                  
                                  el.css({
                                    top: this.position.top + "px", left: this.position.left + "px",
                                         width: this.size.width + "px", height: this.size.height + "px"
                                  });
                                  
                                  if (!this._helper && this._proportionallyResizeElements.length)
                                    this._proportionallyResize();
                                  
                                  this._updateCache(data);
                                  
                                  // calling the user callback at the end
                                  this._trigger('resize', event, this.ui());
                                  
                                  return false;
                                },
                                
                                _mouseStop: function(event) {
                                  
                                  this.resizing = false;
                                  var o = this.options, self = this;
                                  
                                  if(this._helper) {
                                    var pr = this._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
                                    soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,
                                    soffsetw = ista ? 0 : self.sizeDiff.width;
                                    
                                    var s = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) },
                                    left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,
                                    top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;
                                    
                                    if (!o.animate)
                                      this.element.css($.extend(s, { top: top, left: left }));
                                    
                                    self.helper.height(self.size.height);
                                    self.helper.width(self.size.width);
                                    
                                    if (this._helper && !o.animate) this._proportionallyResize();
                                  }
                                  
                                  $('body').css('cursor', 'auto');
                                  
                                  this.element.removeClass("ui-resizable-resizing");
                                  
                                  this._propagate("stop", event);
                                  
                                  if (this._helper) this.helper.remove();
                                  return false;
                                  
                                },
                                
                                _updateCache: function(data) {
                                  var o = this.options;
                                  this.offset = this.helper.offset();
                                  if (isNumber(data.left)) this.position.left = data.left;
                                  if (isNumber(data.top)) this.position.top = data.top;
                                  if (isNumber(data.height)) this.size.height = data.height;
                                  if (isNumber(data.width)) this.size.width = data.width;
                                },
                                
                                _updateRatio: function(data, event) {
                                  
                                  var o = this.options, cpos = this.position, csize = this.size, a = this.axis;
                                  
                                  if (data.height) data.width = (csize.height * this.aspectRatio);
                                  else if (data.width) data.height = (csize.width / this.aspectRatio);
                                  
                                  if (a == 'sw') {
                                    data.left = cpos.left + (csize.width - data.width);
                                    data.top = null;
                                  }
                                  if (a == 'nw') {
                                    data.top = cpos.top + (csize.height - data.height);
                                    data.left = cpos.left + (csize.width - data.width);
                                  }
                                  
                                  return data;
                                },
                                
                                _respectSize: function(data, event) {
                                  
                                  var el = this.helper, o = this.options, pRatio = this._aspectRatio || event.shiftKey, a = this.axis,
                                  ismaxw = isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width), ismaxh = isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),
                                  isminw = isNumber(data.width) && o.minWidth && (o.minWidth > data.width), isminh = isNumber(data.height) && o.minHeight && (o.minHeight > data.height);
                                  
                                  if (isminw) data.width = o.minWidth;
                                  if (isminh) data.height = o.minHeight;
                                  if (ismaxw) data.width = o.maxWidth;
                                  if (ismaxh) data.height = o.maxHeight;
                                  
                                  var dw = this.originalPosition.left + this.originalSize.width, dh = this.position.top + this.size.height;
                                  var cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);
                                  
                                  if (isminw && cw) data.left = dw - o.minWidth;
                                  if (ismaxw && cw) data.left = dw - o.maxWidth;
                                  if (isminh && ch) data.top = dh - o.minHeight;
                                  if (ismaxh && ch) data.top = dh - o.maxHeight;
                                  
                                  // fixing jump error on top/left - bug #2330
                                  var isNotwh = !data.width && !data.height;
                                  if (isNotwh && !data.left && data.top) data.top = null;
                                  else if (isNotwh && !data.top && data.left) data.left = null;
                                  
                                  return data;
                                },
                                
                                _proportionallyResize: function() {
                                  
                                  var o = this.options;
                                  if (!this._proportionallyResizeElements.length) return;
                                  var element = this.helper || this.element;
                                  
                                  for (var i=0; i < this._proportionallyResizeElements.length; i++) {
                                    
                                    var prel = this._proportionallyResizeElements[i];
                                    
                                    if (!this.borderDif) {
                                      var b = [prel.css('borderTopWidth'), prel.css('borderRightWidth'), prel.css('borderBottomWidth'), prel.css('borderLeftWidth')],
                                                                                    p = [prel.css('paddingTop'), prel.css('paddingRight'), prel.css('paddingBottom'), prel.css('paddingLeft')];
                                                                                    
                                                                                    this.borderDif = $.map(b, function(v, i) {
                                                                                      var border = parseInt(v,10)||0, padding = parseInt(p[i],10)||0;
                                                                                      return border + padding;
                                                                                    });
                                    }
                                    
                                    if ($.browser.msie && !(!($(element).is(':hidden') || $(element).parents(':hidden').length)))
                                      continue;
                                    
                                    prel.css({
                                      height: (element.height() - this.borderDif[0] - this.borderDif[2]) || 0,
                                             width: (element.width() - this.borderDif[1] - this.borderDif[3]) || 0
                                    });
                                    
                                  };
                                  
                                },
                                        
                                        _renderProxy: function() {
                                          
                                          var el = this.element, o = this.options;
                                          this.elementOffset = el.offset();
                                          
                                          if(this._helper) {
                                            
                                            this.helper = this.helper || $('<div style="overflow:hidden;"></div>');
                                            
                                            // fix ie6 offset TODO: This seems broken
                                            var ie6 = $.browser.msie && $.browser.version < 7, ie6offset = (ie6 ? 1 : 0),
                                                                                                  pxyoffset = ( ie6 ? 2 : -1 );
                                                                                                  
                                                                                                  this.helper.addClass(this._helper).css({
                                                                                                    width: this.element.outerWidth() + pxyoffset,
                                                                                                                                         height: this.element.outerHeight() + pxyoffset,
                                                                                                                                         position: 'absolute',
                                                                                                                                         left: this.elementOffset.left - ie6offset +'px',
                                                                                                                                         top: this.elementOffset.top - ie6offset +'px',
                                                                                                                                         zIndex: ++o.zIndex //TODO: Don't modify option
                                                                                                  });
                                                                                                  
                                                                                                  this.helper
                                                                                                  .appendTo("body")
                                                                                                  .disableSelection();
                                                                                                  
                                          } else {
                                            this.helper = this.element;
                                          }
                                          
                                        },
                                                                                                  
                                                                                                  _change: {
                                                                                                    e: function(event, dx, dy) {
                                                                                                      return { width: this.originalSize.width + dx };
                                                                                                    },
                                                                                                  w: function(event, dx, dy) {
                                                                                                    var o = this.options, cs = this.originalSize, sp = this.originalPosition;
                                                                                                    return { left: sp.left + dx, width: cs.width - dx };
                                                                                                  },
                                                                                                  n: function(event, dx, dy) {
                                                                                                    var o = this.options, cs = this.originalSize, sp = this.originalPosition;
                                                                                                    return { top: sp.top + dy, height: cs.height - dy };
                                                                                                  },
                                                                                                  s: function(event, dx, dy) {
                                                                                                    return { height: this.originalSize.height + dy };
                                                                                                  },
                                                                                                  se: function(event, dx, dy) {
                                                                                                    return $.extend(this._change.s.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
                                                                                                  },
                                                                                                  sw: function(event, dx, dy) {
                                                                                                    return $.extend(this._change.s.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
                                                                                                  },
                                                                                                  ne: function(event, dx, dy) {
                                                                                                    return $.extend(this._change.n.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
                                                                                                  },
                                                                                                  nw: function(event, dx, dy) {
                                                                                                    return $.extend(this._change.n.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
                                                                                                  }
                                                                                                  },
                                                                                                  
                                                                                                  _propagate: function(n, event) {
                                                                                                    $.ui.plugin.call(this, n, [event, this.ui()]);
                                                                                                    (n != "resize" && this._trigger(n, event, this.ui()));
                                                                                                  },
                                                                                                  
                                                                                                  plugins: {},
                                                                                                  
                                                                                                  ui: function() {
                                                                                                    return {
                                                                                                      originalElement: this.originalElement,
                                                                                                  element: this.element,
                                                                                                  helper: this.helper,
                                                                                                  position: this.position,
                                                                                                  size: this.size,
                                                                                                  originalSize: this.originalSize,
                                                                                                  originalPosition: this.originalPosition
                                                                                                    };
                                                                                                  }
                                                                                                  
                                });
                                
                                $.extend($.ui.resizable, {
                                  version: "1.8.2"
                                });
                                
                                /*
                                * Resizable Extensions
                                */
                                
                                $.ui.plugin.add("resizable", "alsoResize", {
                                  
                                  start: function(event, ui) {
                                    
                                    var self = $(this).data("resizable"), o = self.options;
                                    
                                    var _store = function(exp) {
                                      $(exp).each(function() {
                                        $(this).data("resizable-alsoresize", {
                                          width: parseInt($(this).width(), 10), height: parseInt($(this).height(), 10),
                                                     left: parseInt($(this).css('left'), 10), top: parseInt($(this).css('top'), 10)
                                        });
                                      });
                                    };
                                    
                                    if (typeof(o.alsoResize) == 'object' && !o.alsoResize.parentNode) {
                                      if (o.alsoResize.length) { o.alsoResize = o.alsoResize[0];  _store(o.alsoResize); }
                                      else { $.each(o.alsoResize, function(exp, c) { _store(exp); }); }
                                    }else{
                                      _store(o.alsoResize);
                                    }
                                  },
                                  
                                  resize: function(event, ui){
                                    var self = $(this).data("resizable"), o = self.options, os = self.originalSize, op = self.originalPosition;
                                    
                                    var delta = {
                                      height: (self.size.height - os.height) || 0, width: (self.size.width - os.width) || 0,
                                      top: (self.position.top - op.top) || 0, left: (self.position.left - op.left) || 0
                                    },
                                    
                                    _alsoResize = function(exp, c) {
                                      $(exp).each(function() {
                                        var el = $(this), start = $(this).data("resizable-alsoresize"), style = {}, css = c && c.length ? c : ['width', 'height', 'top', 'left'];
                                        
                                        $.each(css || ['width', 'height', 'top', 'left'], function(i, prop) {
                                          var sum = (start[prop]||0) + (delta[prop]||0);
                                          if (sum && sum >= 0)
                                            style[prop] = sum || null;
                                        });
                                        
                                        //Opera fixing relative position
                                        if (/relative/.test(el.css('position')) && $.browser.opera) {
                                          self._revertToRelativePosition = true;
                                          el.css({ position: 'absolute', top: 'auto', left: 'auto' });
                                      }
                                      
                                      el.css(style);
                                    });
                                  };
                                  
                                  if (typeof(o.alsoResize) == 'object' && !o.alsoResize.nodeType) {
                                    $.each(o.alsoResize, function(exp, c) { _alsoResize(exp, c); });
                                  }else{
                                    _alsoResize(o.alsoResize);
                                  }
                                },
                                
                                stop: function(event, ui){
                                  var self = $(this).data("resizable");
                                  
                                  //Opera fixing relative position
                                  if (self._revertToRelativePosition && $.browser.opera) {
                                    self._revertToRelativePosition = false;
                                    el.css({ position: 'relative' });
                                  }
                                  
                                  $(this).removeData("resizable-alsoresize-start");
                                }
                            });
                            
                            $.ui.plugin.add("resizable", "animate", {
                              
                              stop: function(event, ui) {
                                var self = $(this).data("resizable"), o = self.options;
                                
                                var pr = self._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
                                            soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,
                                            soffsetw = ista ? 0 : self.sizeDiff.width;
                                            
                                            var style = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) },
                                            left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,
                                            top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;
                                            
                                            self.element.animate(
                                            $.extend(style, top && left ? { top: top, left: left } : {}), {
                                              duration: o.animateDuration,
                                                                 easing: o.animateEasing,
                                                                 step: function() {
                                                                   
                                                                   var data = {
                                                                     width: parseInt(self.element.css('width'), 10),
                                                                 height: parseInt(self.element.css('height'), 10),
                                                                 top: parseInt(self.element.css('top'), 10),
                                                                 left: parseInt(self.element.css('left'), 10)
                                                                   };
                                                                   
                                                                   if (pr && pr.length) $(pr[0]).css({ width: data.width, height: data.height });
                                                                   
                                                                   // propagating resize, and updating values for each animation step
                                                                   self._updateCache(data);
                                                                   self._propagate("resize", event);
                                                                   
                                                                 }
                                            }
                                            );
                              }
                              
                            });
                            
                            $.ui.plugin.add("resizable", "containment", {
                              
                              start: function(event, ui) {
                                var self = $(this).data("resizable"), o = self.options, el = self.element;
                                var oc = o.containment, ce = (oc instanceof $) ? oc.get(0) : (/parent/.test(oc)) ? el.parent().get(0) : oc;
                                if (!ce) return;
                                
                                self.containerElement = $(ce);
                                
                                if (/document/.test(oc) || oc == document) {
                                  self.containerOffset = { left: 0, top: 0 };
                                  self.containerPosition = { left: 0, top: 0 };
                                  
                                  self.parentData = {
                                    element: $(document), left: 0, top: 0,
                                            width: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight
                                  };
                                }
                                
                                // i'm a node, so compute top, left, right, bottom
                                else {
                                  var element = $(ce), p = [];
                                  $([ "Top", "Right", "Left", "Bottom" ]).each(function(i, name) { p[i] = num(element.css("padding" + name)); });
                                  
                                  self.containerOffset = element.offset();
                                  self.containerPosition = element.position();
                                  self.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) };
                                  
                                  var co = self.containerOffset, ch = self.containerSize.height,  cw = self.containerSize.width,
                                                                               width = ($.ui.hasScroll(ce, "left") ? ce.scrollWidth : cw ), height = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch);
                                                                               
                                                                               self.parentData = {
                                                                                 element: ce, left: co.left, top: co.top, width: width, height: height
                                                                               };
                              }
                            },
                                                                               
                                                                               resize: function(event, ui) {
                                                                                 var self = $(this).data("resizable"), o = self.options,
                                                                               ps = self.containerSize, co = self.containerOffset, cs = self.size, cp = self.position,
                                                                               pRatio = self._aspectRatio || event.shiftKey, cop = { top:0, left:0 }, ce = self.containerElement;
                                                                               
                                                                               if (ce[0] != document && (/static/).test(ce.css('position'))) cop = co;
                                                                               
                                                                               if (cp.left < (self._helper ? co.left : 0)) {
                                                                                 self.size.width = self.size.width + (self._helper ? (self.position.left - co.left) : (self.position.left - cop.left));
                                                                                 if (pRatio) self.size.height = self.size.width / o.aspectRatio;
                                                                                 self.position.left = o.helper ? co.left : 0;
                                                                               }
                                                                               
                                                                               if (cp.top < (self._helper ? co.top : 0)) {
                                                                                 self.size.height = self.size.height + (self._helper ? (self.position.top - co.top) : self.position.top);
                                                                                 if (pRatio) self.size.width = self.size.height * o.aspectRatio;
                                                                                 self.position.top = self._helper ? co.top : 0;
                                                                               }
                                                                               
                                                                               self.offset.left = self.parentData.left+self.position.left;
                                                                               self.offset.top = self.parentData.top+self.position.top;
                                                                               
                                                                               var woset = Math.abs( (self._helper ? self.offset.left - cop.left : (self.offset.left - cop.left)) + self.sizeDiff.width ),
                                                                               hoset = Math.abs( (self._helper ? self.offset.top - cop.top : (self.offset.top - co.top)) + self.sizeDiff.height );
                                                                               
                                                                               var isParent = self.containerElement.get(0) == self.element.parent().get(0),
                                                                               isOffsetRelative = /relative|absolute/.test(self.containerElement.css('position'));
                                                                               
                                                                               if(isParent && isOffsetRelative) woset -= self.parentData.left;
                                                                               
                                                                               if (woset + self.size.width >= self.parentData.width) {
                                                                                 self.size.width = self.parentData.width - woset;
                                                                                 if (pRatio) self.size.height = self.size.width / self.aspectRatio;
                                                                               }
                                                                               
                                                                               if (hoset + self.size.height >= self.parentData.height) {
                                                                                 self.size.height = self.parentData.height - hoset;
                                                                                 if (pRatio) self.size.width = self.size.height * self.aspectRatio;
                                                                               }
                                                                               },
                                                                               
                                                                               stop: function(event, ui){
                                                                                 var self = $(this).data("resizable"), o = self.options, cp = self.position,
                                                                               co = self.containerOffset, cop = self.containerPosition, ce = self.containerElement;
                                                                               
                                                                               var helper = $(self.helper), ho = helper.offset(), w = helper.outerWidth() - self.sizeDiff.width, h = helper.outerHeight() - self.sizeDiff.height;
                                                                               
                                                                               if (self._helper && !o.animate && (/relative/).test(ce.css('position')))
                                                                                 $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
                                                                               
                                                                               if (self._helper && !o.animate && (/static/).test(ce.css('position')))
                                                                                 $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
                                                                               
                                                                               }
                          });
                          
                          $.ui.plugin.add("resizable", "ghost", {
                            
                            start: function(event, ui) {
                              
                              var self = $(this).data("resizable"), o = self.options, cs = self.size;
                              
                              self.ghost = self.originalElement.clone();
                              self.ghost
                              .css({ opacity: .25, display: 'block', position: 'relative', height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 })
                              .addClass('ui-resizable-ghost')
                              .addClass(typeof o.ghost == 'string' ? o.ghost : '');
                              
                              self.ghost.appendTo(self.helper);
                              
                            },
                            
                            resize: function(event, ui){
                              var self = $(this).data("resizable"), o = self.options;
                              if (self.ghost) self.ghost.css({ position: 'relative', height: self.size.height, width: self.size.width });
                            },
                            
                            stop: function(event, ui){
                              var self = $(this).data("resizable"), o = self.options;
                              if (self.ghost && self.helper) self.helper.get(0).removeChild(self.ghost.get(0));
                            }
                            
                          });
                          
                          $.ui.plugin.add("resizable", "grid", {
                            
                            resize: function(event, ui) {
                              var self = $(this).data("resizable"), o = self.options, cs = self.size, os = self.originalSize, op = self.originalPosition, a = self.axis, ratio = o._aspectRatio || event.shiftKey;
                              o.grid = typeof o.grid == "number" ? [o.grid, o.grid] : o.grid;
                              var ox = Math.round((cs.width - os.width) / (o.grid[0]||1)) * (o.grid[0]||1), oy = Math.round((cs.height - os.height) / (o.grid[1]||1)) * (o.grid[1]||1);
                              
                              if (/^(se|s|e)$/.test(a)) {
                                self.size.width = os.width + ox;
                                self.size.height = os.height + oy;
                              }
                              else if (/^(ne)$/.test(a)) {
                                self.size.width = os.width + ox;
                                self.size.height = os.height + oy;
                                self.position.top = op.top - oy;
                              }
                              else if (/^(sw)$/.test(a)) {
                                self.size.width = os.width + ox;
                                self.size.height = os.height + oy;
                                self.position.left = op.left - ox;
                              }
                              else {
                                self.size.width = os.width + ox;
                                self.size.height = os.height + oy;
                                self.position.top = op.top - oy;
                                self.position.left = op.left - ox;
                              }
                            }
                            
                          });
                          
                          var num = function(v) {
                            return parseInt(v, 10) || 0;
                          };
                          
                          var isNumber = function(value) {
                            return !isNaN(parseInt(value, 10));
                          };
                          
                          })(jQuery);
                          
                          /*
                          * jQuery UI Selectable 1.8.2
                          *
                          * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
                          * Dual licensed under the MIT (MIT-LICENSE.txt)
                          * and GPL (GPL-LICENSE.txt) licenses.
                          *
                          * http://docs.jquery.com/UI/Selectables
                          *
                          * Depends:
                          *  jquery.ui.core.js
                          *  jquery.ui.mouse.js
                          *  jquery.ui.widget.js
                          */
                          (function($) {
                            
                            $.widget("ui.selectable", $.ui.mouse, {
                              options: {
                                appendTo: 'body',
                                     autoRefresh: true,
                                     distance: 0,
                                     filter: '*',
                                     tolerance: 'touch'
                              },
                                     _create: function() {
                                       var self = this;
                                       
                                       this.element.addClass("ui-selectable");
                                       
                                       this.dragged = false;
                                       
                                       // cache selectee children based on filter
                                       var selectees;
                                       this.refresh = function() {
                                         selectees = $(self.options.filter, self.element[0]);
                                         selectees.each(function() {
                                           var $this = $(this);
                                           var pos = $this.offset();
                                           $.data(this, "selectable-item", {
                                             element: this,
                                                  $element: $this,
                                                  left: pos.left,
                                                  top: pos.top,
                                                  right: pos.left + $this.outerWidth(),
                                                  bottom: pos.top + $this.outerHeight(),
                                                  startselected: false,
                                                  selected: $this.hasClass('ui-selected'),
                                                  selecting: $this.hasClass('ui-selecting'),
                                                  unselecting: $this.hasClass('ui-unselecting')
                                           });
                                         });
                                       };
                                       this.refresh();
                                       
                                       this.selectees = selectees.addClass("ui-selectee");
                                       
                                       this._mouseInit();
                                       
                                       this.helper = $("<div class='ui-selectable-helper'></div>");
                                     },
                           
                           destroy: function() {
                             this.selectees
                             .removeClass("ui-selectee")
                             .removeData("selectable-item");
                             this.element
                             .removeClass("ui-selectable ui-selectable-disabled")
                             .removeData("selectable")
                             .unbind(".selectable");
                             this._mouseDestroy();
                             
                             return this;
                           },
                           
                           _mouseStart: function(event) {
                             var self = this;
                             
                             this.opos = [event.pageX, event.pageY];
                             
                             if (this.options.disabled)
                               return;
                             
                             var options = this.options;
                             
                             this.selectees = $(options.filter, this.element[0]);
                             
                             this._trigger("start", event);
                             
                             $(options.appendTo).append(this.helper);
                             // position helper (lasso)
                             this.helper.css({
                               "z-index": 100,
                                             "position": "absolute",
                                             "left": event.clientX,
                                             "top": event.clientY,
                                             "width": 0,
                                             "height": 0
                             });
                             
                             if (options.autoRefresh) {
                               this.refresh();
                             }
                             
                             this.selectees.filter('.ui-selected').each(function() {
                               var selectee = $.data(this, "selectable-item");
                               selectee.startselected = true;
                               if (!event.metaKey) {
                                 selectee.$element.removeClass('ui-selected');
                                 selectee.selected = false;
                                 selectee.$element.addClass('ui-unselecting');
                                 selectee.unselecting = true;
                                 // selectable UNSELECTING callback
                                 self._trigger("unselecting", event, {
                                   unselecting: selectee.element
                                 });
                               }
                             });
                             
                             $(event.target).parents().andSelf().each(function() {
                               var selectee = $.data(this, "selectable-item");
                               if (selectee) {
                                 var doSelect = !event.metaKey || !selectee.$element.hasClass('ui-selected');
                                 selectee.$element
                                 .removeClass(doSelect ? "ui-unselecting" : "ui-selected")
                                 .addClass(doSelect ? "ui-selecting" : "ui-unselecting");
                                 selectee.unselecting = !doSelect;
                                 selectee.selecting = doSelect;
                                 selectee.selected = doSelect;
                                 // selectable (UN)SELECTING callback
                                 if (doSelect) {
                                   self._trigger("selecting", event, {
                                     selecting: selectee.element
                                   });
                                 } else {
                                   self._trigger("unselecting", event, {
                                     unselecting: selectee.element
                                   });
                                 }
                                 return false;
                               }
                             });
                             
                           },
                           
                           _mouseDrag: function(event) {
                             var self = this;
                             this.dragged = true;
                             
                             if (this.options.disabled)
                               return;
                             
                             var options = this.options;
                             
                             var x1 = this.opos[0], y1 = this.opos[1], x2 = event.pageX, y2 = event.pageY;
                             if (x1 > x2) { var tmp = x2; x2 = x1; x1 = tmp; }
                             if (y1 > y2) { var tmp = y2; y2 = y1; y1 = tmp; }
                             this.helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1});
                             
                             this.selectees.each(function() {
                               var selectee = $.data(this, "selectable-item");
                               //prevent helper from being selected if appendTo: selectable
                               if (!selectee || selectee.element == self.element[0])
                                 return;
                               var hit = false;
                               if (options.tolerance == 'touch') {
                               hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );
                             } else if (options.tolerance == 'fit') {
                               hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);
                             }
                             
                             if (hit) {
                               // SELECT
                               if (selectee.selected) {
                                 selectee.$element.removeClass('ui-selected');
                                 selectee.selected = false;
                               }
                               if (selectee.unselecting) {
                                 selectee.$element.removeClass('ui-unselecting');
                                 selectee.unselecting = false;
                               }
                               if (!selectee.selecting) {
                                 selectee.$element.addClass('ui-selecting');
                                 selectee.selecting = true;
                                 // selectable SELECTING callback
                                 self._trigger("selecting", event, {
                                   selecting: selectee.element
                                 });
                               }
                             } else {
                               // UNSELECT
                               if (selectee.selecting) {
                                 if (event.metaKey && selectee.startselected) {
                                   selectee.$element.removeClass('ui-selecting');
                                   selectee.selecting = false;
                                   selectee.$element.addClass('ui-selected');
                                   selectee.selected = true;
                                 } else {
                                   selectee.$element.removeClass('ui-selecting');
                                   selectee.selecting = false;
                                   if (selectee.startselected) {
                                     selectee.$element.addClass('ui-unselecting');
                                     selectee.unselecting = true;
                                   }
                                   // selectable UNSELECTING callback
                                   self._trigger("unselecting", event, {
                                     unselecting: selectee.element
                                   });
                                 }
                               }
                               if (selectee.selected) {
                                 if (!event.metaKey && !selectee.startselected) {
                                   selectee.$element.removeClass('ui-selected');
                                   selectee.selected = false;
                                   
                                   selectee.$element.addClass('ui-unselecting');
                                   selectee.unselecting = true;
                                   // selectable UNSELECTING callback
                                   self._trigger("unselecting", event, {
                                     unselecting: selectee.element
                                   });
                                 }
                               }
                             }
                             });
                             
                             return false;
                           },
                           
                           _mouseStop: function(event) {
                             var self = this;
                             
                             this.dragged = false;
                             
                             var options = this.options;
                             
                             $('.ui-unselecting', this.element[0]).each(function() {
                               var selectee = $.data(this, "selectable-item");
                               selectee.$element.removeClass('ui-unselecting');
                               selectee.unselecting = false;
                               selectee.startselected = false;
                               self._trigger("unselected", event, {
                                 unselected: selectee.element
                               });
                             });
                             $('.ui-selecting', this.element[0]).each(function() {
                               var selectee = $.data(this, "selectable-item");
                               selectee.$element.removeClass('ui-selecting').addClass('ui-selected');
                               selectee.selecting = false;
                               selectee.selected = true;
                               selectee.startselected = true;
                               self._trigger("selected", event, {
                                 selected: selectee.element
                               });
                             });
                             this._trigger("stop", event);
                             
                             this.helper.remove();
                             
                             return false;
                           }
                           
                            });
                            
                            $.extend($.ui.selectable, {
                              version: "1.8.2"
                            });
                            
                          })(jQuery);
                          /*
                          * jQuery UI Sortable 1.8.2
                          *
                          * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
                          * Dual licensed under the MIT (MIT-LICENSE.txt)
                          * and GPL (GPL-LICENSE.txt) licenses.
                          *
                          * http://docs.jquery.com/UI/Sortables
                          *
                          * Depends:
                          *  jquery.ui.core.js
                          *  jquery.ui.mouse.js
                          *  jquery.ui.widget.js
                          */
                          (function($) {
                            
                            $.widget("ui.sortable", $.ui.mouse, {
                              widgetEventPrefix: "sort",
                                     options: {
                                       appendTo: "parent",
                                     axis: false,
                                     connectWith: false,
                                     containment: false,
                                     cursor: 'auto',
                                     cursorAt: false,
                                     dropOnEmpty: true,
                                     forcePlaceholderSize: false,
                                       forceHelperSize: false,
                                         grid: false,
                                     handle: false,
                                     helper: "original",
                                     items: '> *',
                                     opacity: false,
                                     placeholder: false,
                                     revert: false,
                                     scroll: true,
                                     scrollSensitivity: 20,
                                     scrollSpeed: 20,
                                     scope: "default",
                                     tolerance: "intersect",
                                     zIndex: 1000
                                     },
                                     _create: function() {
                                       
                                       var o = this.options;
                                       this.containerCache = {};
                                       this.element.addClass("ui-sortable");
                                       
                                       //Get the items
                                       this.refresh();
                                       
                                       //Let's determine if the items are floating
                                       this.floating = this.items.length ? (/left|right/).test(this.items[0].item.css('float')) : false;
                                       
                                       //Let's determine the parent's offset
                                       this.offset = this.element.offset();
                                       
                                       //Initialize mouse events for interaction
                                       this._mouseInit();
                                       
                                     },
                                                                            
                                                                            destroy: function() {
                                                                              this.element
                                                                              .removeClass("ui-sortable ui-sortable-disabled")
                                                                              .removeData("sortable")
                                                                              .unbind(".sortable");
                                                                              this._mouseDestroy();
                                                                              
                                                                              for ( var i = this.items.length - 1; i >= 0; i-- )
                                                                                this.items[i].item.removeData("sortable-item");
                                                                              
                                                                              return this;
                                                                            },
                                                                            
                                                                            _setOption: function(key, value){
                                                                              if ( key === "disabled" ) {
                                                                                this.options[ key ] = value;
                                                                                
                                                                                this.widget()
                                                                                [ value ? "addClass" : "removeClass"]( "ui-sortable-disabled" );
                                                                              } else {
                                                                                // Don't call widget base _setOption for disable as it adds ui-state-disabled class
                                                                                $.Widget.prototype._setOption.apply(this, arguments);
                                                                              }
                                                                            },
                                                                            
                                                                            _mouseCapture: function(event, overrideHandle) {
                                                                              
                                                                              if (this.reverting) {
                                                                                return false;
                                                                              }
                                                                              
                                                                              if(this.options.disabled || this.options.type == 'static') return false;
                                                                              
                                                                              //We have to refresh the items data once first
                                                                              this._refreshItems(event);
                                                                              
                                                                              //Find out if the clicked node (or one of its parents) is a actual item in this.items
                                                                              var currentItem = null, self = this, nodes = $(event.target).parents().each(function() {
                                                                                if($.data(this, 'sortable-item') == self) {
                                                                                  currentItem = $(this);
                                                                                  return false;
                                                                                }
                                                                              });
                                                                              if($.data(event.target, 'sortable-item') == self) currentItem = $(event.target);
                                                                              
                                                                              if(!currentItem) return false;
                                                                              if(this.options.handle && !overrideHandle) {
                                                                                var validHandle = false;
                                                                                
                                                                                $(this.options.handle, currentItem).find("*").andSelf().each(function() { if(this == event.target) validHandle = true; });
                                                                                if(!validHandle) return false;
                                                                              }
                                                                              
                                                                              this.currentItem = currentItem;
                                                                              this._removeCurrentsFromItems();
                                                                              return true;
                                                                              
                                                                            },
                                                                            
                                                                            _mouseStart: function(event, overrideHandle, noActivation) {
                                                                              
                                                                              var o = this.options, self = this;
                                                                              this.currentContainer = this;
                                                                              
                                                                              //We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
                                                                              this.refreshPositions();
                                                                              
                                                                              //Create and append the visible helper
                                                                              this.helper = this._createHelper(event);
                                                                              
                                                                              //Cache the helper size
                                                                              this._cacheHelperProportions();
                                                                              
                                                                              /*
                                                                              * - Position generation -
                                                                              * This block generates everything position related - it's the core of draggables.
                                                                              */
                                                                              
                                                                              //Cache the margins of the original element
                                                                              this._cacheMargins();
                                                                              
                                                                              //Get the next scrolling parent
                                                                              this.scrollParent = this.helper.scrollParent();
                                                                              
                                                                              //The element's absolute position on the page minus margins
                                                                              this.offset = this.currentItem.offset();
                                                                              this.offset = {
                                                                                top: this.offset.top - this.margins.top,
                                                                            left: this.offset.left - this.margins.left
                                                                              };
                                                                              
                                                                              // Only after we got the offset, we can change the helper's position to absolute
                                                                              // TODO: Still need to figure out a way to make relative sorting possible
                                                                              this.helper.css("position", "absolute");
                                                                              this.cssPosition = this.helper.css("position");
                                                                              
                                                                              $.extend(this.offset, {
                                                                                click: { //Where the click happened, relative to the element
                                                                                left: event.pageX - this.offset.left,
                                                                                       top: event.pageY - this.offset.top
                                                                                },
                                                                                       parent: this._getParentOffset(),
                                                                                       relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
                                                                              });
                                                                              
                                                                              //Generate the original position
                                                                              this.originalPosition = this._generatePosition(event);
                                                                              this.originalPageX = event.pageX;
                                                                              this.originalPageY = event.pageY;
                                                                              
                                                                              //Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
                                                                              (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
                                                                              
                                                                              //Cache the former DOM position
                                                                              this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };
                                                                              
                                                                              //If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way
                                                                              if(this.helper[0] != this.currentItem[0]) {
                                                                                this.currentItem.hide();
                                                                              }
                                                                              
                                                                              //Create the placeholder
                                                                              this._createPlaceholder();
                                                                              
                                                                              //Set a containment if given in the options
                                                                              if(o.containment)
                                                                                this._setContainment();
                                                                              
                                                                              if(o.cursor) { // cursor option
                                                                                if ($('body').css("cursor")) this._storedCursor = $('body').css("cursor");
                                                                                $('body').css("cursor", o.cursor);
                                                                              }
                                                                              
                                                                              if(o.opacity) { // opacity option
                                                                                if (this.helper.css("opacity")) this._storedOpacity = this.helper.css("opacity");
                                                                                this.helper.css("opacity", o.opacity);
                                                                              }
                                                                              
                                                                              if(o.zIndex) { // zIndex option
                                                                                if (this.helper.css("zIndex")) this._storedZIndex = this.helper.css("zIndex");
                                                                                this.helper.css("zIndex", o.zIndex);
                                                                              }
                                                                              
                                                                              //Prepare scrolling
                                                                              if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML')
                                                                              this.overflowOffset = this.scrollParent.offset();
                                                                              
                                                                              //Call callbacks
                                                                              this._trigger("start", event, this._uiHash());
                                                                              
                                                                              //Recache the helper size
                                                                              if(!this._preserveHelperProportions)
                                                                                this._cacheHelperProportions();
                                                                              
                                                                              
                                                                              //Post 'activate' events to possible containers
                                                                              if(!noActivation) {
                                                                                for (var i = this.containers.length - 1; i >= 0; i--) { this.containers[i]._trigger("activate", event, self._uiHash(this)); }
                                                                              }
                                                                              
                                                                              //Prepare possible droppables
                                                                              if($.ui.ddmanager)
                                                                                $.ui.ddmanager.current = this;
                                                                              
                                                                              if ($.ui.ddmanager && !o.dropBehaviour)
                                                                                $.ui.ddmanager.prepareOffsets(this, event);
                                                                              
                                                                              this.dragging = true;
                                                                              
                                                                              this.helper.addClass("ui-sortable-helper");
                                                                              this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position
                          return true;
                          
                                                                            },
                           
                           _mouseDrag: function(event) {
                             
                             //Compute the helpers position
                             this.position = this._generatePosition(event);
                             this.positionAbs = this._convertPositionTo("absolute");
                             
                             if (!this.lastPositionAbs) {
                               this.lastPositionAbs = this.positionAbs;
                             }
                             
                             //Do scrolling
                             if(this.options.scroll) {
                               var o = this.options, scrolled = false;
                               if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML') {
                                 
                                 if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
                                   this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
                                 else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity)
                                   this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
                                 
                                 if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
                                   this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
                                 else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity)
                                   this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
                                 
                               } else {
                                 
                                 if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
                                   scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
                                 else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
                                   scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
                                 
                                 if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
                                   scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
                                 else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
                                   scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
                                 
                               }
                               
                               if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
                                 $.ui.ddmanager.prepareOffsets(this, event);
                             }
                             
                             //Regenerate the absolute position used for position checks
                             this.positionAbs = this._convertPositionTo("absolute");
                             
                             //Set the helper position
                             if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
                             if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
                             
                             //Rearrange
                             for (var i = this.items.length - 1; i >= 0; i--) {
                               
                               //Cache variables and intersection, continue if no intersection
                               var item = this.items[i], itemElement = item.item[0], intersection = this._intersectsWithPointer(item);
                               if (!intersection) continue;
                               
                               if(itemElement != this.currentItem[0] //cannot intersect with itself
                                 &&  this.placeholder[intersection == 1 ? "next" : "prev"]()[0] != itemElement //no useless actions that have been done before
                                 &&  !$.ui.contains(this.placeholder[0], itemElement) //no action if the item moved is the parent of the item checked
                                 && (this.options.type == 'semi-dynamic' ? !$.ui.contains(this.element[0], itemElement) : true)
                                 //&& itemElement.parentNode == this.placeholder[0].parentNode // only rearrange items within the same container
                                 ) {
                                 
                                 this.direction = intersection == 1 ? "down" : "up";
                               
                               if (this.options.tolerance == "pointer" || this._intersectsWithSides(item)) {
                                 this._rearrange(event, item);
                               } else {
                                 break;
                               }
                               
                               this._trigger("change", event, this._uiHash());
                               break;
                               }
                             }
                             
                             //Post events to containers
                             this._contactContainers(event);
                             
                             //Interconnect with droppables
                             if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
                             
                             //Call callbacks
                             this._trigger('sort', event, this._uiHash());
                             
                             this.lastPositionAbs = this.positionAbs;
                             return false;
                             
                           },
                           
                           _mouseStop: function(event, noPropagation) {
                             
                             if(!event) return;
                             
                             //If we are using droppables, inform the manager about the drop
                             if ($.ui.ddmanager && !this.options.dropBehaviour)
                               $.ui.ddmanager.drop(this, event);
                             
                             if(this.options.revert) {
                               var self = this;
                               var cur = self.placeholder.offset();
                               
                               self.reverting = true;
                               
                               $(this.helper).animate({
                                 left: cur.left - this.offset.parent.left - self.margins.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft),
                                                      top: cur.top - this.offset.parent.top - self.margins.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop)
                               }, parseInt(this.options.revert, 10) || 500, function() {
                                 self._clear(event);
                               });
                             } else {
                               this._clear(event, noPropagation);
                             }
                             
                             return false;
                             
                           },
                           
                           cancel: function() {
                             
                             var self = this;
                             
                             if(this.dragging) {
                               
                               this._mouseUp();
                               
                               if(this.options.helper == "original")
                               this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
                               else
                                 this.currentItem.show();
                               
                               //Post deactivating events to containers
                               for (var i = this.containers.length - 1; i >= 0; i--){
                                 this.containers[i]._trigger("deactivate", null, self._uiHash(this));
                                 if(this.containers[i].containerCache.over) {
                                   this.containers[i]._trigger("out", null, self._uiHash(this));
                                   this.containers[i].containerCache.over = 0;
                                 }
                               }
                               
                             }
                             
                             //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
                             if(this.placeholder[0].parentNode) this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
                             if(this.options.helper != "original" && this.helper && this.helper[0].parentNode) this.helper.remove();
                             
                             $.extend(this, {
                               helper: null,
                                      dragging: false,
                                      reverting: false,
                                      _noFinalSort: null
                             });
                             
                             if(this.domPosition.prev) {
                               $(this.domPosition.prev).after(this.currentItem);
                             } else {
                               $(this.domPosition.parent).prepend(this.currentItem);
                             }
                             
                             return this;
                             
                           },
                           
                           serialize: function(o) {
                             
                             var items = this._getItemsAsjQuery(o && o.connected);
                             var str = []; o = o || {};
                             
                             $(items).each(function() {
                               var res = ($(o.item || this).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/));
                               if(res) str.push((o.key || res[1]+'[]')+'='+(o.key && o.expression ? res[1] : res[2]));
                             });
                             
                             return str.join('&');
                             
                           },
                           
                           toArray: function(o) {
                             
                             var items = this._getItemsAsjQuery(o && o.connected);
                             var ret = []; o = o || {};
                             
                             items.each(function() { ret.push($(o.item || this).attr(o.attribute || 'id') || ''); });
                             return ret;
                             
                           },
                           
                           /* Be careful with the following core functions */
                           _intersectsWith: function(item) {
                             
                             var x1 = this.positionAbs.left,
                             x2 = x1 + this.helperProportions.width,
                             y1 = this.positionAbs.top,
                             y2 = y1 + this.helperProportions.height;
                             
                             var l = item.left,
                             r = l + item.width,
                             t = item.top,
                             b = t + item.height;
                             
                             var dyClick = this.offset.click.top,
                             dxClick = this.offset.click.left;
                             
                             var isOverElement = (y1 + dyClick) > t && (y1 + dyClick) < b && (x1 + dxClick) > l && (x1 + dxClick) < r;
                             
                             if(    this.options.tolerance == "pointer"
                               || this.options.forcePointerForContainers
                               || (this.options.tolerance != "pointer" && this.helperProportions[this.floating ? 'width' : 'height'] > item[this.floating ? 'width' : 'height'])
                               ) {
                               return isOverElement;
                             } else {
                               
                               return (l < x1 + (this.helperProportions.width / 2) // Right Half
                               && x2 - (this.helperProportions.width / 2) < r // Left Half
                               && t < y1 + (this.helperProportions.height / 2) // Bottom Half
                               && y2 - (this.helperProportions.height / 2) < b ); // Top Half
                               
                             }
                           },
                           
                           _intersectsWithPointer: function(item) {
                             
                             var isOverElementHeight = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
                             isOverElementWidth = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
                             isOverElement = isOverElementHeight && isOverElementWidth,
                             verticalDirection = this._getDragVerticalDirection(),
                             horizontalDirection = this._getDragHorizontalDirection();
                             
                             if (!isOverElement)
                               return false;
                             
                             return this.floating ?
                             ( ((horizontalDirection && horizontalDirection == "right") || verticalDirection == "down") ? 2 : 1 )
                             : ( verticalDirection && (verticalDirection == "down" ? 2 : 1) );
                             
                           },
                           
                           _intersectsWithSides: function(item) {
                             
                             var isOverBottomHalf = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),
                             isOverRightHalf = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),
                             verticalDirection = this._getDragVerticalDirection(),
                             horizontalDirection = this._getDragHorizontalDirection();
                             
                             if (this.floating && horizontalDirection) {
                               return ((horizontalDirection == "right" && isOverRightHalf) || (horizontalDirection == "left" && !isOverRightHalf));
                             } else {
                               return verticalDirection && ((verticalDirection == "down" && isOverBottomHalf) || (verticalDirection == "up" && !isOverBottomHalf));
                             }
                             
                           },
                           
                           _getDragVerticalDirection: function() {
                             var delta = this.positionAbs.top - this.lastPositionAbs.top;
                             return delta != 0 && (delta > 0 ? "down" : "up");
                           },
                           
                           _getDragHorizontalDirection: function() {
                             var delta = this.positionAbs.left - this.lastPositionAbs.left;
                             return delta != 0 && (delta > 0 ? "right" : "left");
                           },
                           
                           refresh: function(event) {
                             this._refreshItems(event);
                             this.refreshPositions();
                             return this;
                           },
                           
                           _connectWith: function() {
                             var options = this.options;
                             return options.connectWith.constructor == String
                             ? [options.connectWith]
                             : options.connectWith;
                           },
                           
                           _getItemsAsjQuery: function(connected) {
                             
                             var self = this;
                             var items = [];
                             var queries = [];
                             var connectWith = this._connectWith();
                             
                             if(connectWith && connected) {
                               for (var i = connectWith.length - 1; i >= 0; i--){
                                 var cur = $(connectWith[i]);
                                 for (var j = cur.length - 1; j >= 0; j--){
                                   var inst = $.data(cur[j], 'sortable');
                                   if(inst && inst != this && !inst.options.disabled) {
                                     queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), inst]);
                                   }
                                 };
                               };
                             }
                             
                             queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), this]);
                             
                             for (var i = queries.length - 1; i >= 0; i--){
                               queries[i][0].each(function() {
                                 items.push(this);
                               });
                             };
                             
                             return $(items);
                             
                           },
                                          
                                          _removeCurrentsFromItems: function() {
                                            
                                            var list = this.currentItem.find(":data(sortable-item)");
                                            
                                            for (var i=0; i < this.items.length; i++) {
                                              
                                              for (var j=0; j < list.length; j++) {
                                                if(list[j] == this.items[i].item[0])
                                                  this.items.splice(i,1);
                                              };
                                              
                                            };
                                            
                                          },
                                          
                                          _refreshItems: function(event) {
                                            
                                            this.items = [];
                                            this.containers = [this];
                                            var items = this.items;
                                            var self = this;
                                            var queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]];
                                            var connectWith = this._connectWith();
                                            
                                            if(connectWith) {
                                              for (var i = connectWith.length - 1; i >= 0; i--){
                                                var cur = $(connectWith[i]);
                                                for (var j = cur.length - 1; j >= 0; j--){
                                                  var inst = $.data(cur[j], 'sortable');
                                                  if(inst && inst != this && !inst.options.disabled) {
                                                    queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);
                                                    this.containers.push(inst);
                                                  }
                                                };
                                              };
                                            }
                                            
                                            for (var i = queries.length - 1; i >= 0; i--) {
                                              var targetData = queries[i][1];
                                              var _queries = queries[i][0];
                                              
                                              for (var j=0, queriesLength = _queries.length; j < queriesLength; j++) {
                                                var item = $(_queries[j]);
                                                
                                                item.data('sortable-item', targetData); // Data for target checking (mouse manager)
                             
                             items.push({
                               item: item,
                                        instance: targetData,
                                        width: 0, height: 0,
                                        left: 0, top: 0
                             });
                                              };
                                            };
                                            
                                          },
                                          
                                          refreshPositions: function(fast) {
                                            
                                            //This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change
                                            if(this.offsetParent && this.helper) {
                                              this.offset.parent = this._getParentOffset();
                                            }
                                            
                                            for (var i = this.items.length - 1; i >= 0; i--){
                                              var item = this.items[i];
                                              
                                              var t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;
                                              
                                              if (!fast) {
                                                item.width = t.outerWidth();
                                                item.height = t.outerHeight();
                                              }
                                              
                                              var p = t.offset();
                                              item.left = p.left;
                                              item.top = p.top;
                                            };
                                            
                                            if(this.options.custom && this.options.custom.refreshContainers) {
                                              this.options.custom.refreshContainers.call(this);
                                            } else {
                                              for (var i = this.containers.length - 1; i >= 0; i--){
                                                var p = this.containers[i].element.offset();
                                                this.containers[i].containerCache.left = p.left;
                                                this.containers[i].containerCache.top = p.top;
                                                this.containers[i].containerCache.width = this.containers[i].element.outerWidth();
                                                this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
                                              };
                                            }
                                            
                                            return this;
                                          },
                                          
                                          _createPlaceholder: function(that) {
                                            
                                            var self = that || this, o = self.options;
                                            
                                            if(!o.placeholder || o.placeholder.constructor == String) {
                                              var className = o.placeholder;
                                              o.placeholder = {
                                                element: function() {
                                                  
                                                  var el = $(document.createElement(self.currentItem[0].nodeName))
                                                  .addClass(className || self.currentItem[0].className+" ui-sortable-placeholder")
                                                  .removeClass("ui-sortable-helper")[0];
                                                  
                                                  if(!className)
                                                    el.style.visibility = "hidden";
                                                  
                                                  return el;
                                                },
                                          update: function(container, p) {
                                            
                                            // 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that
                                            // 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified
                                            if(className && !o.forcePlaceholderSize) return;
                                            
                                            //If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item
                                            if(!p.height()) { p.height(self.currentItem.innerHeight() - parseInt(self.currentItem.css('paddingTop')||0, 10) - parseInt(self.currentItem.css('paddingBottom')||0, 10)); };
                                            if(!p.width()) { p.width(self.currentItem.innerWidth() - parseInt(self.currentItem.css('paddingLeft')||0, 10) - parseInt(self.currentItem.css('paddingRight')||0, 10)); };
                                          }
                                              };
                                            }
                                            
                                            //Create the placeholder
                                            self.placeholder = $(o.placeholder.element.call(self.element, self.currentItem));
                                            
                                            //Append it after the actual current item
                                            self.currentItem.after(self.placeholder);
                                            
                                            //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
                                            o.placeholder.update(self, self.placeholder);
                                            
                                          },
                                                                       
                                                                       _contactContainers: function(event) {
                                                                         
                                                                         // get innermost container that intersects with item 
                                                                         var innermostContainer = null, innermostIndex = null;   
                                                                         
                                                                         
                                                                         for (var i = this.containers.length - 1; i >= 0; i--){
                                                                           
                                                                           // never consider a container that's located within the item itself 
                                                                           if($.ui.contains(this.currentItem[0], this.containers[i].element[0]))
                                                                             continue;
                                                                           
                                                                           if(this._intersectsWith(this.containers[i].containerCache)) {
                                                                             
                                                                             // if we've already found a container and it's more "inner" than this, then continue 
                                                                             if(innermostContainer && $.ui.contains(this.containers[i].element[0], innermostContainer.element[0]))
                                                                               continue;
                                                                             
                                                                             innermostContainer = this.containers[i]; 
                                                                             innermostIndex = i;
                                                                             
                                                                           } else {
                                                                             // container doesn't intersect. trigger "out" event if necessary 
                                                                             if(this.containers[i].containerCache.over) {
                                                                               this.containers[i]._trigger("out", event, this._uiHash(this));
                                                                               this.containers[i].containerCache.over = 0;
                                                                             }
                                                                           }
                                                                           
                                                                         }
                                                                         
                                                                         // if no intersecting containers found, return 
                                                                         if(!innermostContainer) return; 
                                                                         
                                                                         // move the item into the container if it's not there already
                                                                         if(this.containers.length === 1) {
                                                                           this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
                                                                           this.containers[innermostIndex].containerCache.over = 1;
                                                                         } else if(this.currentContainer != this.containers[innermostIndex]) { 
                                                                           
                                                                           //When entering a new container, we will find the item with the least distance and append our item near it 
                                                                           var dist = 10000; var itemWithLeastDistance = null; var base = this.positionAbs[this.containers[innermostIndex].floating ? 'left' : 'top']; 
                                                                           for (var j = this.items.length - 1; j >= 0; j--) { 
                                                                             if(!$.ui.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) continue; 
                                                                             var cur = this.items[j][this.containers[innermostIndex].floating ? 'left' : 'top']; 
                                                                             if(Math.abs(cur - base) < dist) { 
                                                                               dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j]; 
                                                                             } 
                                                                           } 
                                                                           
                                                                           if(!itemWithLeastDistance && !this.options.dropOnEmpty) //Check if dropOnEmpty is enabled 
                                                                             return; 
                                                                           
                                                                           this.currentContainer = this.containers[innermostIndex]; 
                                                                           itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true); 
                                                                           this._trigger("change", event, this._uiHash()); 
                                                                           this.containers[innermostIndex]._trigger("change", event, this._uiHash(this)); 
                                                                           
                                                                           //Update the placeholder 
                                                                           this.options.placeholder.update(this.currentContainer, this.placeholder); 
                                                                           
                                                                           this.containers[innermostIndex]._trigger("over", event, this._uiHash(this)); 
                                                                           this.containers[innermostIndex].containerCache.over = 1;
                                                                         } 
                                                                         
                                                                         
                                                                       },
                                          
                                          _createHelper: function(event) {
                                            
                                            var o = this.options;
                                            var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper == 'clone' ? this.currentItem.clone() : this.currentItem);
                                            
                                            if(!helper.parents('body').length) //Add the helper to the DOM if that didn't happen already
                                              $(o.appendTo != 'parent' ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);
                                            
                                            if(helper[0] == this.currentItem[0])
                                              this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") };
                                            
                                            if(helper[0].style.width == '' || o.forceHelperSize) helper.width(this.currentItem.width());
                                            if(helper[0].style.height == '' || o.forceHelperSize) helper.height(this.currentItem.height());
                                            
                                            return helper;
                                            
                                          },
                                          
                                          _adjustOffsetFromHelper: function(obj) {
                                            if (typeof obj == 'string') {
                                              obj = obj.split(' ');
                                            }
                                            if ($.isArray(obj)) {
                                              obj = {left: +obj[0], top: +obj[1] || 0};
                                            }
                                            if ('left' in obj) {
                                              this.offset.click.left = obj.left + this.margins.left;
                                            }
                                            if ('right' in obj) {
                                              this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
                                            }
                                            if ('top' in obj) {
                                              this.offset.click.top = obj.top + this.margins.top;
                                            }
                                            if ('bottom' in obj) {
                                              this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
                                            }
                                          },
                                          
                                          _getParentOffset: function() {
                                            
                                            
                                            //Get the offsetParent and cache its position
                                            this.offsetParent = this.helper.offsetParent();
                                            var po = this.offsetParent.offset();
                                            
                                            // This is a special case where we need to modify a offset calculated on start, since the following happened:
                                            // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
                                            // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
                                            //    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
                                            if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) {
                                              po.left += this.scrollParent.scrollLeft();
                                              po.top += this.scrollParent.scrollTop();
                                            }
                                            
                                            if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
                                              || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix
                                              po = { top: 0, left: 0 };
                                            
                                            return {
                                              top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
                                              left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
                                            };
                                            
                                          },
                                          
                                          _getRelativeOffset: function() {
                                            
                                            if(this.cssPosition == "relative") {
                                              var p = this.currentItem.position();
                                              return {
                                                top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
                                                left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
                                              };
                                            } else {
                                              return { top: 0, left: 0 };
                                            }
                                            
                                          },
                                          
                                          _cacheMargins: function() {
                                            this.margins = {
                                              left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),
                                              top: (parseInt(this.currentItem.css("marginTop"),10) || 0)
                                            };
                                          },
                                          
                                          _cacheHelperProportions: function() {
                                            this.helperProportions = {
                                              width: this.helper.outerWidth(),
                                              height: this.helper.outerHeight()
                                            };
                                          },
                                          
                                          _setContainment: function() {
                                            
                                            var o = this.options;
                                            if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
                                            if(o.containment == 'document' || o.containment == 'window') this.containment = [
                                              0 - this.offset.relative.left - this.offset.parent.left,
                                              0 - this.offset.relative.top - this.offset.parent.top,
                                              $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
                                              ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
                                              ];
                                            
                                            if(!(/^(document|window|parent)$/).test(o.containment)) {
                                              var ce = $(o.containment)[0];
                                              var co = $(o.containment).offset();
                                              var over = ($(ce).css("overflow") != 'hidden');
                                              
                                              this.containment = [
                                              co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
                                                                  co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
                                                                  co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,
                                                                           co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top
                                                                           ];
                                            }
                                            
                                          },
                                                                  
                                                                  _convertPositionTo: function(d, pos) {
                                                                    
                                                                    if(!pos) pos = this.position;
                                                                    var mod = d == "absolute" ? 1 : -1;
                                                                    var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
                                                                    
                                                                    return {
                                                                      top: (
                                                                      pos.top                                 // The absolute mouse position
                                                                      + this.offset.relative.top * mod                    // Only for relative positioned nodes: Relative offset from element to offset parent
                                                                      + this.offset.parent.top * mod                      // The offsetParent's offset without borders (offset + border)
                                                                      - ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
                                                                      ),
                                                                                                                                       left: (
                                                                                                                                       pos.left                                // The absolute mouse position
                                                                                                                                       + this.offset.relative.left * mod                   // Only for relative positioned nodes: Relative offset from element to offset parent
                                                                                                                                       + this.offset.parent.left * mod                     // The offsetParent's offset without borders (offset + border)
                                                                                                                                       - ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
                                                                                                                                       )
                                                                    };
                                                                    
                                                                  },
                                                                                                                                       
                                                                                                                                       _generatePosition: function(event) {
                                                                                                                                         
                                                                                                                                         var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
                                                                                                                                         
                                                                                                                                         // This is another very weird special case that only happens for relative elements:
                                                                                                                                         // 1. If the css position is relative
                                                                                                                                         // 2. and the scroll parent is the document or similar to the offset parent
                                                                                                                                         // we have to refresh the relative offset during the scroll so there are no jumps
                                                                                                                                         if(this.cssPosition == 'relative' && !(this.scrollParent[0] != document && this.scrollParent[0] != this.offsetParent[0])) {
                                                                                                                                           this.offset.relative = this._getRelativeOffset();
                                                                                                                                         }
                                                                                                                                         
                                                                                                                                         var pageX = event.pageX;
                                                                                                                                         var pageY = event.pageY;
                                                                                                                                         
                                                                                                                                         /*
                                                                                                                                         * - Position constraining -
                                                                                                                                         * Constrain the position to a mix of grid, containment.
                                                                                                                                         */
                                                                                                                                         
                                                                                                                                         if(this.originalPosition) { //If we are not dragging yet, we won't check for options
                                                                                                                                           
                                                                                                                                           if(this.containment) {
                                                                                                                                             if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left;
                                                                                                                                             if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top;
                                                                                                                                             if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left;
                                                                                                                                             if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top;
                                                                                                                                           }
                                                                                                                                           
                                                                                                                                           if(o.grid) {
                                                                                                                                             var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
                                                                                                                                             pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
                                                                                                                                             
                                                                                                                                             var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
                                                                                                                                             pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
                                                                                                                                           }
                                                                                                                                           
                                                                                                                                         }
                                                                                                                                         
                                                                                                                                         return {
                                                                                                                                           top: (
                                                                                                                                           pageY                               // The absolute mouse position
                                                                                                                                           - this.offset.click.top                         // Click offset (relative to the element)
                                                                                                                                           - this.offset.relative.top                        // Only for relative positioned nodes: Relative offset from element to offset parent
                                                                                                                                           - this.offset.parent.top                        // The offsetParent's offset without borders (offset + border)
                                                                                                                                           + ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
                                                                                                                                           ),
                                                                                                                                       left: (
                                                                                                                                       pageX                               // The absolute mouse position
                                                                                                                                       - this.offset.click.left                        // Click offset (relative to the element)
                                                                                                                                       - this.offset.relative.left                       // Only for relative positioned nodes: Relative offset from element to offset parent
                                                                                                                                       - this.offset.parent.left                       // The offsetParent's offset without borders (offset + border)
                                                                                                                                       + ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
                                                                                                                                       )
                                                                                                                                         };
                                                                                                                                         
                                                                                                                                       },
                                                                                                                                       
                                                                                                                                       _rearrange: function(event, i, a, hardRefresh) {
                                                                                                                                         
                                                                                                                                         a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction == 'down' ? i.item[0] : i.item[0].nextSibling));
                                                                                                                                         
                                                                                                                                         //Various things done here to improve the performance:
                                                                                                                                         // 1. we create a setTimeout, that calls refreshPositions
                                                                                                                                         // 2. on the instance, we have a counter variable, that get's higher after every append
                                                                                                                                         // 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
                                                                                                                                         // 4. this lets only the last addition to the timeout stack through
                                                                                                                                         this.counter = this.counter ? ++this.counter : 1;
                                                                                                                                         var self = this, counter = this.counter;
                                                                                                                                         
                                                                                                                                         window.setTimeout(function() {
                                                                                                                                           if(counter == self.counter) self.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
                                                                                                                                         },0);
                                                                                                                                         
                                                                                                                                       },
                                                                                                                                       
                                                                                                                                       _clear: function(event, noPropagation) {
                                                                                                                                         
                                                                                                                                         this.reverting = false;
                                                                                                                                         // We delay all events that have to be triggered to after the point where the placeholder has been removed and
                                                                                                                                         // everything else normalized again
                                                                                                                                         var delayedTriggers = [], self = this;
                                                                                                                                         
                                                                                                                                         // We first have to update the dom position of the actual currentItem
                                                                                                                                         // Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
                                                                                                                                         if(!this._noFinalSort && this.currentItem[0].parentNode) this.placeholder.before(this.currentItem);
                                                                                                                                         this._noFinalSort = null;
                                                                                                                                         
                                                                                                                                         if(this.helper[0] == this.currentItem[0]) {
                                                                                                                                           for(var i in this._storedCSS) {
                                                                                                                                             if(this._storedCSS[i] == 'auto' || this._storedCSS[i] == 'static') this._storedCSS[i] = '';
                                                                                                                                           }
                                                                                                                                           this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
                                                                                                                                         } else {
                                                                                                                                           this.currentItem.show();
                                                                                                                                         }
                                                                                                                                         
                                                                                                                                         if(this.fromOutside && !noPropagation) delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });
                                                                                                                                         if((this.fromOutside || this.domPosition.prev != this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent != this.currentItem.parent()[0]) && !noPropagation) delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed
                                                                                                                                           if(!$.ui.contains(this.element[0], this.currentItem[0])) { //Node was moved out of the current element
                                                                                                                                             if(!noPropagation) delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });
                                                                                                                                             for (var i = this.containers.length - 1; i >= 0; i--){
                                                                                                                                               if($.ui.contains(this.containers[i].element[0], this.currentItem[0]) && !noPropagation) {
                                                                                                                                                 delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
                                                                                                                                                 delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this));  }; }).call(this, this.containers[i]));
                                                                                                                                               }
                                                                                                                                             };
                                                                                                                                           };
                                                                                                                                           
                                                                                                                                           //Post events to containers
                                                                                                                                           for (var i = this.containers.length - 1; i >= 0; i--){
                                                                                                                                             if(!noPropagation) delayedTriggers.push((function(c) { return function(event) { c._trigger("deactivate", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
                                                                                                                                             if(this.containers[i].containerCache.over) {
                                                                                                                                               delayedTriggers.push((function(c) { return function(event) { c._trigger("out", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
                                                                                                                                               this.containers[i].containerCache.over = 0;
                                                                                                                                             }
                                                                                                                                           }
                                                                                                                                           
                                                                                                                                           //Do what was originally in plugins
                                                                                                                                           if(this._storedCursor) $('body').css("cursor", this._storedCursor); //Reset cursor
                                                                                                                                             if(this._storedOpacity) this.helper.css("opacity", this._storedOpacity); //Reset opacity
                                                                                                                                               if(this._storedZIndex) this.helper.css("zIndex", this._storedZIndex == 'auto' ? '' : this._storedZIndex); //Reset z-index
                                                                                                                                                 
                                                                                                                                                 this.dragging = false;
                                                                                                                                               if(this.cancelHelperRemoval) {
                                                                                                                                                 if(!noPropagation) {
                                                                                                                                                   this._trigger("beforeStop", event, this._uiHash());
                                                                                                                                                   for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
                                                                                                                                                     this._trigger("stop", event, this._uiHash());
                                                                                                                                                 }
                                                                                                                                                 return false;
                                                                                                                                               }
                                                                                                                                               
                                                                                                                                               if(!noPropagation) this._trigger("beforeStop", event, this._uiHash());
                                                                                                                                               
                                                                                                                                               //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
                                                                                                                                               this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
                                                                                                                                               
                                                                                                                                               if(this.helper[0] != this.currentItem[0]) this.helper.remove(); this.helper = null;
                                                                                                                                               
                                                                                                                                               if(!noPropagation) {
                                                                                                                                                 for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
                                                                                                                                                   this._trigger("stop", event, this._uiHash());
                                                                                                                                               }
                                                                                                                                               
                                                                                                                                               this.fromOutside = false;
                                                                                                                                               return true;
                                                                                                                                               
                                                                                                                                       },
                                                                                                                                             
                                                                                                                                             _trigger: function() {
                                                                                                                                               if ($.Widget.prototype._trigger.apply(this, arguments) === false) {
                                                                                                                                                 this.cancel();
                                                                                                                                               }
                                                                                                                                             },
                                                                                                                                             
                                                                                                                                             _uiHash: function(inst) {
                                                                                                                                               var self = inst || this;
                                                                                                                                               return {
                                                                                                                                                 helper: self.helper,
                                                                                                                                             placeholder: self.placeholder || $([]),
                                                                                                                                             position: self.position,
                                                                                                                                             originalPosition: self.originalPosition,
                                                                                                                                             offset: self.positionAbs,
                                                                                                                                             item: self.currentItem,
                                                                                                                                             sender: inst ? inst.element : null
                                                                                                                                               };
                                                                                                                                             }
                                                                                                                                             
                            });
                            
                            $.extend($.ui.sortable, {
                              version: "1.8.2"
                            });
                            
                          })(jQuery);
                          /*
                          * jQuery UI Effects 1.8.2
                          *
                          * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
                          * Dual licensed under the MIT (MIT-LICENSE.txt)
                          * and GPL (GPL-LICENSE.txt) licenses.
                          *
                          * http://docs.jquery.com/UI/Effects/
                          */
                          ;jQuery.effects || (function($) {
                            
                            $.effects = {};
                            
                            
                            
                            /******************************************************************************/
                            /****************************** COLOR ANIMATIONS ******************************/
                            /******************************************************************************/
                            
                            // override the animation for color styles
                            $.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor',
                                              'borderRightColor', 'borderTopColor', 'color', 'outlineColor'],
                                              function(i, attr) {
                                                $.fx.step[attr] = function(fx) {
                                                  if (!fx.colorInit) {
                                                    fx.start = getColor(fx.elem, attr);
                                                    fx.end = getRGB(fx.end);
                                                    fx.colorInit = true;
                                                  }
                                                  
                                                  fx.elem.style[attr] = 'rgb(' +
                                                  Math.max(Math.min(parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0], 10), 255), 0) + ',' +
                                                  Math.max(Math.min(parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1], 10), 255), 0) + ',' +
                                                  Math.max(Math.min(parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2], 10), 255), 0) + ')';
                                                };
                                              });
                                              
                                              // Color Conversion functions from highlightFade
                                              // By Blair Mitchelmore
                                              // http://jquery.offput.ca/highlightFade/
                                              
                                              // Parse strings looking for color tuples [255,255,255]
                                              function getRGB(color) {
                                                var result;
                                                
                                                // Check if we're already dealing with an array of colors
                                                if ( color && color.constructor == Array && color.length == 3 )
                                                  return color;
                                                
                                                // Look for rgb(num,num,num)
                                                if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color))
                                                  return [parseInt(result[1],10), parseInt(result[2],10), parseInt(result[3],10)];
                                                  
                                                  // Look for rgb(num%,num%,num%)
                                                  if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color))
                                                    return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55];
                                                  
                                                  // Look for #a0b1c2
                                                  if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color))
                                                    return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)];
                                                    
                                                    // Look for #fff
                                                    if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color))
                                                      return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)];
                                                    
                                                    // Look for rgba(0, 0, 0, 0) == transparent in Safari 3
                                                    if (result = /rgba\(0, 0, 0, 0\)/.exec(color))
                                                      return colors['transparent'];
                                                    
                                                    // Otherwise, we're most likely dealing with a named color
                                                    return colors[$.trim(color).toLowerCase()];
                                              }
                                              
                                              function getColor(elem, attr) {
                                                var color;
                                                
                                                do {
                                                  color = $.curCSS(elem, attr);
                                                  
                                                  // Keep going until we find an element that has color, or we hit the body
                                                  if ( color != '' && color != 'transparent' || $.nodeName(elem, "body") )
                                                    break;
                                                  
                                                  attr = "backgroundColor";
                                                } while ( elem = elem.parentNode );
                                                
                                                return getRGB(color);
                                              };
                                              
                                              // Some named colors to work with
                                              // From Interface by Stefan Petre
                                              // http://interface.eyecon.ro/
                                              
                                              var colors = {
                                                aqua:[0,255,255],
                                                    azure:[240,255,255],
                                                    beige:[245,245,220],
                                                    black:[0,0,0],
                                                    blue:[0,0,255],
                                                    brown:[165,42,42],
                                                    cyan:[0,255,255],
                                                    darkblue:[0,0,139],
                                                    darkcyan:[0,139,139],
                                                    darkgrey:[169,169,169],
                                                    darkgreen:[0,100,0],
                                                    darkkhaki:[189,183,107],
                                                    darkmagenta:[139,0,139],
                                                    darkolivegreen:[85,107,47],
                                                    darkorange:[255,140,0],
                                                    darkorchid:[153,50,204],
                                                    darkred:[139,0,0],
                                                    darksalmon:[233,150,122],
                                                    darkviolet:[148,0,211],
                                                    fuchsia:[255,0,255],
                                                    gold:[255,215,0],
                                                    green:[0,128,0],
                                                    indigo:[75,0,130],
                                                    khaki:[240,230,140],
                                                    lightblue:[173,216,230],
                                                    lightcyan:[224,255,255],
                                                    lightgreen:[144,238,144],
                                                    lightgrey:[211,211,211],
                                                    lightpink:[255,182,193],
                                                    lightyellow:[255,255,224],
                                                    lime:[0,255,0],
                                                    magenta:[255,0,255],
                                                    maroon:[128,0,0],
                                                    navy:[0,0,128],
                                                    olive:[128,128,0],
                                                    orange:[255,165,0],
                                                    pink:[255,192,203],
                                                    purple:[128,0,128],
                                                    violet:[128,0,128],
                                                    red:[255,0,0],
                                                    silver:[192,192,192],
                                                    white:[255,255,255],
                                                    yellow:[255,255,0],
                                                    transparent: [255,255,255]
                                              };
                                              
                                              
                                              
                                              /******************************************************************************/
                                              /****************************** CLASS ANIMATIONS ******************************/
                                              /******************************************************************************/
                                              
                                              var classAnimationActions = ['add', 'remove', 'toggle'],
                                                    shorthandStyles = {
                                                      border: 1,
                                                    borderBottom: 1,
                                                    borderColor: 1,
                                                    borderLeft: 1,
                                                    borderRight: 1,
                                                    borderTop: 1,
                                                    borderWidth: 1,
                                                    margin: 1,
                                                    padding: 1
                                                    };
                                                    
                                                    function getElementStyles() {
                                                      var style = document.defaultView
                                                      ? document.defaultView.getComputedStyle(this, null)
                                                      : this.currentStyle,
                                                    newStyle = {},
                                                    key,
                                                    camelCase;
                                                    
                                                    // webkit enumerates style porperties
                                                    if (style && style.length && style[0] && style[style[0]]) {
                                                      var len = style.length;
                                                      while (len--) {
                                                        key = style[len];
                                                        if (typeof style[key] == 'string') {
                                                          camelCase = key.replace(/\-(\w)/g, function(all, letter){
                                                            return letter.toUpperCase();
                                                          });
                                                          newStyle[camelCase] = style[key];
                                                        }
                                                      }
                                                    } else {
                                                      for (key in style) {
                                                        if (typeof style[key] === 'string') {
                                                          newStyle[key] = style[key];
                                                        }
                                                      }
                                                    }
                                                    
                                                    return newStyle;
                                                    }
                                                    
                                                    function filterStyles(styles) {
                                                      var name, value;
                                                      for (name in styles) {
                                                        value = styles[name];
                                                        if (
                                                          // ignore null and undefined values
                                                          value == null ||
                                                          // ignore functions (when does this occur?)
                                                          $.isFunction(value) ||
                                                          // shorthand styles that need to be expanded
                                                          name in shorthandStyles ||
                                                          // ignore scrollbars (break in IE)
                                                          (/scrollbar/).test(name) ||
                                                          
                                                          // only colors or values that can be converted to numbers
                                                          (!(/color/i).test(name) && isNaN(parseFloat(value)))
                                                          ) {
                                                          delete styles[name];
                                                        }
                                                      }
                                                      
                                                      return styles;
                                                    }
                                                    
                                                    function styleDifference(oldStyle, newStyle) {
                                                      var diff = { _: 0 }, // http://dev.jquery.com/ticket/5459
                                                    name;
                                                    
                                                    for (name in newStyle) {
                                                      if (oldStyle[name] != newStyle[name]) {
                                                        diff[name] = newStyle[name];
                                                      }
                                                    }
                                                    
                                                    return diff;
                                                    }
                                                    
                                                    $.effects.animateClass = function(value, duration, easing, callback) {
                                                      if ($.isFunction(easing)) {
                                                        callback = easing;
                                                        easing = null;
                                                      }
                                                      
                                                      return this.each(function() {
                                                        
                                                        var that = $(this),
                                                                       originalStyleAttr = that.attr('style') || ' ',
                                                                       originalStyle = filterStyles(getElementStyles.call(this)),
                                                                       newStyle,
                                                                       className = that.attr('className');
                                                                       
                                                                       $.each(classAnimationActions, function(i, action) {
                                                                         if (value[action]) {
                                                                           that[action + 'Class'](value[action]);
                                                                         }
                                                                       });
                                                                       newStyle = filterStyles(getElementStyles.call(this));
                                                                       that.attr('className', className);
                                                                       
                                                                       that.animate(styleDifference(originalStyle, newStyle), duration, easing, function() {
                                                                         $.each(classAnimationActions, function(i, action) {
                                                                           if (value[action]) { that[action + 'Class'](value[action]); }
                                                                         });
                                                                         // work around bug in IE by clearing the cssText before setting it
                                                                         if (typeof that.attr('style') == 'object') {
                                                                           that.attr('style').cssText = '';
                                                                           that.attr('style').cssText = originalStyleAttr;
                                                                         } else {
                                                                           that.attr('style', originalStyleAttr);
                                                                         }
                                                                         if (callback) { callback.apply(this, arguments); }
                                                                       });
                                                      });
                                                    };
                                                    
                                                    $.fn.extend({
                                                      _addClass: $.fn.addClass,
                                                                addClass: function(classNames, speed, easing, callback) {
                                                                  return speed ? $.effects.animateClass.apply(this, [{ add: classNames },speed,easing,callback]) : this._addClass(classNames);
                                                                },
                                                                
                                                                _removeClass: $.fn.removeClass,
                                                                removeClass: function(classNames,speed,easing,callback) {
                                                                  return speed ? $.effects.animateClass.apply(this, [{ remove: classNames },speed,easing,callback]) : this._removeClass(classNames);
                                                                },
                                                                
                                                                _toggleClass: $.fn.toggleClass,
                                                                toggleClass: function(classNames, force, speed, easing, callback) {
                                                                  if ( typeof force == "boolean" || force === undefined ) {
                                                                    if ( !speed ) {
                                                                      // without speed parameter;
                                                                      return this._toggleClass(classNames, force);
                                                                    } else {
                                                                      return $.effects.animateClass.apply(this, [(force?{add:classNames}:{remove:classNames}),speed,easing,callback]);
                                                                    }
                                                                  } else {
                                                                    // without switch parameter;
                                                                    return $.effects.animateClass.apply(this, [{ toggle: classNames },force,speed,easing]);
                                                                  }
                                                                },
                                                                
                                                                switchClass: function(remove,add,speed,easing,callback) {
                                                                  return $.effects.animateClass.apply(this, [{ add: add, remove: remove },speed,easing,callback]);
                                                                }
                                                    });
                                                    
                                                    
                                                    
                                                    /******************************************************************************/
                                                    /*********************************** EFFECTS **********************************/
                                                    /******************************************************************************/
                                                    
                                                    $.extend($.effects, {
                                                      version: "1.8.2",
                                                             
                                                             // Saves a set of properties in a data storage
                                                             save: function(element, set) {
                                                               for(var i=0; i < set.length; i++) {
                                                                 if(set[i] !== null) element.data("ec.storage."+set[i], element[0].style[set[i]]);
                                                               }
                                                             },
                                                             
                                                             // Restores a set of previously saved properties from a data storage
                                                             restore: function(element, set) {
                                                               for(var i=0; i < set.length; i++) {
                                                                 if(set[i] !== null) element.css(set[i], element.data("ec.storage."+set[i]));
                                                               }
                                                             },
                                                    
                                                    setMode: function(el, mode) {
                                                      if (mode == 'toggle') mode = el.is(':hidden') ? 'show' : 'hide'; // Set for toggle
                                                        return mode;
                                                    },
                                                    
                                                    getBaseline: function(origin, original) { // Translates a [top,left] array into a baseline value
                                                    // this should be a little more flexible in the future to handle a string & hash
                                                    var y, x;
                                                    switch (origin[0]) {
                                                      case 'top': y = 0; break;
                                                      case 'middle': y = 0.5; break;
                                                      case 'bottom': y = 1; break;
                                                      default: y = origin[0] / original.height;
                                                    };
                                                    switch (origin[1]) {
                                                      case 'left': x = 0; break;
                                                      case 'center': x = 0.5; break;
                                                      case 'right': x = 1; break;
                                                      default: x = origin[1] / original.width;
                                                    };
                                                    return {x: x, y: y};
                                                    },
                                                    
                                                    // Wraps the element around a wrapper that copies position properties
                                                    createWrapper: function(element) {
                                                      
                                                      // if the element is already wrapped, return it
                                                      if (element.parent().is('.ui-effects-wrapper')) {
                                                        return element.parent();
                                                      }
                                                      
                                                      // wrap the element
                                                      var props = {
                                                        width: element.outerWidth(true),
                                                    height: element.outerHeight(true),
                                                    'float': element.css('float')
                                                      },
                                                    wrapper = $('<div></div>')
                                                    .addClass('ui-effects-wrapper')
                                                    .css({
                                                      fontSize: '100%',
                                                         background: 'transparent',
                                                         border: 'none',
                                                         margin: 0,
                                                         padding: 0
                                                    });
                                                    
                                                    element.wrap(wrapper);
                                                    wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually loose the reference to the wrapped element
                                                
                                                // transfer positioning properties to the wrapper
                                                if (element.css('position') == 'static') {
                                                  wrapper.css({ position: 'relative' });
                                                  element.css({ position: 'relative' });
                                                } else {
                                                  $.extend(props, {
                                                    position: element.css('position'),
                                                           zIndex: element.css('z-index')
                                                  });
                                                  $.each(['top', 'left', 'bottom', 'right'], function(i, pos) {
                                                    props[pos] = element.css(pos);
                                                    if (isNaN(parseInt(props[pos], 10))) {
                                                      props[pos] = 'auto';
                                                    }
                                                  });
                                                  element.css({position: 'relative', top: 0, left: 0 });
                                                }
                                                
                                                return wrapper.css(props).show();
                                                    },
                                                    
                                                    removeWrapper: function(element) {
                                                      if (element.parent().is('.ui-effects-wrapper'))
                                                        return element.parent().replaceWith(element);
                                                      return element;
                                                    },
                                                    
                                                    setTransition: function(element, list, factor, value) {
                                                      value = value || {};
                                                      $.each(list, function(i, x){
                                                        unit = element.cssUnit(x);
                                                        if (unit[0] > 0) value[x] = unit[0] * factor + unit[1];
                                                      });
                                                      return value;
                                                    }
                          });
                          
                          
                          function _normalizeArguments(effect, options, speed, callback) {
                            // shift params for method overloading
                            if (typeof effect == 'object') {
                              callback = options;
                              speed = null;
                              options = effect;
                              effect = options.effect;
                            }
                            if ($.isFunction(options)) {
                              callback = options;
                              speed = null;
                              options = {};
                            }
                            if ($.isFunction(speed)) {
                              callback = speed;
                              speed = null;
                            }
                            if (typeof options == 'number' || $.fx.speeds[options]) {
                                                callback = speed;
                                                speed = options;
                                                options = {};
                                              }
                                              
                                              options = options || {};
                                              
                                              speed = speed || options.duration;
                                              speed = $.fx.off ? 0 : typeof speed == 'number'
                                              ? speed : $.fx.speeds[speed] || $.fx.speeds._default;
                                              
                                              callback = callback || options.complete;
                                              
                                              return [effect, options, speed, callback];
                          }
                          
                          $.fn.extend({
                            effect: function(effect, options, speed, callback) {
                              var args = _normalizeArguments.apply(this, arguments),
                                      // TODO: make effects takes actual parameters instead of a hash
                                      args2 = {
                                        options: args[1],
                                      duration: args[2],
                                      callback: args[3]
                                      },
                                      effectMethod = $.effects[effect];
                                      
                                      return effectMethod && !$.fx.off ? effectMethod.call(this, args2) : this;
                            },
                                      
                                      _show: $.fn.show,
                                      show: function(speed) {
                                        if (!speed || typeof speed == 'number' || $.fx.speeds[speed]) {
                                          return this._show.apply(this, arguments);
                                        } else {
                                          var args = _normalizeArguments.apply(this, arguments);
                                          args[1].mode = 'show';
                                          return this.effect.apply(this, args);
                                        }
                                      },
                                      
                                      _hide: $.fn.hide,
                                      hide: function(speed) {
                                        if (!speed || typeof speed == 'number' || $.fx.speeds[speed]) {
                                          return this._hide.apply(this, arguments);
                                        } else {
                                          var args = _normalizeArguments.apply(this, arguments);
                                          args[1].mode = 'hide';
                                          return this.effect.apply(this, args);
                                        }
                                      },
                                      
                                      // jQuery core overloads toggle and create _toggle
                                      __toggle: $.fn.toggle,
                                      toggle: function(speed) {
                                        if (!speed || typeof speed == 'number' || $.fx.speeds[speed] ||
                                          typeof speed == 'boolean' || $.isFunction(speed)) {
                                          return this.__toggle.apply(this, arguments);
                                        } else {
                                          var args = _normalizeArguments.apply(this, arguments);
                                          args[1].mode = 'toggle';
                                          return this.effect.apply(this, args);
                                        }
                                      },
                                      
                                      // helper functions
                                      cssUnit: function(key) {
                                        var style = this.css(key), val = [];
                                        $.each( ['em','px','%','pt'], function(i, unit){
                                          if(style.indexOf(unit) > 0)
                                            val = [parseFloat(style), unit];
                                        });
                                        return val;
                                      }
                          });
                          
                          
                          
                          /******************************************************************************/
                          /*********************************** EASING ***********************************/
                          /******************************************************************************/
                          
                          /*
                          * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
                          *
                          * Uses the built in easing capabilities added In jQuery 1.1
                          * to offer multiple easing options
                          *
                          * TERMS OF USE - jQuery Easing
                          *
                          * Open source under the BSD License.
                          *
                          * Copyright 2008 George McGinley Smith
                          * All rights reserved.
                          *
                          * Redistribution and use in source and binary forms, with or without modification,
                          * are permitted provided that the following conditions are met:
                          *
                          * Redistributions of source code must retain the above copyright notice, this list of
                          * conditions and the following disclaimer.
                          * Redistributions in binary form must reproduce the above copyright notice, this list
                          * of conditions and the following disclaimer in the documentation and/or other materials
                          * provided with the distribution.
                          *
                          * Neither the name of the author nor the names of contributors may be used to endorse
                          * or promote products derived from this software without specific prior written permission.
                          *
                          * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
                          * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
                          * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
                          * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
                          * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
                          * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
                          * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
                          * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
                          * OF THE POSSIBILITY OF SUCH DAMAGE.
                          *
                          */
                          
                          // t: current time, b: begInnIng value, c: change In value, d: duration
                          $.easing.jswing = $.easing.swing;
                          
                          $.extend($.easing,
                                   {
                                     def: 'easeOutQuad',
                                   swing: function (x, t, b, c, d) {
                                     //alert($.easing.default);
                                     return $.easing[$.easing.def](x, t, b, c, d);
                                   },
                                   easeInQuad: function (x, t, b, c, d) {
                                     return c*(t/=d)*t + b;
                                   },
                                   easeOutQuad: function (x, t, b, c, d) {
                                     return -c *(t/=d)*(t-2) + b;
                                   },
                                   easeInOutQuad: function (x, t, b, c, d) {
                                     if ((t/=d/2) < 1) return c/2*t*t + b;
                                     return -c/2 * ((--t)*(t-2) - 1) + b;
                                   },
                                   easeInCubic: function (x, t, b, c, d) {
                                     return c*(t/=d)*t*t + b;
                                   },
                                   easeOutCubic: function (x, t, b, c, d) {
                                     return c*((t=t/d-1)*t*t + 1) + b;
                                   },
                                   easeInOutCubic: function (x, t, b, c, d) {
                                     if ((t/=d/2) < 1) return c/2*t*t*t + b;
                                     return c/2*((t-=2)*t*t + 2) + b;
                                   },
                                   easeInQuart: function (x, t, b, c, d) {
                                     return c*(t/=d)*t*t*t + b;
                                   },
                                   easeOutQuart: function (x, t, b, c, d) {
                                     return -c * ((t=t/d-1)*t*t*t - 1) + b;
                                   },
                                   easeInOutQuart: function (x, t, b, c, d) {
                                     if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
                                     return -c/2 * ((t-=2)*t*t*t - 2) + b;
                                   },
                                   easeInQuint: function (x, t, b, c, d) {
                                     return c*(t/=d)*t*t*t*t + b;
                                   },
                                   easeOutQuint: function (x, t, b, c, d) {
                                     return c*((t=t/d-1)*t*t*t*t + 1) + b;
                                   },
                                   easeInOutQuint: function (x, t, b, c, d) {
                                     if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
                                     return c/2*((t-=2)*t*t*t*t + 2) + b;
                                   },
                                   easeInSine: function (x, t, b, c, d) {
                                     return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
                                   },
                                   easeOutSine: function (x, t, b, c, d) {
                                     return c * Math.sin(t/d * (Math.PI/2)) + b;
                                   },
                                   easeInOutSine: function (x, t, b, c, d) {
                                     return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
                                   },
                                   easeInExpo: function (x, t, b, c, d) {
                                     return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
                                   },
                                   easeOutExpo: function (x, t, b, c, d) {
                                     return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
                                   },
                                   easeInOutExpo: function (x, t, b, c, d) {
                                     if (t==0) return b;
                                     if (t==d) return b+c;
                                     if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
                                     return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
                                   },
                                   easeInCirc: function (x, t, b, c, d) {
                                     return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
                                   },
                                   easeOutCirc: function (x, t, b, c, d) {
                                     return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
                                   },
                                   easeInOutCirc: function (x, t, b, c, d) {
                                     if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
                                     return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
                                   },
                                   easeInElastic: function (x, t, b, c, d) {
                                     var s=1.70158;var p=0;var a=c;
                                     if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
                                     if (a < Math.abs(c)) { a=c; var s=p/4; }
                                     else var s = p/(2*Math.PI) * Math.asin (c/a);
                                     return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
                                   },
                                   easeOutElastic: function (x, t, b, c, d) {
                                     var s=1.70158;var p=0;var a=c;
                                     if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
                                     if (a < Math.abs(c)) { a=c; var s=p/4; }
                                     else var s = p/(2*Math.PI) * Math.asin (c/a);
                                     return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
                                   },
                                   easeInOutElastic: function (x, t, b, c, d) {
                                     var s=1.70158;var p=0;var a=c;
                                     if (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) p=d*(.3*1.5);
                                     if (a < Math.abs(c)) { a=c; var s=p/4; }
                                     else var s = p/(2*Math.PI) * Math.asin (c/a);
                                     if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
                                     return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
                                   },
                                   easeInBack: function (x, t, b, c, d, s) {
                                     if (s == undefined) s = 1.70158;
                                     return c*(t/=d)*t*((s+1)*t - s) + b;
                                   },
                                   easeOutBack: function (x, t, b, c, d, s) {
                                     if (s == undefined) s = 1.70158;
                                     return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
                                   },
                                   easeInOutBack: function (x, t, b, c, d, s) {
                                     if (s == undefined) s = 1.70158;
                                     if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
                                     return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
                                   },
                                   easeInBounce: function (x, t, b, c, d) {
                                     return c - $.easing.easeOutBounce (x, d-t, 0, c, d) + b;
                                   },
                                   easeOutBounce: function (x, t, b, c, d) {
                                     if ((t/=d) < (1/2.75)) {
                                       return c*(7.5625*t*t) + b;
                                     } else if (t < (2/2.75)) {
                                       return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
                                     } else if (t < (2.5/2.75)) {
                                       return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
                                     } else {
                                       return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
                                     }
                                   },
                                   easeInOutBounce: function (x, t, b, c, d) {
                                     if (t < d/2) return $.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
                                     return $.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
                                   }
                                   });
                                   
                                   /*
                                   *
                                   * TERMS OF USE - EASING EQUATIONS
                                   *
                                   * Open source under the BSD License.
                                   *
                                   * Copyright 2001 Robert Penner
                                   * All rights reserved.
                                   *
                                   * Redistribution and use in source and binary forms, with or without modification,
                                   * are permitted provided that the following conditions are met:
                                   *
                                   * Redistributions of source code must retain the above copyright notice, this list of
                                   * conditions and the following disclaimer.
                                   * Redistributions in binary form must reproduce the above copyright notice, this list
                                   * of conditions and the following disclaimer in the documentation and/or other materials
                                   * provided with the distribution.
                                   *
                                   * Neither the name of the author nor the names of contributors may be used to endorse
                                   * or promote products derived from this software without specific prior written permission.
                                   *
                                   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
                                   * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
                                   * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
                                   * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
                                   * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
                                   * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
                                   * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
                                   * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
                                   * OF THE POSSIBILITY OF SUCH DAMAGE.
                                   *
                                   */
                                   
                                   })(jQuery);
                                   /*
                                   * jQuery UI Effects Blind 1.8.2
                                   *
                                   * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
                                   * Dual licensed under the MIT (MIT-LICENSE.txt)
                                   * and GPL (GPL-LICENSE.txt) licenses.
                                   *
                                   * http://docs.jquery.com/UI/Effects/Blind
                                   *
                                   * Depends:
                                   *  jquery.effects.core.js
                                   */
                                   (function($) {
                                     
                                     $.effects.blind = function(o) {
                                       
                                       return this.queue(function() {
                                         
                                         // Create element
                                         var el = $(this), props = ['position','top','left'];
                                         
                                         // Set options
                                         var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
                                   var direction = o.options.direction || 'vertical'; // Default direction
                                   
                                   // Adjust
                                   $.effects.save(el, props); el.show(); // Save & Show
                                   var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
                                   var ref = (direction == 'vertical') ? 'height' : 'width';
                                   var distance = (direction == 'vertical') ? wrapper.height() : wrapper.width();
                                   if(mode == 'show') wrapper.css(ref, 0); // Shift
                                     
                                     // Animation
                                     var animation = {};
                                   animation[ref] = mode == 'show' ? distance : 0;
                                   
                                   // Animate
                                   wrapper.animate(animation, o.duration, o.options.easing, function() {
                                     if(mode == 'hide') el.hide(); // Hide
                                       $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
                                       if(o.callback) o.callback.apply(el[0], arguments); // Callback
                                         el.dequeue();
                                   });
                                   
                                     });
                                     
                                   };
                                   
                                   })(jQuery);
                                   /*
                                   * jQuery UI Effects Bounce 1.8.2
                                   *
                                   * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
                                   * Dual licensed under the MIT (MIT-LICENSE.txt)
                                   * and GPL (GPL-LICENSE.txt) licenses.
                                   *
                                   * http://docs.jquery.com/UI/Effects/Bounce
                                   *
                                   * Depends:
                                   *  jquery.effects.core.js
                                   */
                                   (function($) {
                                     
                                     $.effects.bounce = function(o) {
                                       
                                       return this.queue(function() {
                                         
                                         // Create element
                                         var el = $(this), props = ['position','top','left'];
                                         
                                         // Set options
                                         var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
                                   var direction = o.options.direction || 'up'; // Default direction
                                   var distance = o.options.distance || 20; // Default distance
                                   var times = o.options.times || 5; // Default # of times
                                   var speed = o.duration || 250; // Default speed per bounce
                                   if (/show|hide/.test(mode)) props.push('opacity'); // Avoid touching opacity to prevent clearType and PNG issues in IE
                                     
                                     // Adjust
                                     $.effects.save(el, props); el.show(); // Save & Show
                                     $.effects.createWrapper(el); // Create Wrapper
                                     var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
                                   var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
                                   var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 3 : el.outerWidth({margin:true}) / 3);
                                   if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift
                                     if (mode == 'hide') distance = distance / (times * 2);
                                     if (mode != 'hide') times--;
                                     
                                     // Animate
                                     if (mode == 'show') { // Show Bounce
                                       var animation = {opacity: 1};
                                       animation[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
                                       el.animate(animation, speed / 2, o.options.easing);
                                       distance = distance / 2;
                                       times--;
                                     };
                                     for (var i = 0; i < times; i++) { // Bounces
                                       var animation1 = {}, animation2 = {};
                                       animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
                                       animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
                                       el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing);
                                       distance = (mode == 'hide') ? distance * 2 : distance / 2;
                                     };
                                     if (mode == 'hide') { // Last Bounce
                                       var animation = {opacity: 0};
                                       animation[ref] = (motion == 'pos' ? '-=' : '+=')  + distance;
                                       el.animate(animation, speed / 2, o.options.easing, function(){
                                         el.hide(); // Hide
                                         $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
                                         if(o.callback) o.callback.apply(this, arguments); // Callback
                                       });
                                     } else {
                                       var animation1 = {}, animation2 = {};
                                       animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
                                       animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
                                       el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing, function(){
                                         $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
                                         if(o.callback) o.callback.apply(this, arguments); // Callback
                                       });
                                     };
                                     el.queue('fx', function() { el.dequeue(); });
                                     el.dequeue();
                                       });
                                       
                                     };
                                     
                                   })(jQuery);
                                   /*
                                   * jQuery UI Effects Clip 1.8.2
                                   *
                                   * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
                                   * Dual licensed under the MIT (MIT-LICENSE.txt)
                                   * and GPL (GPL-LICENSE.txt) licenses.
                                   *
                                   * http://docs.jquery.com/UI/Effects/Clip
                                   *
                                   * Depends:
                                   *  jquery.effects.core.js
                                   */
                                   (function($) {
                                     
                                     $.effects.clip = function(o) {
                                       
                                       return this.queue(function() {
                                         
                                         // Create element
                                         var el = $(this), props = ['position','top','left','height','width'];
                                         
                                         // Set options
                                         var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
                                       var direction = o.options.direction || 'vertical'; // Default direction
                                       
                                       // Adjust
                                       $.effects.save(el, props); el.show(); // Save & Show
                                       var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
                                       var animate = el[0].tagName == 'IMG' ? wrapper : el;
                                       var ref = {
                                         size: (direction == 'vertical') ? 'height' : 'width',
                                         position: (direction == 'vertical') ? 'top' : 'left'
                                       };
                                       var distance = (direction == 'vertical') ? animate.height() : animate.width();
                                       if(mode == 'show') { animate.css(ref.size, 0); animate.css(ref.position, distance / 2); } // Shift
                                         
                                         // Animation
                                         var animation = {};
                                         animation[ref.size] = mode == 'show' ? distance : 0;
                                         animation[ref.position] = mode == 'show' ? 0 : distance / 2;
                                         
                                         // Animate
                                         animate.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
                                           if(mode == 'hide') el.hide(); // Hide
                                             $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
                                             if(o.callback) o.callback.apply(el[0], arguments); // Callback
                                               el.dequeue();
                                         }});
                                         
                                     });
                                     
                                   };
                                   
                                   })(jQuery);
                                   /*
                                   * jQuery UI Effects Drop 1.8.2
                                   *
                                   * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
                                   * Dual licensed under the MIT (MIT-LICENSE.txt)
                                   * and GPL (GPL-LICENSE.txt) licenses.
                                   *
                                   * http://docs.jquery.com/UI/Effects/Drop
                                   *
                                   * Depends:
                                   *  jquery.effects.core.js
                                   */
                                   (function($) {
                                     
                                     $.effects.drop = function(o) {
                                       
                                       return this.queue(function() {
                                         
                                         // Create element
                                         var el = $(this), props = ['position','top','left','opacity'];
                                         
                                         // Set options
                                         var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
                                       var direction = o.options.direction || 'left'; // Default Direction
                                       
                                       // Adjust
                                       $.effects.save(el, props); el.show(); // Save & Show
                                       $.effects.createWrapper(el); // Create Wrapper
                                       var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
                                       var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
                                       var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 2 : el.outerWidth({margin:true}) / 2);
                                       if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift
                                         
                                         // Animation
                                         var animation = {opacity: mode == 'show' ? 1 : 0};
                                       animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance;
                                       
                                       // Animate
                                       el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
                                         if(mode == 'hide') el.hide(); // Hide
                                           $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
                                           if(o.callback) o.callback.apply(this, arguments); // Callback
                                             el.dequeue();
                                       }});
                                       
                                       });
                                       
                                     };
                                     
                                   })(jQuery);
                                   /*
                                   * jQuery UI Effects Explode 1.8.2
                                   *
                                   * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
                                   * Dual licensed under the MIT (MIT-LICENSE.txt)
                                   * and GPL (GPL-LICENSE.txt) licenses.
                                   *
                                   * http://docs.jquery.com/UI/Effects/Explode
                                   *
                                   * Depends:
                                   *  jquery.effects.core.js
                                   */
                                   (function($) {
                                     
                                     $.effects.explode = function(o) {
                                       
                                       return this.queue(function() {
                                         
                                         var rows = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3;
                                         var cells = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3;
                                         
                                         o.options.mode = o.options.mode == 'toggle' ? ($(this).is(':visible') ? 'hide' : 'show') : o.options.mode;
                                         var el = $(this).show().css('visibility', 'hidden');
                                         var offset = el.offset();
                                         
                                         //Substract the margins - not fixing the problem yet.
                                         offset.top -= parseInt(el.css("marginTop"),10) || 0;
                                         offset.left -= parseInt(el.css("marginLeft"),10) || 0;
                                         
                                         var width = el.outerWidth(true);
                                         var height = el.outerHeight(true);
                                         
                                         for(var i=0;i<rows;i++) { // =
                                           for(var j=0;j<cells;j++) { // ||
                                             el
                                             .clone()
                                             .appendTo('body')
                                             .wrap('<div></div>')
                                             .css({
                                               position: 'absolute',
                                                  visibility: 'visible',
                                                  left: -j*(width/cells),
                                                  top: -i*(height/rows)
                                             })
                                             .parent()
                                             .addClass('ui-effects-explode')
                                             .css({
                                               position: 'absolute',
                                                  overflow: 'hidden',
                                                  width: width/cells,
                                                  height: height/rows,
                                                  left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? (j-Math.floor(cells/2))*(width/cells) : 0),
                                                  top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? (i-Math.floor(rows/2))*(height/rows) : 0),
                                                  opacity: o.options.mode == 'show' ? 0 : 1
                                             }).animate({
                                               left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? 0 : (j-Math.floor(cells/2))*(width/cells)),
                                               top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? 0 : (i-Math.floor(rows/2))*(height/rows)),
                                               opacity: o.options.mode == 'show' ? 1 : 0
                                             }, o.duration || 500);
                                           }
                                         }
                                         
                                         // Set a timeout, to call the callback approx. when the other animations have finished
                                         setTimeout(function() {
                                           
                                           o.options.mode == 'show' ? el.css({ visibility: 'visible' }) : el.css({ visibility: 'visible' }).hide();
                                           if(o.callback) o.callback.apply(el[0]); // Callback
                                             el.dequeue();
                                           
                                           $('div.ui-effects-explode').remove();
                                           
                                         }, o.duration || 500);
                                         
                                         
                                       });
                                       
                                     };
                                     
                                   })(jQuery);
                                   /*
                                   * jQuery UI Effects Fade 1.8.2
                                   *
                                   * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
                                   * Dual licensed under the MIT (MIT-LICENSE.txt)
                                   * and GPL (GPL-LICENSE.txt) licenses.
                                   *
                                   * http://docs.jquery.com/UI/Effects/Fade
                                   *
                                   * Depends:
                                   *  jquery.effects.core.js
                                   */
                                   (function($) {
                                     
                                     $.effects.fade = function(o) {
                                       return this.queue(function() {
                                         var elem = $(this),
                                                         mode = $.effects.setMode(elem, o.options.mode || 'hide');
                                                         
                                                         elem.animate({ opacity: mode }, {
                                                           queue: false,
                                                                      duration: o.duration,
                                                                      easing: o.options.easing,
                                                                      complete: function() {
                                                                        (o.callback && o.callback.apply(this, arguments));
                                                                        elem.dequeue();
                                                                      }
                                                         });
                                       });
                                     };
                                     
                                   })(jQuery);
                                   /*
                                   * jQuery UI Effects Fold 1.8.2
                                   *
                                   * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
                                   * Dual licensed under the MIT (MIT-LICENSE.txt)
                                   * and GPL (GPL-LICENSE.txt) licenses.
                                   *
                                   * http://docs.jquery.com/UI/Effects/Fold
                                   *
                                   * Depends:
                                   *  jquery.effects.core.js
                                   */
                                   (function($) {
                                     
                                     $.effects.fold = function(o) {
                                       
                                       return this.queue(function() {
                                         
                                         // Create element
                                         var el = $(this), props = ['position','top','left'];
                                         
                                         // Set options
                                         var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
                                   var size = o.options.size || 15; // Default fold size
                                   var horizFirst = !(!o.options.horizFirst); // Ensure a boolean value
                                   var duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2;
                                   
                                   // Adjust
                                   $.effects.save(el, props); el.show(); // Save & Show
                                   var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
                                   var widthFirst = ((mode == 'show') != horizFirst);
                                   var ref = widthFirst ? ['width', 'height'] : ['height', 'width'];
                                   var distance = widthFirst ? [wrapper.width(), wrapper.height()] : [wrapper.height(), wrapper.width()];
                                   var percent = /([0-9]+)%/.exec(size);
                                   if(percent) size = parseInt(percent[1],10) / 100 * distance[mode == 'hide' ? 0 : 1];
                                   if(mode == 'show') wrapper.css(horizFirst ? {height: 0, width: size} : {height: size, width: 0}); // Shift
                                     
                                     // Animation
                                     var animation1 = {}, animation2 = {};
                                     animation1[ref[0]] = mode == 'show' ? distance[0] : size;
                                     animation2[ref[1]] = mode == 'show' ? distance[1] : 0;
                                     
                                     // Animate
                                     wrapper.animate(animation1, duration, o.options.easing)
                                     .animate(animation2, duration, o.options.easing, function() {
                                       if(mode == 'hide') el.hide(); // Hide
                                         $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
                                         if(o.callback) o.callback.apply(el[0], arguments); // Callback
                                           el.dequeue();
                                     });
                                     
                                     });
                                     
                                   };
                                   
                                   })(jQuery);
                                   /*
                                   * jQuery UI Effects Highlight 1.8.2
                                   *
                                   * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
                                   * Dual licensed under the MIT (MIT-LICENSE.txt)
                                   * and GPL (GPL-LICENSE.txt) licenses.
                                   *
                                   * http://docs.jquery.com/UI/Effects/Highlight
                                   *
                                   * Depends:
                                   *  jquery.effects.core.js
                                   */
                                   (function($) {
                                     
                                     $.effects.highlight = function(o) {
                                       return this.queue(function() {
                                         var elem = $(this),
                                                         props = ['backgroundImage', 'backgroundColor', 'opacity'],
                                                         mode = $.effects.setMode(elem, o.options.mode || 'show'),
                                                         animation = {
                                                           backgroundColor: elem.css('backgroundColor')
                                                         };
                                                         
                                                         if (mode == 'hide') {
                                                           animation.opacity = 0;
                                                         }
                                                         
                                                         $.effects.save(elem, props);
                                                         elem
                                                         .show()
                                                         .css({
                                                           backgroundImage: 'none',
                                                              backgroundColor: o.options.color || '#ffff99'
                                                         })
                                                         .animate(animation, {
                                                           queue: false,
                                                                  duration: o.duration,
                                                                  easing: o.options.easing,
                                                                  complete: function() {
                                                                    (mode == 'hide' && elem.hide());
                                                                    $.effects.restore(elem, props);
                                                                    (mode == 'show' && !$.support.opacity && this.style.removeAttribute('filter'));
                                                                    (o.callback && o.callback.apply(this, arguments));
                                                                    elem.dequeue();
                                                                  }
                                                         });
                                       });
                                     };
                                     
                                   })(jQuery);
                                   /*
                                   * jQuery UI Effects Pulsate 1.8.2
                                   *
                                   * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
                                   * Dual licensed under the MIT (MIT-LICENSE.txt)
                                   * and GPL (GPL-LICENSE.txt) licenses.
                                   *
                                   * http://docs.jquery.com/UI/Effects/Pulsate
                                   *
                                   * Depends:
                                   *  jquery.effects.core.js
                                   */
                                   (function($) {
                                     
                                     $.effects.pulsate = function(o) {
                                       return this.queue(function() {
                                         var elem = $(this),
                                                         mode = $.effects.setMode(elem, o.options.mode || 'show');
                                                         times = ((o.options.times || 5) * 2) - 1;
                                                         duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2,
                                                         isVisible = elem.is(':visible'),
                                                         animateTo = 0;
                                                         
                                                         if (!isVisible) {
                                                           elem.css('opacity', 0).show();
                                                           animateTo = 1;
                                                         }
                                                         
                                                         if ((mode == 'hide' && isVisible) || (mode == 'show' && !isVisible)) {
                                                           times--;
                                                         }
                                                         
                                                         for (var i = 0; i < times; i++) {
                                                           elem.animate({ opacity: animateTo }, duration, o.options.easing);
                                                           animateTo = (animateTo + 1) % 2;
                                                         }
                                                         
                                                         elem.animate({ opacity: animateTo }, duration, o.options.easing, function() {
                                                           if (animateTo == 0) {
                                                             elem.hide();
                                                           }
                                                           (o.callback && o.callback.apply(this, arguments));
                                                         });
                                                         
                                                         elem
                                                         .queue('fx', function() { elem.dequeue(); })
                                                         .dequeue();
                                       });
                                     };
                                     
                                   })(jQuery);
                                   /*
                                   * jQuery UI Effects Scale 1.8.2
                                   *
                                   * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
                                   * Dual licensed under the MIT (MIT-LICENSE.txt)
                                   * and GPL (GPL-LICENSE.txt) licenses.
                                   *
                                   * http://docs.jquery.com/UI/Effects/Scale
                                   *
                                   * Depends:
                                   *  jquery.effects.core.js
                                   */
                                   (function($) {
                                     
                                     $.effects.puff = function(o) {
                                       return this.queue(function() {
                                         var elem = $(this),
                                                         mode = $.effects.setMode(elem, o.options.mode || 'hide'),
                                                         percent = parseInt(o.options.percent, 10) || 150,
                                                         factor = percent / 100,
                                                         original = { height: elem.height(), width: elem.width() };
                                                         
                                                         $.extend(o.options, {
                                                           fade: true,
                                                                  mode: mode,
                                                                  percent: mode == 'hide' ? percent : 100,
                                                                  from: mode == 'hide'
                                                                  ? original
                                                                  : {
                                                                    height: original.height * factor,
                                                                  width: original.width * factor
                                                                  }
                                                         });
                                                         
                                                         elem.effect('scale', o.options, o.duration, o.callback);
                                                         elem.dequeue();
                                       });
                                     };
                                     
                                     $.effects.scale = function(o) {
                                       
                                       return this.queue(function() {
                                         
                                         // Create element
                                         var el = $(this);
                                         
                                         // Set options
                                         var options = $.extend(true, {}, o.options);
                                         var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
                                       var percent = parseInt(o.options.percent,10) || (parseInt(o.options.percent,10) == 0 ? 0 : (mode == 'hide' ? 0 : 100)); // Set default scaling percent
                                   var direction = o.options.direction || 'both'; // Set default axis
                                   var origin = o.options.origin; // The origin of the scaling
                                   if (mode != 'effect') { // Set default origin and restore for show/hide
                                     options.origin = origin || ['middle','center'];
                                     options.restore = true;
                                       }
                                       var original = {height: el.height(), width: el.width()}; // Save original
                                       el.from = o.options.from || (mode == 'show' ? {height: 0, width: 0} : original); // Default from state
                                       
                                       // Adjust
                                       var factor = { // Set scaling factor
                                       y: direction != 'horizontal' ? (percent / 100) : 1,
                                       x: direction != 'vertical' ? (percent / 100) : 1
                                       };
                                       el.to = {height: original.height * factor.y, width: original.width * factor.x}; // Set to state
                                       
                                       if (o.options.fade) { // Fade option to support puff
                                         if (mode == 'show') {el.from.opacity = 0; el.to.opacity = 1;};
                                         if (mode == 'hide') {el.from.opacity = 1; el.to.opacity = 0;};
                                       };
                                       
                                       // Animation
                                       options.from = el.from; options.to = el.to; options.mode = mode;
                                       
                                       // Animate
                                       el.effect('size', options, o.duration, o.callback);
                                       el.dequeue();
                                     });
                                     
                                   };
                                   
                                   $.effects.size = function(o) {
                                     
                                     return this.queue(function() {
                                       
                                       // Create element
                                       var el = $(this), props = ['position','top','left','width','height','overflow','opacity'];
                                       var props1 = ['position','top','left','overflow','opacity']; // Always restore
                                       var props2 = ['width','height','overflow']; // Copy for children
                                       var cProps = ['fontSize'];
                                       var vProps = ['borderTopWidth', 'borderBottomWidth', 'paddingTop', 'paddingBottom'];
                                       var hProps = ['borderLeftWidth', 'borderRightWidth', 'paddingLeft', 'paddingRight'];
                                       
                                       // Set options
                                       var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
                                       var restore = o.options.restore || false; // Default restore
                                       var scale = o.options.scale || 'both'; // Default scale mode
                                       var origin = o.options.origin; // The origin of the sizing
                                       var original = {height: el.height(), width: el.width()}; // Save original
                                       el.from = o.options.from || original; // Default from state
                                       el.to = o.options.to || original; // Default to state
                                       // Adjust
                                       if (origin) { // Calculate baseline shifts
                                         var baseline = $.effects.getBaseline(origin, original);
                                         el.from.top = (original.height - el.from.height) * baseline.y;
                                         el.from.left = (original.width - el.from.width) * baseline.x;
                                         el.to.top = (original.height - el.to.height) * baseline.y;
                                         el.to.left = (original.width - el.to.width) * baseline.x;
                                       };
                                       var factor = { // Set scaling factor
                                       from: {y: el.from.height / original.height, x: el.from.width / original.width},
                                       to: {y: el.to.height / original.height, x: el.to.width / original.width}
                                       };
                                       if (scale == 'box' || scale == 'both') { // Scale the css box
                                         if (factor.from.y != factor.to.y) { // Vertical props scaling
                                           props = props.concat(vProps);
                                           el.from = $.effects.setTransition(el, vProps, factor.from.y, el.from);
                                           el.to = $.effects.setTransition(el, vProps, factor.to.y, el.to);
                                         };
                                         if (factor.from.x != factor.to.x) { // Horizontal props scaling
                                           props = props.concat(hProps);
                                           el.from = $.effects.setTransition(el, hProps, factor.from.x, el.from);
                                           el.to = $.effects.setTransition(el, hProps, factor.to.x, el.to);
                                         };
                                       };
                                       if (scale == 'content' || scale == 'both') { // Scale the content
                                         if (factor.from.y != factor.to.y) { // Vertical props scaling
                                           props = props.concat(cProps);
                                           el.from = $.effects.setTransition(el, cProps, factor.from.y, el.from);
                                           el.to = $.effects.setTransition(el, cProps, factor.to.y, el.to);
                                         };
                                       };
                                       $.effects.save(el, restore ? props : props1); el.show(); // Save & Show
                                       $.effects.createWrapper(el); // Create Wrapper
                                       el.css('overflow','hidden').css(el.from); // Shift
                                       
                                       // Animate
                                       if (scale == 'content' || scale == 'both') { // Scale the children
                                         vProps = vProps.concat(['marginTop','marginBottom']).concat(cProps); // Add margins/font-size
                                         hProps = hProps.concat(['marginLeft','marginRight']); // Add margins
                                         props2 = props.concat(vProps).concat(hProps); // Concat
                                         el.find("*[width]").each(function(){
                                           child = $(this);
                                           if (restore) $.effects.save(child, props2);
                                           var c_original = {height: child.height(), width: child.width()}; // Save original
                                           child.from = {height: c_original.height * factor.from.y, width: c_original.width * factor.from.x};
                                           child.to = {height: c_original.height * factor.to.y, width: c_original.width * factor.to.x};
                                           if (factor.from.y != factor.to.y) { // Vertical props scaling
                                             child.from = $.effects.setTransition(child, vProps, factor.from.y, child.from);
                                             child.to = $.effects.setTransition(child, vProps, factor.to.y, child.to);
                                         };
                                         if (factor.from.x != factor.to.x) { // Horizontal props scaling
                                           child.from = $.effects.setTransition(child, hProps, factor.from.x, child.from);
                                           child.to = $.effects.setTransition(child, hProps, factor.to.x, child.to);
                                         };
                                         child.css(child.from); // Shift children
                                         child.animate(child.to, o.duration, o.options.easing, function(){
                                           if (restore) $.effects.restore(child, props2); // Restore children
                                         }); // Animate children
                                         });
                                       };
                                       
                                       // Animate
                                       el.animate(el.to, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
                                         if (el.to.opacity === 0) {
                                           el.css('opacity', el.from.opacity);
                                         }
                                         if(mode == 'hide') el.hide(); // Hide
                                           $.effects.restore(el, restore ? props : props1); $.effects.removeWrapper(el); // Restore
                                           if(o.callback) o.callback.apply(this, arguments); // Callback
                                             el.dequeue();
                                       }});
                                       
                                     });
                                     
                                   };
                                   
                                   })(jQuery);
                                   /*
                                   * jQuery UI Effects Shake 1.8.2
                                   *
                                   * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
                                   * Dual licensed under the MIT (MIT-LICENSE.txt)
                                   * and GPL (GPL-LICENSE.txt) licenses.
                                   *
                                   * http://docs.jquery.com/UI/Effects/Shake
                                   *
                                   * Depends:
                                   *  jquery.effects.core.js
                                   */
                                   (function($) {
                                     
                                     $.effects.shake = function(o) {
                                       
                                       return this.queue(function() {
                                         
                                         // Create element
                                         var el = $(this), props = ['position','top','left'];
                                         
                                         // Set options
                                         var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
                                   var direction = o.options.direction || 'left'; // Default direction
                                   var distance = o.options.distance || 20; // Default distance
                                   var times = o.options.times || 3; // Default # of times
                                   var speed = o.duration || o.options.duration || 140; // Default speed per shake
                                   
                                   // Adjust
                                   $.effects.save(el, props); el.show(); // Save & Show
                                   $.effects.createWrapper(el); // Create Wrapper
                                   var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
                                   var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
                                   
                                   // Animation
                                   var animation = {}, animation1 = {}, animation2 = {};
                                   animation[ref] = (motion == 'pos' ? '-=' : '+=')  + distance;
                                   animation1[ref] = (motion == 'pos' ? '+=' : '-=')  + distance * 2;
                                   animation2[ref] = (motion == 'pos' ? '-=' : '+=')  + distance * 2;
                                   
                                   // Animate
                                   el.animate(animation, speed, o.options.easing);
                                   for (var i = 1; i < times; i++) { // Shakes
                                     el.animate(animation1, speed, o.options.easing).animate(animation2, speed, o.options.easing);
                                   };
                                   el.animate(animation1, speed, o.options.easing).
                                   animate(animation, speed / 2, o.options.easing, function(){ // Last shake
                                   $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
                                   if(o.callback) o.callback.apply(this, arguments); // Callback
                                   });
                                   el.queue('fx', function() { el.dequeue(); });
                                   el.dequeue();
                                       });
                                       
                                     };
                                     
                                   })(jQuery);
                                   /*
                                   * jQuery UI Effects Slide 1.8.2
                                   *
                                   * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
                                   * Dual licensed under the MIT (MIT-LICENSE.txt)
                                   * and GPL (GPL-LICENSE.txt) licenses.
                                   *
                                   * http://docs.jquery.com/UI/Effects/Slide
                                   *
                                   * Depends:
                                   *  jquery.effects.core.js
                                   */
                                   (function($) {
                                     
                                     $.effects.slide = function(o) {
                                       
                                       return this.queue(function() {
                                         
                                         // Create element
                                         var el = $(this), props = ['position','top','left'];
                                         
                                         // Set options
                                         var mode = $.effects.setMode(el, o.options.mode || 'show'); // Set Mode
                                   var direction = o.options.direction || 'left'; // Default Direction
                                   
                                   // Adjust
                                   $.effects.save(el, props); el.show(); // Save & Show
                                   $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
                                   var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
                                   var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
                                   var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) : el.outerWidth({margin:true}));
                                   if (mode == 'show') el.css(ref, motion == 'pos' ? -distance : distance); // Shift
                                     
                                     // Animation
                                     var animation = {};
                                   animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance;
                                   
                                   // Animate
                                   el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
                                     if(mode == 'hide') el.hide(); // Hide
                                       $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
                                       if(o.callback) o.callback.apply(this, arguments); // Callback
                                         el.dequeue();
                                   }});
                                   
                                     });
                                     
                                   };
                                   
                                   })(jQuery);
                                   /*
                                   * jQuery UI Effects Transfer 1.8.2
                                   *
                                   * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
                                   * Dual licensed under the MIT (MIT-LICENSE.txt)
                                   * and GPL (GPL-LICENSE.txt) licenses.
                                   *
                                   * http://docs.jquery.com/UI/Effects/Transfer
                                   *
                                   * Depends:
                                   *  jquery.effects.core.js
                                   */
                                   (function($) {
                                     
                                     $.effects.transfer = function(o) {
                                       return this.queue(function() {
                                         var elem = $(this),
                                                         target = $(o.options.to),
                                                         endPosition = target.offset(),
                                                         animation = {
                                                           top: endPosition.top,
                                                         left: endPosition.left,
                                                         height: target.innerHeight(),
                                                         width: target.innerWidth()
                                                         },
                                                         startPosition = elem.offset(),
                                                         transfer = $('<div class="ui-effects-transfer"></div>')
                                                         .appendTo(document.body)
                                                         .addClass(o.options.className)
                                                         .css({
                                                           top: startPosition.top,
                                                              left: startPosition.left,
                                                              height: elem.innerHeight(),
                                                              width: elem.innerWidth(),
                                                              position: 'absolute'
                                                         })
                                                         .animate(animation, o.duration, o.options.easing, function() {
                                                           transfer.remove();
                                                           (o.callback && o.callback.apply(elem[0], arguments));
                                                           elem.dequeue();
                                                         });
                                       });
                                     };
                                     
                                   })(jQuery);
                                   /*
                                   * jQuery UI Accordion 1.8.2
                                   *
                                   * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
                                   * Dual licensed under the MIT (MIT-LICENSE.txt)
                                   * and GPL (GPL-LICENSE.txt) licenses.
                                   *
                                   * http://docs.jquery.com/UI/Accordion
                                   *
                                   * Depends:
                                   *  jquery.ui.core.js
                                   *  jquery.ui.widget.js
                                   */
                                   (function($) {
                                     
                                     $.widget("ui.accordion", {
                                       options: {
                                         active: 0,
                                              animated: 'slide',
                                              autoHeight: true,
                                              clearStyle: false,
                                              collapsible: false,
                                              event: "click",
                                              fillSpace: false,
                                              header: "> li > :first-child,> :not(li):even",
                                              icons: {
                                                header: "ui-icon-triangle-1-e",
                                              headerSelected: "ui-icon-triangle-1-s"
                                              },
                                              navigation: false,
                                              navigationFilter: function() {
                                                return this.href.toLowerCase() == location.href.toLowerCase();
                                              }
                                       },
                                              _create: function() {
                                                
                                                var o = this.options, self = this;
                                                this.running = 0;
                                                
                                                this.element.addClass("ui-accordion ui-widget ui-helper-reset");
                                                
                                                // in lack of child-selectors in CSS we need to mark top-LIs in a UL-accordion for some IE-fix
                                                this.element.children("li").addClass("ui-accordion-li-fix");
                                                
                                                this.headers = this.element.find(o.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all")
                                                .bind("mouseenter.accordion", function(){ $(this).addClass('ui-state-hover'); })
                                                .bind("mouseleave.accordion", function(){ $(this).removeClass('ui-state-hover'); })
                                                .bind("focus.accordion", function(){ $(this).addClass('ui-state-focus'); })
                                                .bind("blur.accordion", function(){ $(this).removeClass('ui-state-focus'); });
                                                
                                                this.headers
                                                .next()
                                                .addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");
                                                
                                                if ( o.navigation ) {
                                                  var current = this.element.find("a").filter(o.navigationFilter);
                                                  if ( current.length ) {
                                                    var header = current.closest(".ui-accordion-header");
                                                    if ( header.length ) {
                                                      // anchor within header
                                                      this.active = header;
                                                    } else {
                                                      // anchor within content
                                                      this.active = current.closest(".ui-accordion-content").prev();
                                                    }
                                                  }
                                                }
                                                
                                                this.active = this._findActive(this.active || o.active).toggleClass("ui-state-default").toggleClass("ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");
                                                this.active.next().addClass('ui-accordion-content-active');
                                                
                                                //Append icon elements
                                                this._createIcons();
                                                
                                                this.resize();
                                                
                                                //ARIA
                                                this.element.attr('role','tablist');
                                                
                                                this.headers
                                                .attr('role','tab')
                                                .bind('keydown', function(event) { return self._keydown(event); })
                                                .next()
                                                .attr('role','tabpanel');
                                                
                                                this.headers
                                                .not(this.active || "")
                                                .attr('aria-expanded','false')
                                                .attr("tabIndex", "-1")
                                                .next()
                                                .hide();
                                                
                                                // make sure at least one header is in the tab order
                                                if (!this.active.length) {
                                                  this.headers.eq(0).attr('tabIndex','0');
                                                } else {
                                                  this.active
                                                  .attr('aria-expanded','true')
                                                  .attr('tabIndex', '0');
                                                }
                                                
                                                // only need links in taborder for Safari
                                                if (!$.browser.safari)
                                                  this.headers.find('a').attr('tabIndex','-1');
                                                
                                                if (o.event) {
                                                  this.headers.bind((o.event) + ".accordion", function(event) {
                                                    self._clickHandler.call(self, event, this);
                                                    event.preventDefault();
                                                  });
                                                }
                                                
                                              },
                                              
                                              _createIcons: function() {
                                                var o = this.options;
                                                if (o.icons) {
                                                  $("<span/>").addClass("ui-icon " + o.icons.header).prependTo(this.headers);
                                                  this.active.find(".ui-icon").toggleClass(o.icons.header).toggleClass(o.icons.headerSelected);
                                                  this.element.addClass("ui-accordion-icons");
                                                }
                                              },
                                              
                                              _destroyIcons: function() {
                                                this.headers.children(".ui-icon").remove();
                                                this.element.removeClass("ui-accordion-icons");
                                              },
                                              
                                              destroy: function() {
                                                var o = this.options;
                                                
                                                this.element
                                                .removeClass("ui-accordion ui-widget ui-helper-reset")
                                                .removeAttr("role")
                                                .unbind('.accordion')
                                                .removeData('accordion');
                                                
                                                this.headers
                                                .unbind(".accordion")
                                                .removeClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-corner-top")
                                                .removeAttr("role").removeAttr("aria-expanded").removeAttr("tabIndex");
                                                
                                                this.headers.find("a").removeAttr("tabIndex");
                                                this._destroyIcons();
                                                var contents = this.headers.next().css("display", "").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active");
                                                if (o.autoHeight || o.fillHeight) {
                                                  contents.css("height", "");
                                                }
                                                
                                                return this;
                                              },
                                                            
                                                            _setOption: function(key, value) {
                                                              $.Widget.prototype._setOption.apply(this, arguments);
                                                              
                                                              if (key == "active") {
                                                                this.activate(value);
                                                              }
                                                              if (key == "icons") {
                                                                this._destroyIcons();
                                                                if (value) {
                                                                  this._createIcons();
                                                                }
                                                              }
                                                              
                                                            },
                                                            
                                                            _keydown: function(event) {
                                                              
                                                              var o = this.options, keyCode = $.ui.keyCode;
                                                              
                                                              if (o.disabled || event.altKey || event.ctrlKey)
                                                                return;
                                                              
                                                              var length = this.headers.length;
                                                              var currentIndex = this.headers.index(event.target);
                                                              var toFocus = false;
                                                              
                                                              switch(event.keyCode) {
                                                                case keyCode.RIGHT:
                                                                case keyCode.DOWN:
                                                                  toFocus = this.headers[(currentIndex + 1) % length];
                                                                  break;
                                                                case keyCode.LEFT:
                                                                case keyCode.UP:
                                                                  toFocus = this.headers[(currentIndex - 1 + length) % length];
                                                                  break;
                                                                case keyCode.SPACE:
                                                                case keyCode.ENTER:
                                                                  this._clickHandler({ target: event.target }, event.target);
                                                                  event.preventDefault();
                                                              }
                                                              
                                                              if (toFocus) {
                                                                $(event.target).attr('tabIndex','-1');
                                                                $(toFocus).attr('tabIndex','0');
                                                                toFocus.focus();
                                                                return false;
                                                              }
                                                              
                                                              return true;
                                                              
                                                            },
                                                            
                                                            resize: function() {
                                                              
                                                              var o = this.options, maxHeight;
                                                              
                                                              if (o.fillSpace) {
                                                                
                                                                if($.browser.msie) { var defOverflow = this.element.parent().css('overflow'); this.element.parent().css('overflow', 'hidden'); }
                                                                maxHeight = this.element.parent().height();
                                                                if($.browser.msie) { this.element.parent().css('overflow', defOverflow); }
                                                                
                                                                this.headers.each(function() {
                                                                  maxHeight -= $(this).outerHeight(true);
                                                                });
                                                                
                                                                this.headers.next().each(function() {
                                                                  $(this).height(Math.max(0, maxHeight - $(this).innerHeight() + $(this).height()));
                                                                }).css('overflow', 'auto');
                                                                
                                                              } else if ( o.autoHeight ) {
                                                                maxHeight = 0;
                                                                this.headers.next().each(function() {
                                                                  maxHeight = Math.max(maxHeight, $(this).height());
                                                                }).height(maxHeight);
                                                              }
                                                              
                                                              return this;
                                                            },
                                                            
                                                            activate: function(index) {
                                                              // TODO this gets called on init, changing the option without an explicit call for that
                                                              this.options.active = index;
                                                              // call clickHandler with custom event
                                                              var active = this._findActive(index)[0];
                                                              this._clickHandler({ target: active }, active);
                                                              
                                                              return this;
                                                            },
                                                            
                                                            _findActive: function(selector) {
                                                              return selector
                                                              ? typeof selector == "number"
                                                              ? this.headers.filter(":eq(" + selector + ")")
                                                              : this.headers.not(this.headers.not(selector))
                                                              : selector === false
                                                              ? $([])
                                                              : this.headers.filter(":eq(0)");
                                                            },
                                                            
                                                            // TODO isn't event.target enough? why the seperate target argument?
                                                            _clickHandler: function(event, target) {
                                                              
                                                              var o = this.options;
                                                              if (o.disabled)
                                                                return;
                                                              
                                                              // called only when using activate(false) to close all parts programmatically
                                                              if (!event.target) {
                                                                if (!o.collapsible)
                                                                  return;
                                                                this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all")
                                                                .find(".ui-icon").removeClass(o.icons.headerSelected).addClass(o.icons.header);
                                                                this.active.next().addClass('ui-accordion-content-active');
                                                                var toHide = this.active.next(),
                                                                data = {
                                                                  options: o,
                                                                  newHeader: $([]),
                                                                  oldHeader: o.active,
                                                                  newContent: $([]),
                                                                  oldContent: toHide
                                                                },
                                                                toShow = (this.active = $([]));
                                                                this._toggle(toShow, toHide, data);
                                                                return;
                                                              }
                                                              
                                                              // get the click target
                                                              var clicked = $(event.currentTarget || target);
                                                              var clickedIsActive = clicked[0] == this.active[0];
                                                              
                                                              // TODO the option is changed, is that correct?
                                                              // TODO if it is correct, shouldn't that happen after determining that the click is valid?
                                                              o.active = o.collapsible && clickedIsActive ? false : $('.ui-accordion-header', this.element).index(clicked);
                                                              
                                                              // if animations are still active, or the active header is the target, ignore click
                                                              if (this.running || (!o.collapsible && clickedIsActive)) {
                                                                return;
                                                              }
                                                              
                                                              // switch classes
                                                              this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all")
                                                              .find(".ui-icon").removeClass(o.icons.headerSelected).addClass(o.icons.header);
                                                              if (!clickedIsActive) {
                                                                clicked.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top")
                                                                .find(".ui-icon").removeClass(o.icons.header).addClass(o.icons.headerSelected);
                                                                clicked.next().addClass('ui-accordion-content-active');
                                                              }
                                                              
                                                              // find elements to show and hide
                                                              var toShow = clicked.next(),
                                                              toHide = this.active.next(),
                                                              data = {
                                                                options: o,
                                                                newHeader: clickedIsActive && o.collapsible ? $([]) : clicked,
                                                                oldHeader: this.active,
                                                                newContent: clickedIsActive && o.collapsible ? $([]) : toShow,
                                                                oldContent: toHide
                                                              },
                                                              down = this.headers.index( this.active[0] ) > this.headers.index( clicked[0] );
                                                              
                                                              this.active = clickedIsActive ? $([]) : clicked;
                                                              this._toggle(toShow, toHide, data, clickedIsActive, down);
                                                              
                                                              return;
                                                              
                                                            },
                                                            
                                                            _toggle: function(toShow, toHide, data, clickedIsActive, down) {
                                                              
                                                              var o = this.options, self = this;
                                                              
                                                              this.toShow = toShow;
                                                              this.toHide = toHide;
                                                              this.data = data;
                                                              
                                                              var complete = function() { if(!self) return; return self._completed.apply(self, arguments); };
                                                              
                                                              // trigger changestart event
                                                              this._trigger("changestart", null, this.data);
                                                              
                                                              // count elements to animate
                                                              this.running = toHide.size() === 0 ? toShow.size() : toHide.size();
                                                              
                                                              if (o.animated) {
                                                                
                                                                var animOptions = {};
                                                                
                                                                if ( o.collapsible && clickedIsActive ) {
                                                                  animOptions = {
                                                                    toShow: $([]),
                                                                    toHide: toHide,
                                                                    complete: complete,
                                                                    down: down,
                                                                    autoHeight: o.autoHeight || o.fillSpace
                                                                  };
                                                                } else {
                                                                  animOptions = {
                                                                    toShow: toShow,
                                                                    toHide: toHide,
                                                                    complete: complete,
                                                                    down: down,
                                                                    autoHeight: o.autoHeight || o.fillSpace
                                                                  };
                                                                }
                                                                
                                                                if (!o.proxied) {
                                                                  o.proxied = o.animated;
                                                                }
                                                                
                                                                if (!o.proxiedDuration) {
                                                                  o.proxiedDuration = o.duration;
                                                                }
                                                                
                                                                o.animated = $.isFunction(o.proxied) ?
                                                                o.proxied(animOptions) : o.proxied;
                                                                
                                                                o.duration = $.isFunction(o.proxiedDuration) ?
                                                                o.proxiedDuration(animOptions) : o.proxiedDuration;
                                                                
                                                                var animations = $.ui.accordion.animations,
                                                                duration = o.duration,
                                                                easing = o.animated;
                                                                
                                                                if (easing && !animations[easing] && !$.easing[easing]) {
                                                                  easing = 'slide';
                                                                }
                                                                if (!animations[easing]) {
                                                                  animations[easing] = function(options) {
                                                                    this.slide(options, {
                                                                      easing: easing,
                                                                               duration: duration || 700
                                                                    });
                                                                  };
                                                                }
                                                                
                                                                animations[easing](animOptions);
                                                                
                                                              } else {
                                                                
                                                                if (o.collapsible && clickedIsActive) {
                                                                  toShow.toggle();
                                                                } else {
                                                                  toHide.hide();
                                                                  toShow.show();
                                                                }
                                                                
                                                                complete(true);
                                                                
                                                              }
                                                              
                                                              // TODO assert that the blur and focus triggers are really necessary, remove otherwise
                                                              toHide.prev().attr('aria-expanded','false').attr("tabIndex", "-1").blur();
                                                              toShow.prev().attr('aria-expanded','true').attr("tabIndex", "0").focus();
                                                              
                                                            },
                                                            
                                                            _completed: function(cancel) {
                                                              
                                                              var o = this.options;
                                                              
                                                              this.running = cancel ? 0 : --this.running;
                                                              if (this.running) return;
                                                              
                                                              if (o.clearStyle) {
                                                                this.toShow.add(this.toHide).css({
                                                                  height: "",
                                                                                                 overflow: ""
                                                                });
                                                              }
                                                              
                                                              // other classes are removed before the animation; this one needs to stay until completed
                                                              this.toHide.removeClass("ui-accordion-content-active");
                                                              
                                                              this._trigger('change', null, this.data);
                                                            }
                                                            
                                     });
                                     
                                     
                                     $.extend($.ui.accordion, {
                                       version: "1.8.2",
                                              animations: {
                                                slide: function(options, additions) {
                                                  options = $.extend({
                                                    easing: "swing",
                                                                     duration: 300
                                                  }, options, additions);
                                                  if ( !options.toHide.size() ) {
                                                    options.toShow.animate({height: "show"}, options);
                                                    return;
                                                  }
                                                  if ( !options.toShow.size() ) {
                                                    options.toHide.animate({height: "hide"}, options);
                                                    return;
                                                  }
                                                  var overflow = options.toShow.css('overflow'),
                                              percentDone = 0,
                                              showProps = {},
                                              hideProps = {},
                                              fxAttrs = [ "height", "paddingTop", "paddingBottom" ],
                                              originalWidth;
                                              // fix width before calculating height of hidden element
                                              var s = options.toShow;
                                              originalWidth = s[0].style.width;
                                              s.width( parseInt(s.parent().width(),10) - parseInt(s.css("paddingLeft"),10) - parseInt(s.css("paddingRight"),10) - (parseInt(s.css("borderLeftWidth"),10) || 0) - (parseInt(s.css("borderRightWidth"),10) || 0) );
                                              
                                              $.each(fxAttrs, function(i, prop) {
                                                hideProps[prop] = 'hide';
                                                
                                                var parts = ('' + $.css(options.toShow[0], prop)).match(/^([\d+-.]+)(.*)$/);
                                                showProps[prop] = {
                                                  value: parts[1],
                                                     unit: parts[2] || 'px'
                                                };
                                              });
                                              options.toShow.css({ height: 0, overflow: 'hidden' }).show();
                                              options.toHide.filter(":hidden").each(options.complete).end().filter(":visible").animate(hideProps,{
                                                step: function(now, settings) {
                                                  // only calculate the percent when animating height
                                                  // IE gets very inconsistent results when animating elements
                                                  // with small values, which is common for padding
                                                  if (settings.prop == 'height') {
                                                    percentDone = ( settings.end - settings.start === 0 ) ? 0 :
                                                    (settings.now - settings.start) / (settings.end - settings.start);
                                                  }
                                                  
                                                  options.toShow[0].style[settings.prop] =
                                                  (percentDone * showProps[settings.prop].value) + showProps[settings.prop].unit;
                                                },
                                                                                                                                       duration: options.duration,
                                                                                                                                       easing: options.easing,
                                                                                                                                       complete: function() {
                                                                                                                                         if ( !options.autoHeight ) {
                                                                                                                                           options.toShow.css("height", "");
                                                                                                                                         }
                                                                                                                                         options.toShow.css("width", originalWidth);
                                                                                                                                         options.toShow.css({overflow: overflow});
                                                                                                                                         options.complete();
                                                                                                                                       }
                                              });
                                                },
                                                                                                                                                                   bounceslide: function(options) {
                                                                                                                                                                     this.slide(options, {
                                                                                                                                                                       easing: options.down ? "easeOutBounce" : "swing",
                                                                                                                                                                                duration: options.down ? 1000 : 200
                                                                                                                                                                     });
                                                                                                                                                                   }
                                              }
                                     });
                                     
                                   })(jQuery);
                                   /*
                                   * jQuery UI Autocomplete 1.8.2
                                   *
                                   * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
                                   * Dual licensed under the MIT (MIT-LICENSE.txt)
                                   * and GPL (GPL-LICENSE.txt) licenses.
                                   *
                                   * http://docs.jquery.com/UI/Autocomplete
                                   *
                                   * Depends:
                                   *  jquery.ui.core.js
                                   *  jquery.ui.widget.js
                                   *  jquery.ui.position.js
                                   */
                                   (function( $ ) {
                                     
                                     $.widget( "ui.autocomplete", {
                                       options: {
                                         minLength: 1,
                                               delay: 300
                                       },
                                               _create: function() {
                                                 var self = this,
                                               doc = this.element[ 0 ].ownerDocument;
                                               this.element
                                               .addClass( "ui-autocomplete-input" )
                                               .attr( "autocomplete", "off" )
                                               // TODO verify these actually work as intended
                                               .attr({
                                                 role: "textbox",
                                                     "aria-autocomplete": "list",
                                                     "aria-haspopup": "true"
                                               })
                                               .bind( "keydown.autocomplete", function( event ) {
                                                 var keyCode = $.ui.keyCode;
                                                 switch( event.keyCode ) {
                                                   case keyCode.PAGE_UP:
                                                     self._move( "previousPage", event );
                                                     break;
                                                   case keyCode.PAGE_DOWN:
                                                     self._move( "nextPage", event );
                                                     break;
                                                   case keyCode.UP:
                                                     self._move( "previous", event );
                                                     // prevent moving cursor to beginning of text field in some browsers
                                                     event.preventDefault();
                                                     break;
                                                   case keyCode.DOWN:
                                                     self._move( "next", event );
                                                     // prevent moving cursor to end of text field in some browsers
                                                     event.preventDefault();
                                                     break;
                                                   case keyCode.ENTER:
                                                   case keyCode.NUMPAD_ENTER:
                                                     // when menu is open or has focus
                                                     if ( self.menu.active ) {
                                                       event.preventDefault();
                                                     }
                                                     //passthrough - ENTER and TAB both select the current element
                                                   case keyCode.TAB:
                                                     if ( !self.menu.active ) {
                                                       return;
                                                     }
                                                     self.menu.select( event );
                                                     break;
                                                   case keyCode.ESCAPE:
                                                     self.element.val( self.term );
                                                     self.close( event );
                                                     break;
                                                   case keyCode.LEFT:
                                                   case keyCode.RIGHT:
                                                   case keyCode.SHIFT:
                                                   case keyCode.CONTROL:
                                                   case keyCode.ALT:
                                                   case keyCode.COMMAND:
                                                   case keyCode.COMMAND_RIGHT:
                                                   case keyCode.INSERT:
                                                   case keyCode.CAPS_LOCK:
                                                   case keyCode.END:
                                                   case keyCode.HOME:
                                                     // ignore metakeys (shift, ctrl, alt)
                                                     break;
                                                   default:
                                                     // keypress is triggered before the input value is changed
                                                     clearTimeout( self.searching );
                                                     self.searching = setTimeout(function() {
                                                       self.search( null, event );
                                                     }, self.options.delay );
                                                     break;
                                                 }
                                               })
                                               .bind( "focus.autocomplete", function() {
                                                 self.selectedItem = null;
                                                 self.previous = self.element.val();
                                               })
                                               .bind( "blur.autocomplete", function( event ) {
                                                 clearTimeout( self.searching );
                                                 // clicks on the menu (or a button to trigger a search) will cause a blur event
                                                 self.closing = setTimeout(function() {
                                                   self.close( event );
                                                   self._change( event );
                                                 }, 150 );
                                               });
                                               this._initSource();
                                               this.response = function() {
                                                 return self._response.apply( self, arguments );
                                               };
                                               this.menu = $( "<ul></ul>" )
                                               .addClass( "ui-autocomplete" )
                                               .appendTo( "body", doc )
                                               // prevent the close-on-blur in case of a "slow" click on the menu (long mousedown)
                                               .mousedown(function() {
                                                 // use another timeout to make sure the blur-event-handler on the input was already triggered
                                                 setTimeout(function() {
                                                   clearTimeout( self.closing );
                                                 }, 13);
                                               })
                                               .menu({
                                                 focus: function( event, ui ) {
                                                   var item = ui.item.data( "item.autocomplete" );
                                                   if ( false !== self._trigger( "focus", null, { item: item } ) ) {
                                                     // use value to match what will end up in the input, if it was a key event
                                                     if ( /^key/.test(event.originalEvent.type) ) {
                                                       self.element.val( item.value );
                                                     }
                                                   }
                                                 },
                                                     selected: function( event, ui ) {
                                                       var item = ui.item.data( "item.autocomplete" );
                                                       if ( false !== self._trigger( "select", event, { item: item } ) ) {
                                                         self.element.val( item.value );
                                                       }
                                                       self.close( event );
                                                       // only trigger when focus was lost (click on menu)
                                                       var previous = self.previous;
                                                       if ( self.element[0] !== doc.activeElement ) {
                                                         self.element.focus();
                                                         self.previous = previous;
                                                       }
                                                       self.selectedItem = item;
                                                     },
                                                     blur: function( event, ui ) {
                                                       if ( self.menu.element.is(":visible") ) {
                                                         self.element.val( self.term );
                                                       }
                                                     }
                                               })
                                               .zIndex( this.element.zIndex() + 1 )
                                               // workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781
                                               .css({ top: 0, left: 0 })
                                               .hide()
                                               .data( "menu" );
                                               if ( $.fn.bgiframe ) {
                                                 this.menu.element.bgiframe();
                                               }
                                               },
                                    
                                    destroy: function() {
                                      this.element
                                      .removeClass( "ui-autocomplete-input" )
                                      .removeAttr( "autocomplete" )
                                      .removeAttr( "role" )
                                      .removeAttr( "aria-autocomplete" )
                                      .removeAttr( "aria-haspopup" );
                                      this.menu.element.remove();
                                      $.Widget.prototype.destroy.call( this );
                                    },
                                    
                                    _setOption: function( key ) {
                                      $.Widget.prototype._setOption.apply( this, arguments );
                                      if ( key === "source" ) {
                                        this._initSource();
                                      }
                                    },
                                    
                                    _initSource: function() {
                                      var array,
                                    url;
                                    if ( $.isArray(this.options.source) ) {
                                      array = this.options.source;
                                      this.source = function( request, response ) {
                                        response( $.ui.autocomplete.filter(array, request.term) );
                                      };
                                    } else if ( typeof this.options.source === "string" ) {
                                      url = this.options.source;
                                      this.source = function( request, response ) {
                                        $.getJSON( url, request, response );
                                      };
                                    } else {
                                      this.source = this.options.source;
                                    }
                                    },
                                    
                                    search: function( value, event ) {
                                      value = value != null ? value : this.element.val();
                                      if ( value.length < this.options.minLength ) {
                                        return this.close( event );
                                      }
                                      
                                      clearTimeout( this.closing );
                                      if ( this._trigger("search") === false ) {
                                        return;
                                      }
                                      
                                      return this._search( value );
                                    },
                                    
                                    _search: function( value ) {
                                      this.term = this.element
                                      .addClass( "ui-autocomplete-loading" )
                                      // always save the actual value, not the one passed as an argument
                                      .val();
                                      
                                      this.source( { term: value }, this.response );
                                    },
                                    
                                    _response: function( content ) {
                                      if ( content.length ) {
                                        content = this._normalize( content );
                                        this._suggest( content );
                                        this._trigger( "open" );
                                      } else {
                                        this.close();
                                      }
                                      this.element.removeClass( "ui-autocomplete-loading" );
                                    },
                                    
                                    close: function( event ) {
                                      clearTimeout( this.closing );
                                      if ( this.menu.element.is(":visible") ) {
                                        this._trigger( "close", event );
                                        this.menu.element.hide();
                                        this.menu.deactivate();
                                      }
                                    },
                                    
                                    _change: function( event ) {
                                      if ( this.previous !== this.element.val() ) {
                                        this._trigger( "change", event, { item: this.selectedItem } );
                                      }
                                    },
                                    
                                    _normalize: function( items ) {
                                      // assume all items have the right format when the first item is complete
                                      if ( items.length && items[0].label && items[0].value ) {
                                        return items;
                                      }
                                      return $.map( items, function(item) {
                                        if ( typeof item === "string" ) {
                                          return {
                                            label: item,
                                                    value: item
                                          };
                                        }
                                        return $.extend({
                                          label: item.label || item.value,
                                                        value: item.value || item.label
                                        }, item );
                                      });
                                    },
                                    
                                    _suggest: function( items ) {
                                      var ul = this.menu.element
                                      .empty()
                                      .zIndex( this.element.zIndex() + 1 ),
                                    menuWidth,
                                    textWidth;
                                    this._renderMenu( ul, items );
                                    // TODO refresh should check if the active item is still in the dom, removing the need for a manual deactivate
                                    this.menu.deactivate();
                                    this.menu.refresh();
                                    this.menu.element.show().position({
                                      my: "left top",
                                                                      at: "left bottom",
                                                                      of: this.element,
                                                                      collision: "none"
                                    });
                                    
                                    menuWidth = ul.width( "" ).width();
                                    textWidth = this.element.width();
                                    ul.width( Math.max( menuWidth, textWidth ) );
                                    },
                                    
                                    _renderMenu: function( ul, items ) {
                                      var self = this;
                                      $.each( items, function( index, item ) {
                                        self._renderItem( ul, item );
                                      });
                                    },
                                    
                                    _renderItem: function( ul, item) {
                                      return $( "<li></li>" )
                                      .data( "item.autocomplete", item )
                                      .append( "<a>" + item.label + "</a>" )
                                      .appendTo( ul );
                                    },
                                    
                                    _move: function( direction, event ) {
                                      if ( !this.menu.element.is(":visible") ) {
                                        this.search( null, event );
                                        return;
                                      }
                                      if ( this.menu.first() && /^previous/.test(direction) ||
                                        this.menu.last() && /^next/.test(direction) ) {
                                        this.element.val( this.term );
                                      this.menu.deactivate();
                                      return;
                                      }
                                      this.menu[ direction ]( event );
                                    },
                                    
                                    widget: function() {
                                      return this.menu.element;
                                    }
                                     });
                                     
                                     $.extend( $.ui.autocomplete, {
                                       escapeRegex: function( value ) {
                                         return value.replace( /([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1" );
                                       },
                                       filter: function(array, term) {
                                         var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
                                         return $.grep( array, function(value) {
                                           return matcher.test( value.label || value.value || value );
                                         });
                                       }
                                     });
                                     
                                   }( jQuery ));
                                   
                                   /*
                                   * jQuery UI Menu (not officially released)
                                   * 
                                   * This widget isn't yet finished and the API is subject to change. We plan to finish
                                   * it for the next release. You're welcome to give it a try anyway and give us feedback,
                                   * as long as you're okay with migrating your code later on. We can help with that, too.
                                   *
                                   * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
                                   * Dual licensed under the MIT (MIT-LICENSE.txt)
                                   * and GPL (GPL-LICENSE.txt) licenses.
                                   *
                                   * http://docs.jquery.com/UI/Menu
                                   *
                                   * Depends:
                                   *  jquery.ui.core.js
                                   *  jquery.ui.widget.js
                                   */
                                   (function($) {
                                     
                                     $.widget("ui.menu", {
                                       _create: function() {
                                         var self = this;
                                         this.element
                                         .addClass("ui-menu ui-widget ui-widget-content ui-corner-all")
                                         .attr({
                                           role: "listbox",
                                               "aria-activedescendant": "ui-active-menuitem"
                                         })
                                         .click(function( event ) {
                                           if ( !$( event.target ).closest( ".ui-menu-item a" ).length ) {
                                     return;
                                   }
                                   // temporary
                                   event.preventDefault();
                                   self.select( event );
                                         });
                                         this.refresh();
                                       },
                                       
                                       refresh: function() {
                                         var self = this;
                                         
                                         // don't refresh list items that are already adapted
                                         var items = this.element.children("li:not(.ui-menu-item):has(a)")
                                         .addClass("ui-menu-item")
                                         .attr("role", "menuitem");
                                         
                                         items.children("a")
                                         .addClass("ui-corner-all")
                                         .attr("tabindex", -1)
                                         // mouseenter doesn't work with event delegation
                                         .mouseenter(function( event ) {
                                           self.activate( event, $(this).parent() );
                                         })
                                         .mouseleave(function() {
                                           self.deactivate();
                                         });
                                       },
                                       
                                       activate: function( event, item ) {
                                         this.deactivate();
                                         if (this.hasScroll()) {
                                           var offset = item.offset().top - this.element.offset().top,
                                           scroll = this.element.attr("scrollTop"),
                                           elementHeight = this.element.height();
                                           if (offset < 0) {
                                             this.element.attr("scrollTop", scroll + offset);
                                           } else if (offset > elementHeight) {
                                             this.element.attr("scrollTop", scroll + offset - elementHeight + item.height());
                                           }
                                         }
                                         this.active = item.eq(0)
                                         .children("a")
                                         .addClass("ui-state-hover")
                                         .attr("id", "ui-active-menuitem")
                                         .end();
                                         this._trigger("focus", event, { item: item });
                                       },
                                       
                                       deactivate: function() {
                                         if (!this.active) { return; }
                                         
                                         this.active.children("a")
                                         .removeClass("ui-state-hover")
                                         .removeAttr("id");
                                         this._trigger("blur");
                                         this.active = null;
                                       },
                                       
                                       next: function(event) {
                                         this.move("next", ".ui-menu-item:first", event);
                                       },
                                       
                                       previous: function(event) {
                                         this.move("prev", ".ui-menu-item:last", event);
                                       },
                                       
                                       first: function() {
                                         return this.active && !this.active.prev().length;
                                       },
                                       
                                       last: function() {
                                         return this.active && !this.active.next().length;
                                       },
                                       
                                       move: function(direction, edge, event) {
                                         if (!this.active) {
                                           this.activate(event, this.element.children(edge));
                                           return;
                                         }
                                         var next = this.active[direction + "All"](".ui-menu-item").eq(0);
                                         if (next.length) {
                                           this.activate(event, next);
                                         } else {
                                           this.activate(event, this.element.children(edge));
                                         }
                                       },
                                       
                                       // TODO merge with previousPage
                                       nextPage: function(event) {
                                         if (this.hasScroll()) {
                                           // TODO merge with no-scroll-else
                                           if (!this.active || this.last()) {
                                             this.activate(event, this.element.children(":first"));
                                             return;
                                           }
                                           var base = this.active.offset().top,
                                           height = this.element.height(),
                                           result = this.element.children("li").filter(function() {
                                             var close = $(this).offset().top - base - height + $(this).height();
                                             // TODO improve approximation
                                             return close < 10 && close > -10;
                                           });
                                           
                                           // TODO try to catch this earlier when scrollTop indicates the last page anyway
                                           if (!result.length) {
                                             result = this.element.children(":last");
                                           }
                                           this.activate(event, result);
                                         } else {
                                           this.activate(event, this.element.children(!this.active || this.last() ? ":first" : ":last"));
                                         }
                                       },
                                       
                                       // TODO merge with nextPage
                                       previousPage: function(event) {
                                         if (this.hasScroll()) {
                                           // TODO merge with no-scroll-else
                                           if (!this.active || this.first()) {
                                             this.activate(event, this.element.children(":last"));
                                             return;
                                           }
                                           
                                           var base = this.active.offset().top,
                                           height = this.element.height();
                                           result = this.element.children("li").filter(function() {
                                             var close = $(this).offset().top - base + height - $(this).height();
                                             // TODO improve approximation
                                             return close < 10 && close > -10;
                                           });
                                           
                                           // TODO try to catch this earlier when scrollTop indicates the last page anyway
                                           if (!result.length) {
                                             result = this.element.children(":first");
                                           }
                                           this.activate(event, result);
                                         } else {
                                           this.activate(event, this.element.children(!this.active || this.first() ? ":last" : ":first"));
                                         }
                                       },
                                       
                                       hasScroll: function() {
                                         return this.element.height() < this.element.attr("scrollHeight");
                                       },
                                       
                                       select: function( event ) {
                                         this._trigger("selected", event, { item: this.active });
                                       }
                                     });
                                     
                                   }(jQuery));
                                   /*
                                   * jQuery UI Button 1.8.2
                                   *
                                   * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
                                   * Dual licensed under the MIT (MIT-LICENSE.txt)
                                   * and GPL (GPL-LICENSE.txt) licenses.
                                   *
                                   * http://docs.jquery.com/UI/Button
                                   *
                                   * Depends:
                                   *  jquery.ui.core.js
                                   *  jquery.ui.widget.js
                                   */
                                   (function( $ ) {
                                     
                                     var lastActive,
                                    baseClasses = "ui-button ui-widget ui-state-default ui-corner-all",
                                    stateClasses = "ui-state-hover ui-state-active ",
                                    typeClasses = "ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon ui-button-text-only",
                                    formResetHandler = function( event ) {
                                      $( ":ui-button", event.target.form ).each(function() {
                                        var inst = $( this ).data( "button" );
                                        setTimeout(function() {
                                          inst.refresh();
                                        }, 1 );
                                      });
                                    },
                                    radioGroup = function( radio ) {
                                      var name = radio.name,
                                    form = radio.form,
                                      radios = $( [] );
                                    if ( name ) {
                                      if ( form ) {
                                        radios = $( form ).find( "[name='" + name + "']" );
                                      } else {
                                        radios = $( "[name='" + name + "']", radio.ownerDocument )
                                        .filter(function() {
                                          return !this.form;
                                        });
                                      }
                                    }
                                    return radios;
                                    };
                                    
                                    $.widget( "ui.button", {
                                      options: {
                                        text: true,
                                              label: null,
                                              icons: {
                                                primary: null,
                                              secondary: null
                                              }
                                      },
                                              _create: function() {
                                                this.element.closest( "form" )
                                                .unbind( "reset.button" )
                                                .bind( "reset.button", formResetHandler );
                                                
                                                this._determineButtonType();
                                                this.hasTitle = !!this.buttonElement.attr( "title" );
                                                
                                                var self = this,
                                              options = this.options,
                                              toggleButton = this.type === "checkbox" || this.type === "radio",
                                              hoverClass = "ui-state-hover" + ( !toggleButton ? " ui-state-active" : "" ),
                                    focusClass = "ui-state-focus";
                                    
                                    if ( options.label === null ) {
                                      options.label = this.buttonElement.html();
                                    }
                                    
                                    if ( this.element.is( ":disabled" ) ) {
                                      options.disabled = true;
                                    }
                                    
                                    this.buttonElement
                                    .addClass( baseClasses )
                                    .attr( "role", "button" )
                                    .bind( "mouseenter.button", function() {
                                      if ( options.disabled ) {
                                        return;
                                      }
                                      $( this ).addClass( "ui-state-hover" );
                                      if ( this === lastActive ) {
                                        $( this ).addClass( "ui-state-active" );
                                      }
                                    })
                                    .bind( "mouseleave.button", function() {
                                      if ( options.disabled ) {
                                        return;
                                      }
                                      $( this ).removeClass( hoverClass );
                                    })
                                    .bind( "focus.button", function() {
                                      // no need to check disabled, focus won't be triggered anyway
                                      $( this ).addClass( focusClass );
                                    })
                                    .bind( "blur.button", function() {
                                      $( this ).removeClass( focusClass );
                                    });
                                    
                                    if ( toggleButton ) {
                                      this.element.bind( "change.button", function() {
                                        self.refresh();
                                      });
                                    }
                                    
                                    if ( this.type === "checkbox" ) {
                                      this.buttonElement.bind( "click.button", function() {
                                        if ( options.disabled ) {
                                          return false;
                                        }
                                        $( this ).toggleClass( "ui-state-active" );
                                        self.buttonElement.attr( "aria-pressed", self.element[0].checked );
                                      });
                                    } else if ( this.type === "radio" ) {
                                      this.buttonElement.bind( "click.button", function() {
                                        if ( options.disabled ) {
                                          return false;
                                        }
                                        $( this ).addClass( "ui-state-active" );
                                        self.buttonElement.attr( "aria-pressed", true );
                                        
                                        var radio = self.element[ 0 ];
                                        radioGroup( radio )
                                        .not( radio )
                                        .map(function() {
                                          return $( this ).button( "widget" )[ 0 ];
                                        })
                                        .removeClass( "ui-state-active" )
                                        .attr( "aria-pressed", false );
                                      });
                                    } else {
                                      this.buttonElement
                                      .bind( "mousedown.button", function() {
                                        if ( options.disabled ) {
                                          return false;
                                        }
                                        $( this ).addClass( "ui-state-active" );
                                        lastActive = this;
                                        $( document ).one( "mouseup", function() {
                                          lastActive = null;
                                        });
                                      })
                                      .bind( "mouseup.button", function() {
                                        if ( options.disabled ) {
                                          return false;
                                        }
                                        $( this ).removeClass( "ui-state-active" );
                                      })
                                      .bind( "keydown.button", function(event) {
                                        if ( options.disabled ) {
                                          return false;
                                        }
                                        if ( event.keyCode == $.ui.keyCode.SPACE || event.keyCode == $.ui.keyCode.ENTER ) {
                                          $( this ).addClass( "ui-state-active" );
                                        }
                                      })
                                      .bind( "keyup.button", function() {
                                        $( this ).removeClass( "ui-state-active" );
                                      });
                                      
                                      if ( this.buttonElement.is("a") ) {
                                        this.buttonElement.keyup(function(event) {
                                          if ( event.keyCode === $.ui.keyCode.SPACE ) {
                                            // TODO pass through original event correctly (just as 2nd argument doesn't work)
                                            $( this ).click();
                                          }
                                        });
                                      }
                                    }
                                    
                                    // TODO: pull out $.Widget's handling for the disabled option into
                                    // $.Widget.prototype._setOptionDisabled so it's easy to proxy and can
                                    // be overridden by individual plugins
                                    this._setOption( "disabled", options.disabled );
                                    },
                                    
                                    _determineButtonType: function() {
                                      
                                      if ( this.element.is(":checkbox") ) {
                                        this.type = "checkbox";
                                      } else {
                                        if ( this.element.is(":radio") ) {
                                          this.type = "radio";
                                        } else {
                                          if ( this.element.is("input") ) {
                                            this.type = "input";
                                          } else {
                                            this.type = "button";
                                          }
                                        }
                                      }
                                      
                                      if ( this.type === "checkbox" || this.type === "radio" ) {
                                        // we don't search against the document in case the element
                                        // is disconnected from the DOM
                                        this.buttonElement = this.element.parents().last()
                                        .find( "[for=" + this.element.attr("id") + "]" );
                                        this.element.addClass( "ui-helper-hidden-accessible" );
                                        
                                        var checked = this.element.is( ":checked" );
                                        if ( checked ) {
                                          this.buttonElement.addClass( "ui-state-active" );
                                        }
                                        this.buttonElement.attr( "aria-pressed", checked );
                                      } else {
                                        this.buttonElement = this.element;
                                      }
                                    },
                                    
                                    widget: function() {
                                      return this.buttonElement;
                                    },
                                    
                                    destroy: function() {
                                      this.element
                                      .removeClass( "ui-helper-hidden-accessible" );
                                      this.buttonElement
                                      .removeClass( baseClasses + " " + stateClasses + " " + typeClasses )
                                      .removeAttr( "role" )
                                      .removeAttr( "aria-pressed" )
                                      .html( this.buttonElement.find(".ui-button-text").html() );
                                      
                                      if ( !this.hasTitle ) {
                                        this.buttonElement.removeAttr( "title" );
                                      }
                                      
                                      $.Widget.prototype.destroy.call( this );
                                    },
                                    
                                    _setOption: function( key, value ) {
                                      $.Widget.prototype._setOption.apply( this, arguments );
                                      if ( key === "disabled" ) {
                                        if ( value ) {
                                          this.element.attr( "disabled", true );
                                        } else {
                                          this.element.removeAttr( "disabled" );
                                        }
                                      }
                                      this._resetButton();
                                    },
                                    
                                    refresh: function() {
                                      var isDisabled = this.element.is( ":disabled" );
                                      if ( isDisabled !== this.options.disabled ) {
                                        this._setOption( "disabled", isDisabled );
                                      }
                                      if ( this.type === "radio" ) {
                                        radioGroup( this.element[0] ).each(function() {
                                          if ( $( this ).is( ":checked" ) ) {
                                            $( this ).button( "widget" )
                                            .addClass( "ui-state-active" )
                                            .attr( "aria-pressed", true );
                                          } else {
                                            $( this ).button( "widget" )
                                            .removeClass( "ui-state-active" )
                                            .attr( "aria-pressed", false );
                                          }
                                        });
                                      } else if ( this.type === "checkbox" ) {
                                        if ( this.element.is( ":checked" ) ) {
                                          this.buttonElement
                                          .addClass( "ui-state-active" )
                                          .attr( "aria-pressed", true );
                                        } else {
                                          this.buttonElement
                                          .removeClass( "ui-state-active" )
                                          .attr( "aria-pressed", false );
                                        }
                                      }
                                      },
                                      
                                      _resetButton: function() {
                                        if ( this.type === "input" ) {
                                          if ( this.options.label ) {
                                            this.element.val( this.options.label );
                                          }
                                          return;
                                        }
                                        var buttonElement = this.buttonElement.removeClass( typeClasses ),
                                        buttonText = $( "<span></span>" )
                                        .addClass( "ui-button-text" )
                                        .html( this.options.label )
                                        .appendTo( buttonElement.empty() )
                                        .text(),
                                        icons = this.options.icons,
                                        multipleIcons = icons.primary && icons.secondary;
                                        if ( icons.primary || icons.secondary ) {
                                          buttonElement.addClass( "ui-button-text-icon" +
                                          ( multipleIcons ? "s" : "" ) );
                                          if ( icons.primary ) {
                                            buttonElement.prepend( "<span class='ui-button-icon-primary ui-icon " + icons.primary + "'></span>" );
                                          }
                                          if ( icons.secondary ) {
                                            buttonElement.append( "<span class='ui-button-icon-secondary ui-icon " + icons.secondary + "'></span>" );
                                          }
                                          if ( !this.options.text ) {
                                            buttonElement
                                            .addClass( multipleIcons ? "ui-button-icons-only" : "ui-button-icon-only" )
                                            .removeClass( "ui-button-text-icons ui-button-text-icon" );
                                            if ( !this.hasTitle ) {
                                              buttonElement.attr( "title", buttonText );
                                            }
                                          }
                                        } else {
                                          buttonElement.addClass( "ui-button-text-only" );
                                        }
                                      }
                                    });
                                    
                                    $.widget( "ui.buttonset", {
                                      _create: function() {
                                        this.element.addClass( "ui-buttonset" );
                                        this._init();
                                      },
                                              
                                              _init: function() {
                                                this.refresh();
                                              },
                                              
                                              _setOption: function( key, value ) {
                                                if ( key === "disabled" ) {
                                                  this.buttons.button( "option", key, value );
                                                }
                                                
                                                $.Widget.prototype._setOption.apply( this, arguments );
                                              },
                                              
                                              refresh: function() {
                                                this.buttons = this.element.find( ":button, :submit, :reset, :checkbox, :radio, a, :data(button)" )
                                                .filter( ":ui-button" )
                                                .button( "refresh" )
                                                .end()
                                                .not( ":ui-button" )
                                                .button()
                                                .end()
                                                .map(function() {
                                                  return $( this ).button( "widget" )[ 0 ];
                                                })
                                                .removeClass( "ui-corner-all ui-corner-left ui-corner-right" )
                                                .filter( ":first" )
                                                .addClass( "ui-corner-left" )
                                                .end()
                                                .filter( ":last" )
                                                .addClass( "ui-corner-right" )
                                                .end()
                                                .end();
                                              },
                                              
                                              destroy: function() {
                                                this.element.removeClass( "ui-buttonset" );
                                                this.buttons
                                                .map(function() {
                                                  return $( this ).button( "widget" )[ 0 ];
                                                })
                                                .removeClass( "ui-corner-left ui-corner-right" )
                                                .end()
                                                .button( "destroy" );
                                                
                                                $.Widget.prototype.destroy.call( this );
                                              }
                                    });
                                    
                                              }( jQuery ) );
                                              /*
                                              * jQuery UI Datepicker 1.8.2
                                              *
                                              * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
                                              * Dual licensed under the MIT (MIT-LICENSE.txt)
                                              * and GPL (GPL-LICENSE.txt) licenses.
                                              *
                                              * http://docs.jquery.com/UI/Datepicker
                                              *
                                              * Depends:
                                              *  jquery.ui.core.js
                                              */
                                              
                                              (function($) { // hide the namespace
                                              
                                              $.extend($.ui, { datepicker: { version: "1.8.2" } });
                                              
                                              var PROP_NAME = 'datepicker';
                                              var dpuuid = new Date().getTime();
                                              
                                              /* Date picker manager.
                                              Use the singleton instance of this class, $.datepicker, to interact with the date picker.
                                              Settings for (groups of) date pickers are maintained in an instance object,
                                               allowing multiple different settings on the same page. */
                                              
                                              function Datepicker() {
                                                this.debug = false; // Change this to true to start debugging
                                                this._curInst = null; // The current instance in use
                                                this._keyEvent = false; // If the last event was a key event
                                                this._disabledInputs = []; // List of date picker inputs that have been disabled
                                                this._datepickerShowing = false; // True if the popup picker is showing , false if not
                                                this._inDialog = false; // True if showing within a "dialog", false if not
                                                this._mainDivId = 'ui-datepicker-div'; // The ID of the main datepicker division
                                                this._inlineClass = 'ui-datepicker-inline'; // The name of the inline marker class
                                                this._appendClass = 'ui-datepicker-append'; // The name of the append marker class
                                                this._triggerClass = 'ui-datepicker-trigger'; // The name of the trigger marker class
                                                this._dialogClass = 'ui-datepicker-dialog'; // The name of the dialog marker class
                                                this._disableClass = 'ui-datepicker-disabled'; // The name of the disabled covering marker class
                                                this._unselectableClass = 'ui-datepicker-unselectable'; // The name of the unselectable cell marker class
                                                this._currentClass = 'ui-datepicker-current-day'; // The name of the current day marker class
                                                this._dayOverClass = 'ui-datepicker-days-cell-over'; // The name of the day hover marker class
                                                this.regional = []; // Available regional settings, indexed by language code
                                                this.regional[''] = { // Default regional settings
                                                closeText: 'Done', // Display text for close link
                                               prevText: 'Prev', // Display text for previous month link
                                               nextText: 'Next', // Display text for next month link
                                               currentText: 'Today', // Display text for current month link
                                               monthNames: ['January','February','March','April','May','June',
                                               'July','August','September','October','November','December'], // Names of months for drop-down and formatting
                                               monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], // For formatting
                                               dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], // For formatting
                                               dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], // For formatting
                                               dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'], // Column headings for days starting at Sunday
                                               weekHeader: 'Wk', // Column header for week of the year
                                               dateFormat: 'mm/dd/yy', // See format options on parseDate
                                               firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
                                               isRTL: false, // True if right-to-left language, false if left-to-right
                                               showMonthAfterYear: false, // True if the year select precedes month, false for month then year
                                               yearSuffix: '' // Additional text to append to the year in the month headers
                                                };
                                                this._defaults = { // Global defaults for all the date picker instances
                                                showOn: 'focus', // 'focus' for popup on focus,
                                               // 'button' for trigger button, or 'both' for either
                                               showAnim: 'fadeIn', // Name of jQuery animation for popup
                                               showOptions: {}, // Options for enhanced animations
                                               defaultDate: null, // Used when field is blank: actual date,
                                                 // +/-number for offset from today, null for today
                                                 appendText: '', // Display text following the input box, e.g. showing the format
                                               buttonText: '...', // Text for trigger button
                                               buttonImage: '', // URL for trigger button image
                                               buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
                                               hideIfNoPrevNext: false, // True to hide next/previous month links
                                               // if not applicable, false to just disable them
                                               navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
                                               gotoCurrent: false, // True if today link goes back to current selection instead
                                               changeMonth: false, // True if month can be selected directly, false if only prev/next
                                               changeYear: false, // True if year can be selected directly, false if only prev/next
                                               yearRange: 'c-10:c+10', // Range of years to display in drop-down,
                                               // either relative to today's year (-nn:+nn), relative to currently displayed year
                                               // (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
                                               showOtherMonths: false, // True to show dates in other months, false to leave blank
                                               selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable
                                               showWeek: false, // True to show week of the year, false to not show it
                                               calculateWeek: this.iso8601Week, // How to calculate the week of the year,
                                               // takes a Date and returns the number of the week for it
                                               shortYearCutoff: '+10', // Short year values < this are in the current century,
                                               // > this are in the previous century,
                                               // string value starting with '+' for current year + value
                                               minDate: null, // The earliest selectable date, or null for no limit
                                               maxDate: null, // The latest selectable date, or null for no limit
                                               duration: 'fast', // Duration of display/closure
                                               beforeShowDay: null, // Function that takes a date and returns an array with
                                               // [0] = true if selectable, false if not, [1] = custom CSS class name(s) or '',
                                               // [2] = cell title (optional), e.g. $.datepicker.noWeekends
                                               beforeShow: null, // Function that takes an input field and
                                               // returns a set of custom settings for the date picker
                                               onSelect: null, // Define a callback function when a date is selected
                                               onChangeMonthYear: null, // Define a callback function when the month or year is changed
                                               onClose: null, // Define a callback function when the datepicker is closed
                                               numberOfMonths: 1, // Number of months to show at a time
                                               showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)
                                               stepMonths: 1, // Number of months to step back/forward
                                               stepBigMonths: 12, // Number of months to step back/forward for the big links
                                               altField: '', // Selector for an alternate field to store selected dates into
                                               altFormat: '', // The date format to use for the alternate field
                                               constrainInput: true, // The input is constrained by the current date format
                                               showButtonPanel: false, // True to show button panel, false to not show it
                                               autoSize: false // True to size the input for the date format, false to leave as is
                                              };
                                              $.extend(this._defaults, this.regional['']);
                                              this.dpDiv = $('<div id="' + this._mainDivId + '" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all ui-helper-hidden-accessible"></div>');
                                              }
                                              
                                              $.extend(Datepicker.prototype, {
                                                /* Class name added to elements to indicate already configured with a date picker. */
                                                markerClassName: 'hasDatepicker',
                                                       
                                                       /* Debug logging (if enabled). */
                                                       log: function () {
                                                         if (this.debug)
                                                           console.log.apply('', arguments);
                                                       },
                                                       
                                                       // TODO rename to "widget" when switching to widget factory
                                                       _widgetDatepicker: function() {
                                                         return this.dpDiv;
                                                       },
                                                       
                                                       /* Override the default settings for all instances of the date picker.
                                                       @param  settings  object - the new settings to use as defaults (anonymous object)
                                                       @return the manager object */
                                                       setDefaults: function(settings) {
                                                         extendRemove(this._defaults, settings || {});
                                                         return this;
                                                       },
                                                       
                                                       /* Attach the date picker to a jQuery selection.
                                                       @param  target    element - the target input field or division or span
                                                       @param  settings  object - the new settings to use for this date picker instance (anonymous) */
                                                       _attachDatepicker: function(target, settings) {
                                                         // check for settings on the control itself - in namespace 'date:'
                                                         var inlineSettings = null;
                                                         for (var attrName in this._defaults) {
                                                           var attrValue = target.getAttribute('date:' + attrName);
                                                           if (attrValue) {
                                                             inlineSettings = inlineSettings || {};
                                                             try {
                                                               inlineSettings[attrName] = eval(attrValue);
                                                             } catch (err) {
                                                               inlineSettings[attrName] = attrValue;
                                                             }
                                                           }
                                                         }
                                                         var nodeName = target.nodeName.toLowerCase();
                                                         var inline = (nodeName == 'div' || nodeName == 'span');
                                                         if (!target.id) {
                                                           this.uuid += 1;
                                                           target.id = 'dp' + this.uuid;
                                                         }
                                                         var inst = this._newInst($(target), inline);
                                                         inst.settings = $.extend({}, settings || {}, inlineSettings || {});
                                                         if (nodeName == 'input') {
                                                           this._connectDatepicker(target, inst);
                                                         } else if (inline) {
                                                           this._inlineDatepicker(target, inst);
                                                         }
                                                       },
                                                       
                                                       /* Create a new instance object. */
                                                       _newInst: function(target, inline) {
                                                         var id = target[0].id.replace(/([^A-Za-z0-9_])/g, '\\\\$1'); // escape jQuery meta chars
                                                         return {id: id, input: target, // associated target
                                                         selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
                                                         drawMonth: 0, drawYear: 0, // month being drawn
                                                         inline: inline, // is datepicker inline or not
                                                         dpDiv: (!inline ? this.dpDiv : // presentation div
                                                         $('<div class="' + this._inlineClass + ' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'))};
                                                       },
                                                       
                                                       /* Attach the date picker to an input field. */
                                                       _connectDatepicker: function(target, inst) {
                                                         var input = $(target);
                                                         inst.append = $([]);
                                                         inst.trigger = $([]);
                                                         if (input.hasClass(this.markerClassName))
                                                           return;
                                                         this._attachments(input, inst);
                                                         input.addClass(this.markerClassName).keydown(this._doKeyDown).
                                                         keypress(this._doKeyPress).keyup(this._doKeyUp).
                                                         bind("setData.datepicker", function(event, key, value) {
                                                           inst.settings[key] = value;
                                                         }).bind("getData.datepicker", function(event, key) {
                                                           return this._get(inst, key);
                                                         });
                                                         this._autoSize(inst);
                                                         $.data(target, PROP_NAME, inst);
                                                       },
                                                       
                                                       /* Make attachments based on settings. */
                                                       _attachments: function(input, inst) {
                                                         var appendText = this._get(inst, 'appendText');
                                                         var isRTL = this._get(inst, 'isRTL');
                                                         if (inst.append)
                                                           inst.append.remove();
                                                         if (appendText) {
                                                           inst.append = $('<span class="' + this._appendClass + '">' + appendText + '</span>');
                                                           input[isRTL ? 'before' : 'after'](inst.append);
                                                         }
                                                         input.unbind('focus', this._showDatepicker);
                                                         if (inst.trigger)
                                                           inst.trigger.remove();
                                                         var showOn = this._get(inst, 'showOn');
                                                         if (showOn == 'focus' || showOn == 'both') // pop-up date picker when in the marked field
                                                           input.focus(this._showDatepicker);
                                                         if (showOn == 'button' || showOn == 'both') { // pop-up date picker when button clicked
                                                           var buttonText = this._get(inst, 'buttonText');
                                                           var buttonImage = this._get(inst, 'buttonImage');
                                                           inst.trigger = $(this._get(inst, 'buttonImageOnly') ?
                                                           $('<img/>').addClass(this._triggerClass).
                                                           attr({ src: buttonImage, alt: buttonText, title: buttonText }) :
                                                           $('<button type="button"></button>').addClass(this._triggerClass).
                                                           html(buttonImage == '' ? buttonText : $('<img/>').attr(
                                                           { src:buttonImage, alt:buttonText, title:buttonText })));
                                                           input[isRTL ? 'before' : 'after'](inst.trigger);
                                                           inst.trigger.click(function() {
                                                             if ($.datepicker._datepickerShowing && $.datepicker._lastInput == input[0])
                                                               $.datepicker._hideDatepicker();
                                                             else
                                                               $.datepicker._showDatepicker(input[0]);
                                                             return false;
                                                           });
                                                         }
                                                       },
                                                       
                                                       /* Apply the maximum length for the date format. */
                                                       _autoSize: function(inst) {
                                                         if (this._get(inst, 'autoSize') && !inst.inline) {
                                                           var date = new Date(2009, 12 - 1, 20); // Ensure double digits
                                                           var dateFormat = this._get(inst, 'dateFormat');
                                                           if (dateFormat.match(/[DM]/)) {
                                                             var findMax = function(names) {
                                                               var max = 0;
                                                               var maxI = 0;
                                                               for (var i = 0; i < names.length; i++) {
                                                                 if (names[i].length > max) {
                                                                   max = names[i].length;
                                                                   maxI = i;
                                                                 }
                                                               }
                                                               return maxI;
                                                             };
                                                             date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ?
                                                             'monthNames' : 'monthNamesShort'))));
                                                             date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ?
                                                             'dayNames' : 'dayNamesShort'))) + 20 - date.getDay());
                                                           }
                                                           inst.input.attr('size', this._formatDate(inst, date).length);
                                                         }
                                                       },
                                                       
                                                       /* Attach an inline date picker to a div. */
                                                       _inlineDatepicker: function(target, inst) {
                                                         var divSpan = $(target);
                                                         if (divSpan.hasClass(this.markerClassName))
                                                           return;
                                                         divSpan.addClass(this.markerClassName).append(inst.dpDiv).
                                                         bind("setData.datepicker", function(event, key, value){
                                                           inst.settings[key] = value;
                                                         }).bind("getData.datepicker", function(event, key){
                                                           return this._get(inst, key);
                                                         });
                                                         $.data(target, PROP_NAME, inst);
                                                         this._setDate(inst, this._getDefaultDate(inst), true);
                                                         this._updateDatepicker(inst);
                                                         this._updateAlternate(inst);
                                                       },
                                                       
                                                       /* Pop-up the date picker in a "dialog" box.
                                                       @param  input     element - ignored
                                                       @param  date      string or Date - the initial date to display
                                                       @param  onSelect  function - the function to call when a date is selected
                                                       @param  settings  object - update the dialog date picker instance's settings (anonymous object)
                                                       @param  pos       int[2] - coordinates for the dialog's position within the screen or
                                                       event - with x/y coordinates or
                                                       leave empty for default (screen centre)
                                                       @return the manager object */
                                                       _dialogDatepicker: function(input, date, onSelect, settings, pos) {
                                                         var inst = this._dialogInst; // internal instance
                                                         if (!inst) {
                                                           this.uuid += 1;
                                                           var id = 'dp' + this.uuid;
                                                           this._dialogInput = $('<input type="text" id="' + id +
                                                           '" style
