/*!
 * jQuery UI 1.8.9
 *
 * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT or GPL Version 2 licenses.
 * http://jquery.org/license
 *
 * http://docs.jquery.com/UI
 */
(function( $, undefined ) {
// 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;
}
$.extend( $.ui, {
 version: "1.8.9",
 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
 }
});
// plugins
$.fn.extend({
 _focus: $.fn.focus,
 focus: function( delay, fn ) {
  return typeof delay === "number" ?
   this.each(function() {
    var elem = this;
    setTimeout(function() {
     $( elem ).focus();
     if ( fn ) {
      fn.call( elem );
     }
    }, delay );
   }) :
   this._focus.apply( this, arguments );
 },
 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" ), 10 );
     if ( !isNaN( value ) && value !== 0 ) {
      return value;
     }
    }
    elem = elem.parent();
   }
  }
  return 0;
 },
 disableSelection: function() {
  return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) +
   ".ui-disableSelection", function( event ) {
    event.preventDefault();
   });
 },
 enableSelection: function() {
  return this.unbind( ".ui-disableSelection" );
 }
});
$.each( [ "Width", "Height" ], function( i, name ) {
 var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
  type = name.toLowerCase(),
  orig = {
   innerWidth: $.fn.innerWidth,
   innerHeight: $.fn.innerHeight,
   outerWidth: $.fn.outerWidth,
   outerHeight: $.fn.outerHeight
  };
 function reduce( elem, size, border, margin ) {
  $.each( side, function() {
   size -= parseFloat( $.curCSS( elem, "padding" + this, true) ) || 0;
   if ( border ) {
    size -= parseFloat( $.curCSS( elem, "border" + this + "Width", true) ) || 0;
   }
   if ( margin ) {
    size -= parseFloat( $.curCSS( elem, "margin" + this, true) ) || 0;
   }
  });
  return size;
 }
 $.fn[ "inner" + name ] = function( size ) {
  if ( size === undefined ) {
   return orig[ "inner" + name ].call( this );
  }
  return this.each(function() {
   $( this ).css( type, reduce( this, size ) + "px" );
  });
 };
 $.fn[ "outer" + name] = function( size, margin ) {
  if ( typeof size !== "number" ) {
   return orig[ "outer" + name ].call( this, size );
  }
  return this.each(function() {
   $( this).css( type, reduce( this, size, true, margin ) + "px" );
  });
 };
});
// selectors
function visible( element ) {
 return !$( element ).parents().andSelf().filter(function() {
  return $.curCSS( this, "visibility" ) === "hidden" ||
   $.expr.filters.hidden( this );
 }).length;
}
$.extend( $.expr[ ":" ], {
 data: function( elem, i, match ) {
  return !!$.data( elem, match[ 3 ] );
 },
 focusable: function( element ) {
  var nodeName = element.nodeName.toLowerCase(),
   tabIndex = $.attr( element, "tabindex" );
  if ( "area" === nodeName ) {
   var map = element.parentNode,
    mapName = map.name,
    img;
   if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
    return false;
   }
   img = $( "img[usemap=#" + mapName + "]" )[0];
   return !!img && visible( img );
  }
  return ( /input|select|textarea|button|object/.test( nodeName )
   ? !element.disabled
   : "a" == nodeName
    ? element.href || !isNaN( tabIndex )
    : !isNaN( tabIndex ))
   // the element and all of its ancestors must be visible
   && visible( element );
 },
 tabbable: function( element ) {
  var tabIndex = $.attr( element, "tabindex" );
  return ( isNaN( tabIndex ) || tabIndex >= 0 ) && $( element ).is( ":focusable" );
 }
});
// support
$(function() {
 var body = document.body,
  div = body.appendChild( div = document.createElement( "div" ) );
 $.extend( div.style, {
  minHeight: "100px",
  height: "auto",
  padding: 0,
  borderWidth: 0
 });
 $.support.minHeight = div.offsetHeight === 100;
 $.support.selectstart = "onselectstart" in div;
 // set display to none to avoid a layout bug in IE
 // http://dev.jquery.com/ticket/4014
 body.removeChild( div ).style.display = "none";
});
// deprecated
$.extend( $.ui, {
 // $.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 );
    }
   }
  }
 },
 
 // will be deprecated when we switch to jQuery 1.4 - use jQuery.contains()
 contains: function( a, b ) {
  return document.compareDocumentPosition ?
   a.compareDocumentPosition( b ) & 16 :
   a !== b && a.contains( b );
 },
 
 // only used by resizable
 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;
 },
 
 // these are odd functions, fix the API or move into individual plugins
 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 );
 }
});
})( jQuery );
/*!
 * jQuery UI Widget 1.8.9
 *
 * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT or GPL Version 2 licenses.
 * http://jquery.org/license
 *
 * http://docs.jquery.com/UI/Widget
 */
(function( $, undefined ) {
// jQuery 1.4+
if ( $.cleanData ) {
 var _cleanData = $.cleanData;
 $.cleanData = function( elems ) {
  for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
   $( elem ).triggerHandler( "remove" );
  }
  _cleanData( elems );
 };
} else {
 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( true, {}, 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.charAt( 0 ) === "_" ) {
   return returnValue;
  }
  if ( isMethodCall ) {
   this.each(function() {
    var instance = $.data( this, name ),
     methodValue = instance && $.isFunction( instance[options] ) ?
      instance[ options ].apply( instance, args ) :
      instance;
    // TODO: add this back in 1.9 and use $.error() (see #5972)
//    if ( !instance ) {
//     throw "cannot call methods on " + name + " prior to initialization; " +
//      "attempted to call method '" + options + "'";
//    }
//    if ( !$.isFunction( instance[options] ) ) {
//     throw "no such method '" + options + "' for " + name + " widget instance";
//    }
//    var methodValue = instance[ options ].apply( instance, args );
    if ( methodValue !== instance && methodValue !== undefined ) {
     returnValue = methodValue;
     return false;
    }
   });
  } else {
   this.each(function() {
    var instance = $.data( this, name );
    if ( instance ) {
     instance.option( options || {} )._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
  $.data( element, this.widgetName, this );
  this.element = $( element );
  this.options = $.extend( true, {},
   this.options,
   this._getCreateOptions(),
   options );
  var self = this;
  this.element.bind( "remove." + this.widgetName, function() {
   self.destroy();
  });
  this._create();
  this._trigger( "create" );
  this._init();
 },
 _getCreateOptions: function() {
  return $.metadata && $.metadata.get( this.element[0] )[ this.widgetName ];
 },
 _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;
  if ( arguments.length === 0 ) {
   // don't return a reference to the internal hash
   return $.extend( {}, this.options );
  }
  if  (typeof key === "string" ) {
   if ( value === undefined ) {
    return this.options[ key ];
   }
   options = {};
   options[ key ] = value;
  }
  this._setOptions( options );
  return this;
 },
 _setOptions: function( options ) {
  var self = this;
  $.each( options, function( key, value ) {
   self._setOption( key, value );
  });
  return this;
 },
 _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 Accordion 1.8.9
 *
 * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT or GPL Version 2 licenses.
 * http://jquery.org/license
 *
 * http://docs.jquery.com/UI/Accordion
 *
 * Depends:
 * jquery.ui.core.js
 * jquery.ui.widget.js
 */
(function( $, undefined ) {
$.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 self = this,
   options = self.options;
  self.running = 0;
  self.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
   .children( "li" )
    .addClass( "ui-accordion-li-fix" );
  self.headers = self.element.find( options.header )
   .addClass( "ui-accordion-header ui-helper-reset ui-state-default ui-corner-all" )
   .bind( "mouseenter.accordion", function() {
    if ( options.disabled ) {
     return;
    }
    $( this ).addClass( "ui-state-hover" );
   })
   .bind( "mouseleave.accordion", function() {
    if ( options.disabled ) {
     return;
    }
    $( this ).removeClass( "ui-state-hover" );
   })
   .bind( "focus.accordion", function() {
    if ( options.disabled ) {
     return;
    }
    $( this ).addClass( "ui-state-focus" );
   })
   .bind( "blur.accordion", function() {
    if ( options.disabled ) {
     return;
    }
    $( this ).removeClass( "ui-state-focus" );
   });
  self.headers.next()
   .addClass( "ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom" );
  if ( options.navigation ) {
   var current = self.element.find( "a" ).filter( options.navigationFilter ).eq( 0 );
   if ( current.length ) {
    var header = current.closest( ".ui-accordion-header" );
    if ( header.length ) {
     // anchor within header
     self.active = header;
    } else {
     // anchor within content
     self.active = current.closest( ".ui-accordion-content" ).prev();
    }
   }
  }
  self.active = self._findActive( self.active || options.active )
   .addClass( "ui-state-default ui-state-active" )
   .toggleClass( "ui-corner-all" )
   .toggleClass( "ui-corner-top" );
  self.active.next().addClass( "ui-accordion-content-active" );
  self._createIcons();
  self.resize();
  
  // ARIA
  self.element.attr( "role", "tablist" );
  self.headers
   .attr( "role", "tab" )
   .bind( "keydown.accordion", function( event ) {
    return self._keydown( event );
   })
   .next()
    .attr( "role", "tabpanel" );
  self.headers
   .not( self.active || "" )
   .attr({
    "aria-expanded": "false",
    tabIndex: -1
   })
   .next()
    .hide();
  // make sure at least one header is in the tab order
  if ( !self.active.length ) {
   self.headers.eq( 0 ).attr( "tabIndex", 0 );
  } else {
   self.active
    .attr({
     "aria-expanded": "true",
     tabIndex: 0
    });
  }
  // only need links in tab order for Safari
  if ( !$.browser.safari ) {
   self.headers.find( "a" ).attr( "tabIndex", -1 );
  }
  if ( options.event ) {
   self.headers.bind( options.event.split(" ").join(".accordion ") + ".accordion", function(event) {
    self._clickHandler.call( self, event, this );
    event.preventDefault();
   });
  }
 },
 _createIcons: function() {
  var options = this.options;
  if ( options.icons ) {
   $( "<span></span>" )
    .addClass( "ui-icon " + options.icons.header )
    .prependTo( this.headers );
   this.active.children( ".ui-icon" )
    .toggleClass(options.icons.header)
    .toggleClass(options.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 options = this.options;
  this.element
   .removeClass( "ui-accordion ui-widget ui-helper-reset" )
   .removeAttr( "role" );
  this.headers
   .unbind( ".accordion" )
   .removeClass( "ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled 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 ui-accordion-disabled ui-state-disabled" );
  if ( options.autoHeight || options.fillHeight ) {
   contents.css( "height", "" );
  }
  return $.Widget.prototype.destroy.call( 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();
   }
  }
  // #5332 - opacity doesn't cascade to positioned elements in IE
  // so we need to add the disabled class to the headers and panels
  if ( key == "disabled" ) {
   this.headers.add(this.headers.next())
    [ value ? "addClass" : "removeClass" ](
     "ui-accordion-disabled ui-state-disabled" );
  }
 },
 _keydown: function( event ) {
  if ( this.options.disabled || event.altKey || event.ctrlKey ) {
   return;
  }
  var keyCode = $.ui.keyCode,
   length = this.headers.length,
   currentIndex = this.headers.index( event.target ),
   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 options = this.options,
   maxHeight;
  if ( options.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 ( options.autoHeight ) {
   maxHeight = 0;
   this.headers.next()
    .each(function() {
     maxHeight = Math.max( maxHeight, $( this ).height( "" ).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 separate target argument?
 _clickHandler: function( event, target ) {
  var options = this.options;
  if ( options.disabled ) {
   return;
  }
  // called only when using activate(false) to close all parts programmatically
  if ( !event.target ) {
   if ( !options.collapsible ) {
    return;
   }
   this.active
    .removeClass( "ui-state-active ui-corner-top" )
    .addClass( "ui-state-default ui-corner-all" )
    .children( ".ui-icon" )
     .removeClass( options.icons.headerSelected )
     .addClass( options.icons.header );
   this.active.next().addClass( "ui-accordion-content-active" );
   var toHide = this.active.next(),
    data = {
     options: options,
     newHeader: $( [] ),
     oldHeader: options.active,
     newContent: $( [] ),
     oldContent: toHide
    },
    toShow = ( this.active = $( [] ) );
   this._toggle( toShow, toHide, data );
   return;
  }
  // get the click target
  var clicked = $( event.currentTarget || target ),
   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?
  options.active = options.collapsible && clickedIsActive ?
   false :
   this.headers.index( clicked );
  // if animations are still active, or the active header is the target, ignore click
  if ( this.running || ( !options.collapsible && clickedIsActive ) ) {
   return;
  }
  // find elements to show and hide
  var active = this.active,
   toShow = clicked.next(),
   toHide = this.active.next(),
   data = {
    options: options,
    newHeader: clickedIsActive && options.collapsible ? $([]) : clicked,
    oldHeader: this.active,
    newContent: clickedIsActive && options.collapsible ? $([]) : toShow,
    oldContent: toHide
   },
   down = this.headers.index( this.active[0] ) > this.headers.index( clicked[0] );
  // when the call to ._toggle() comes after the class changes
  // it causes a very odd bug in IE 8 (see #6720)
  this.active = clickedIsActive ? $([]) : clicked;
  this._toggle( toShow, toHide, data, clickedIsActive, down );
  // switch classes
  active
   .removeClass( "ui-state-active ui-corner-top" )
   .addClass( "ui-state-default ui-corner-all" )
   .children( ".ui-icon" )
    .removeClass( options.icons.headerSelected )
    .addClass( options.icons.header );
  if ( !clickedIsActive ) {
   clicked
    .removeClass( "ui-state-default ui-corner-all" )
    .addClass( "ui-state-active ui-corner-top" )
    .children( ".ui-icon" )
     .removeClass( options.icons.header )
     .addClass( options.icons.headerSelected );
   clicked
    .next()
    .addClass( "ui-accordion-content-active" );
  }
  return;
 },
 _toggle: function( toShow, toHide, data, clickedIsActive, down ) {
  var self = this,
   options = self.options;
  self.toShow = toShow;
  self.toHide = toHide;
  self.data = data;
  var complete = function() {
   if ( !self ) {
    return;
   }
   return self._completed.apply( self, arguments );
  };
  // trigger changestart event
  self._trigger( "changestart", null, self.data );
  // count elements to animate
  self.running = toHide.size() === 0 ? toShow.size() : toHide.size();
  if ( options.animated ) {
   var animOptions = {};
   if ( options.collapsible && clickedIsActive ) {
    animOptions = {
     toShow: $( [] ),
     toHide: toHide,
     complete: complete,
     down: down,
     autoHeight: options.autoHeight || options.fillSpace
    };
   } else {
    animOptions = {
     toShow: toShow,
     toHide: toHide,
     complete: complete,
     down: down,
     autoHeight: options.autoHeight || options.fillSpace
    };
   }
   if ( !options.proxied ) {
    options.proxied = options.animated;
   }
   if ( !options.proxiedDuration ) {
    options.proxiedDuration = options.duration;
   }
   options.animated = $.isFunction( options.proxied ) ?
    options.proxied( animOptions ) :
    options.proxied;
   options.duration = $.isFunction( options.proxiedDuration ) ?
    options.proxiedDuration( animOptions ) :
    options.proxiedDuration;
   var animations = $.ui.accordion.animations,
    duration = options.duration,
    easing = options.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 ( options.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",
    tabIndex: -1
   })
   .blur();
  toShow.prev()
   .attr({
    "aria-expanded": "true",
    tabIndex: 0
   })
   .focus();
 },
 _completed: function( cancel ) {
  this.running = cancel ? 0 : --this.running;
  if ( this.running ) {
   return;
  }
  if ( this.options.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" );
  // Work around for rendering bug in IE (#5421)
  if ( this.toHide.length ) {
   this.toHide.parent()[0].className = this.toHide.parent()[0].className;
  }
  this._trigger( "change", null, this.data );
 }
});
$.extend( $.ui.accordion, {
 version: "1.8.9",
 animations: {
  slide: function( options, additions ) {
   options = $.extend({
    easing: "swing",
    duration: 300
   }, options, additions );
   if ( !options.toHide.size() ) {
    options.toShow.animate({
     height: "show",
     paddingTop: "show",
     paddingBottom: "show"
    }, options );
    return;
   }
   if ( !options.toShow.size() ) {
    options.toHide.animate({
     height: "hide",
     paddingTop: "hide",
     paddingBottom: "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,
      overflow: overflow
     });
     options.complete();
    }
   });
  },
  bounceslide: function( options ) {
   this.slide( options, {
    easing: options.down ? "easeOutBounce" : "swing",
    duration: options.down ? 1000 : 200
   });
  }
 }
});
})( jQuery );

