Commit 9fa82c40db23a4626fa0f12e92b6d0400e111cf5

Authored by Ábner Oliveira
1 parent b357b620
Exists in build

build working

gulpfile.js
... ... @@ -28,12 +28,21 @@ gulp.task('watch', function() {
28 28  
29 29 gulp.task('connect', function() {
30 30 connect.server({
31   - port: 8080,
  31 + port: 3000,
32 32 root: [__dirname],
33 33 livereload: true
34 34 });
35 35 });
36 36  
  37 +gulp.task('connect_dist', ['clean', 'copyResources', 'sass', 'compileJS', 'htmlReplace'], function() {
  38 + connect.server({
  39 + port: 3000,
  40 + root: ['./dist'],
  41 + livereload: false
  42 + });
  43 +});
  44 +
  45 +
37 46 gulp.task('default', ['sass', 'connect', 'watch']);
38 47  
39 48 //var htmlusemin = require('gulp-usemin-html');
... ... @@ -50,48 +59,47 @@ var concat = require('gulp-concat');
50 59 var copy = require('gulp-copy');
51 60 var add = require("gulp-add");
52 61  
  62 +gulp.task('copyResources', function(){
  63 + gulp.src(["./*.html", "style.css", "./fonts/**/*.*", "./favicon.ico", "./images/**/*.*"])
  64 + .pipe(copy('dist/'));
  65 +});
  66 +
53 67  
54 68 gulp.task('compileJS', function() {
55 69 var mainInit =
56 70 "require.config({ paths: { \"main\": \"main-bundled\" }});require([\"main\"]);";
57 71 return gulp.src('js/main.js')
58   - .pipe(sourcemaps.init())
  72 + //.pipe(sourcemaps.init())
59 73 .pipe(requirejsOptimize({
60 74 baseUrl: 'js',
61   - name: 'main',
62   - generateSourceMaps: true,
63   - optimize: "uglify2",
  75 + name: 'build',
  76 + //generateSourceMaps: true,
  77 + optimize: "none",
64 78 preserveLicenseComments: false,
65 79 paths: {
66 80 "requireLib": "require"
67 81 },
68 82 include: "requireLib",
69   - out: "main.min.js"
  83 + out: "dist/main.min.js"
70 84 }).on('error', function(error) {
71 85 console.log(error);
72 86 }))
73   - .pipe(add('main-init.js', mainInit))
74   - .pipe(sourcemaps.write('./'))
75   - /* .pipe(concat('main-bundled.js'))*/
  87 + .pipe(add('dist/main-init.js', mainInit))
  88 + .pipe(concat('dist/main-bundled.js'))
  89 + //.pipe(sourcemaps.write('./'))
76 90 .pipe(gulp.dest('./'));
77 91 });
78 92  
79 93  
80   -gulp.task('htmlReplace', function() {
81   - var assets = useRef.assets();
82   - var jsFilter = filter("./main-bundled.js");
83   - var cssFilter = filter("**/*.css");
84   - return gulp.src('./index.html')
85   - .pipe(assets)
  94 +gulp.task('htmlReplace', ['clean', 'sass', 'copyResources', 'compileJS'],function() {
  95 + var assets;
  96 + var jsFilter = filter("./dist/main-bundled.js");
  97 + var cssFilter = filter("dist/*.css");
  98 + return gulp.src('dist/index.html')
  99 + .pipe(assets = useRef.assets())
86 100 .pipe(sourcemaps.init())
87 101 .pipe(rev())
88   - .pipe(gulpif('*.js', uglify({
89   - compress: false,
90   - mangle: false,
91   - output: {
92   - beautify: true
93   - }
94   - })))
  102 + .pipe(gulpif('*.js', uglify()))
95 103 .pipe(assets.restore())
96 104 .pipe(useRef())
97 105 .pipe(revReplace())
... ... @@ -103,7 +111,8 @@ gulp.task('htmlReplace', function() {
103 111 .pipe(useRef())
104 112 .pipe(revReplace())
105 113 .pipe(sourcemaps.write('./'))
106   - .pipe(gulp.dest('dist'));
  114 + .pipe(assets.restore())
  115 + .pipe(gulp.dest('dist/'));
107 116 });
108 117  
109 118 var del = require('del');
... ... @@ -114,4 +123,4 @@ gulp.task('clean', function(cb) {
114 123 ], cb);
115 124 });
116 125  
117   -gulp.task('build', ['clean', 'sass', 'compileJS', 'htmlReplace']);
  126 +gulp.task('build', ['clean', 'copyResources', 'sass', 'compileJS', 'htmlReplace']);
... ...
js/build.js 0 → 100644
... ... @@ -0,0 +1,19 @@
  1 +define(
  2 + [
  3 + 'jquery',
  4 + 'handlebars',
  5 + 'fastclick',
  6 + 'handlebars_helpers',
  7 + 'piwik',
  8 + 'jquery.timeago',
  9 + 'jquery.timeago.pt-br',
  10 + 'jQuery.XDomainRequest',
  11 + 'jquery-ui',
  12 + 'jquery_equalHeights',
  13 + 'jquery_maxlength',
  14 + 'proposal_app',
  15 + 'main'
  16 + ],
  17 + function(){
  18 + }
  19 +);
0 20 \ No newline at end of file
... ...
js/jQuery.XDomainRequest.js 0 → 100644
... ... @@ -0,0 +1,119 @@
  1 +/*!
  2 + * jQuery-ajaxTransport-XDomainRequest - v1.0.4 - 2015-03-05
  3 + * https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest
  4 + * Copyright (c) 2015 Jason Moon (@JSONMOON)
  5 + * Licensed MIT (/blob/master/LICENSE.txt)
  6 + */
  7 +(function(factory) {
  8 + if (typeof define === 'function' && define.amd) {
  9 + // AMD. Register as anonymous module.
  10 + define(['jquery'], factory);
  11 + } else if (typeof exports === 'object') {
  12 + // CommonJS
  13 + module.exports = factory(require('jquery'));
  14 + } else {
  15 + // Browser globals.
  16 + factory(jQuery);
  17 + }
  18 +}(function($) {
  19 +
  20 +// Only continue if we're on IE8/IE9 with jQuery 1.5+ (contains the ajaxTransport function)
  21 +if ($.support.cors || !$.ajaxTransport || !window.XDomainRequest) {
  22 + return $;
  23 +}
  24 +
  25 +var httpRegEx = /^(https?:)?\/\//i;
  26 +var getOrPostRegEx = /^get|post$/i;
  27 +var sameSchemeRegEx = new RegExp('^(\/\/|' + location.protocol + ')', 'i');
  28 +
  29 +// ajaxTransport exists in jQuery 1.5+
  30 +$.ajaxTransport('* text html xml json', function(options, userOptions, jqXHR) {
  31 +
  32 + // Only continue if the request is: asynchronous, uses GET or POST method, has HTTP or HTTPS protocol, and has the same scheme as the calling page
  33 + if (!options.crossDomain || !options.async || !getOrPostRegEx.test(options.type) || !httpRegEx.test(options.url) || !sameSchemeRegEx.test(options.url)) {
  34 + return;
  35 + }
  36 +
  37 + var xdr = null;
  38 +
  39 + return {
  40 + send: function(headers, complete) {
  41 + var postData = '';
  42 + var userType = (userOptions.dataType || '').toLowerCase();
  43 +
  44 + xdr = new XDomainRequest();
  45 + if (/^\d+$/.test(userOptions.timeout)) {
  46 + xdr.timeout = userOptions.timeout;
  47 + }
  48 +
  49 + xdr.ontimeout = function() {
  50 + complete(500, 'timeout');
  51 + };
  52 +
  53 + xdr.onload = function() {
  54 + var allResponseHeaders = 'Content-Length: ' + xdr.responseText.length + '\r\nContent-Type: ' + xdr.contentType;
  55 + var status = {
  56 + code: 200,
  57 + message: 'success'
  58 + };
  59 + var responses = {
  60 + text: xdr.responseText
  61 + };
  62 + try {
  63 + if (userType === 'html' || /text\/html/i.test(xdr.contentType)) {
  64 + responses.html = xdr.responseText;
  65 + } else if (userType === 'json' || (userType !== 'text' && /\/json/i.test(xdr.contentType))) {
  66 + try {
  67 + responses.json = $.parseJSON(xdr.responseText);
  68 + } catch(e) {
  69 + status.code = 500;
  70 + status.message = 'parseerror';
  71 + //throw 'Invalid JSON: ' + xdr.responseText;
  72 + }
  73 + } else if (userType === 'xml' || (userType !== 'text' && /\/xml/i.test(xdr.contentType))) {
  74 + var doc = new ActiveXObject('Microsoft.XMLDOM');
  75 + doc.async = false;
  76 + try {
  77 + doc.loadXML(xdr.responseText);
  78 + } catch(e) {
  79 + doc = undefined;
  80 + }
  81 + if (!doc || !doc.documentElement || doc.getElementsByTagName('parsererror').length) {
  82 + status.code = 500;
  83 + status.message = 'parseerror';
  84 + throw 'Invalid XML: ' + xdr.responseText;
  85 + }
  86 + responses.xml = doc;
  87 + }
  88 + } catch(parseMessage) {
  89 + throw parseMessage;
  90 + } finally {
  91 + complete(status.code, status.message, responses, allResponseHeaders);
  92 + }
  93 + };
  94 +
  95 + // set an empty handler for 'onprogress' so requests don't get aborted
  96 + xdr.onprogress = function(){};
  97 + xdr.onerror = function() {
  98 + complete(500, 'error', {
  99 + text: xdr.responseText
  100 + });
  101 + };
  102 +
  103 + if (userOptions.data) {
  104 + postData = ($.type(userOptions.data) === 'string') ? userOptions.data : $.param(userOptions.data);
  105 + }
  106 + xdr.open(options.type, options.url);
  107 + xdr.send(postData);
  108 + },
  109 + abort: function() {
  110 + if (xdr) {
  111 + xdr.abort();
  112 + }
  113 + }
  114 + };
  115 +});
  116 +
  117 +return $;
  118 +
  119 +}));
... ...
js/jquery-ui.js 0 → 100644
... ... @@ -0,0 +1,3978 @@
  1 +/*! jQuery UI - v1.11.4 - 2015-04-24
  2 +* http://jqueryui.com
  3 +* Includes: core.js, widget.js, position.js, autocomplete.js, menu.js, effect.js, effect-blind.js
  4 +* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */
  5 +
  6 +(function( factory ) {
  7 + if ( typeof define === "function" && define.amd ) {
  8 +
  9 + // AMD. Register as an anonymous module.
  10 + define([ "jquery" ], factory );
  11 + } else {
  12 +
  13 + // Browser globals
  14 + factory( jQuery );
  15 + }
  16 +}(function( $ ) {
  17 +/*!
  18 + * jQuery UI Core 1.11.4
  19 + * http://jqueryui.com
  20 + *
  21 + * Copyright jQuery Foundation and other contributors
  22 + * Released under the MIT license.
  23 + * http://jquery.org/license
  24 + *
  25 + * http://api.jqueryui.com/category/ui-core/
  26 + */
  27 +
  28 +
  29 +// $.ui might exist from components with no dependencies, e.g., $.ui.position
  30 +$.ui = $.ui || {};
  31 +
  32 +$.extend( $.ui, {
  33 + version: "1.11.4",
  34 +
  35 + keyCode: {
  36 + BACKSPACE: 8,
  37 + COMMA: 188,
  38 + DELETE: 46,
  39 + DOWN: 40,
  40 + END: 35,
  41 + ENTER: 13,
  42 + ESCAPE: 27,
  43 + HOME: 36,
  44 + LEFT: 37,
  45 + PAGE_DOWN: 34,
  46 + PAGE_UP: 33,
  47 + PERIOD: 190,
  48 + RIGHT: 39,
  49 + SPACE: 32,
  50 + TAB: 9,
  51 + UP: 38
  52 + }
  53 +});
  54 +
  55 +// plugins
  56 +$.fn.extend({
  57 + scrollParent: function( includeHidden ) {
  58 + var position = this.css( "position" ),
  59 + excludeStaticParent = position === "absolute",
  60 + overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,
  61 + scrollParent = this.parents().filter( function() {
  62 + var parent = $( this );
  63 + if ( excludeStaticParent && parent.css( "position" ) === "static" ) {
  64 + return false;
  65 + }
  66 + return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) + parent.css( "overflow-x" ) );
  67 + }).eq( 0 );
  68 +
  69 + return position === "fixed" || !scrollParent.length ? $( this[ 0 ].ownerDocument || document ) : scrollParent;
  70 + },
  71 +
  72 + uniqueId: (function() {
  73 + var uuid = 0;
  74 +
  75 + return function() {
  76 + return this.each(function() {
  77 + if ( !this.id ) {
  78 + this.id = "ui-id-" + ( ++uuid );
  79 + }
  80 + });
  81 + };
  82 + })(),
  83 +
  84 + removeUniqueId: function() {
  85 + return this.each(function() {
  86 + if ( /^ui-id-\d+$/.test( this.id ) ) {
  87 + $( this ).removeAttr( "id" );
  88 + }
  89 + });
  90 + }
  91 +});
  92 +
  93 +// selectors
  94 +function focusable( element, isTabIndexNotNaN ) {
  95 + var map, mapName, img,
  96 + nodeName = element.nodeName.toLowerCase();
  97 + if ( "area" === nodeName ) {
  98 + map = element.parentNode;
  99 + mapName = map.name;
  100 + if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
  101 + return false;
  102 + }
  103 + img = $( "img[usemap='#" + mapName + "']" )[ 0 ];
  104 + return !!img && visible( img );
  105 + }
  106 + return ( /^(input|select|textarea|button|object)$/.test( nodeName ) ?
  107 + !element.disabled :
  108 + "a" === nodeName ?
  109 + element.href || isTabIndexNotNaN :
  110 + isTabIndexNotNaN) &&
  111 + // the element and all of its ancestors must be visible
  112 + visible( element );
  113 +}
  114 +
  115 +function visible( element ) {
  116 + return $.expr.filters.visible( element ) &&
  117 + !$( element ).parents().addBack().filter(function() {
  118 + return $.css( this, "visibility" ) === "hidden";
  119 + }).length;
  120 +}
  121 +
  122 +$.extend( $.expr[ ":" ], {
  123 + data: $.expr.createPseudo ?
  124 + $.expr.createPseudo(function( dataName ) {
  125 + return function( elem ) {
  126 + return !!$.data( elem, dataName );
  127 + };
  128 + }) :
  129 + // support: jQuery <1.8
  130 + function( elem, i, match ) {
  131 + return !!$.data( elem, match[ 3 ] );
  132 + },
  133 +
  134 + focusable: function( element ) {
  135 + return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
  136 + },
  137 +
  138 + tabbable: function( element ) {
  139 + var tabIndex = $.attr( element, "tabindex" ),
  140 + isTabIndexNaN = isNaN( tabIndex );
  141 + return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );
  142 + }
  143 +});
  144 +
  145 +// support: jQuery <1.8
  146 +if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {
  147 + $.each( [ "Width", "Height" ], function( i, name ) {
  148 + var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
  149 + type = name.toLowerCase(),
  150 + orig = {
  151 + innerWidth: $.fn.innerWidth,
  152 + innerHeight: $.fn.innerHeight,
  153 + outerWidth: $.fn.outerWidth,
  154 + outerHeight: $.fn.outerHeight
  155 + };
  156 +
  157 + function reduce( elem, size, border, margin ) {
  158 + $.each( side, function() {
  159 + size -= parseFloat( $.css( elem, "padding" + this ) ) || 0;
  160 + if ( border ) {
  161 + size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0;
  162 + }
  163 + if ( margin ) {
  164 + size -= parseFloat( $.css( elem, "margin" + this ) ) || 0;
  165 + }
  166 + });
  167 + return size;
  168 + }
  169 +
  170 + $.fn[ "inner" + name ] = function( size ) {
  171 + if ( size === undefined ) {
  172 + return orig[ "inner" + name ].call( this );
  173 + }
  174 +
  175 + return this.each(function() {
  176 + $( this ).css( type, reduce( this, size ) + "px" );
  177 + });
  178 + };
  179 +
  180 + $.fn[ "outer" + name] = function( size, margin ) {
  181 + if ( typeof size !== "number" ) {
  182 + return orig[ "outer" + name ].call( this, size );
  183 + }
  184 +
  185 + return this.each(function() {
  186 + $( this).css( type, reduce( this, size, true, margin ) + "px" );
  187 + });
  188 + };
  189 + });
  190 +}
  191 +
  192 +// support: jQuery <1.8
  193 +if ( !$.fn.addBack ) {
  194 + $.fn.addBack = function( selector ) {
  195 + return this.add( selector == null ?
  196 + this.prevObject : this.prevObject.filter( selector )
  197 + );
  198 + };
  199 +}
  200 +
  201 +// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)
  202 +if ( $( "<a>" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) {
  203 + $.fn.removeData = (function( removeData ) {
  204 + return function( key ) {
  205 + if ( arguments.length ) {
  206 + return removeData.call( this, $.camelCase( key ) );
  207 + } else {
  208 + return removeData.call( this );
  209 + }
  210 + };
  211 + })( $.fn.removeData );
  212 +}
  213 +
  214 +// deprecated
  215 +$.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );
  216 +
  217 +$.fn.extend({
  218 + focus: (function( orig ) {
  219 + return function( delay, fn ) {
  220 + return typeof delay === "number" ?
  221 + this.each(function() {
  222 + var elem = this;
  223 + setTimeout(function() {
  224 + $( elem ).focus();
  225 + if ( fn ) {
  226 + fn.call( elem );
  227 + }
  228 + }, delay );
  229 + }) :
  230 + orig.apply( this, arguments );
  231 + };
  232 + })( $.fn.focus ),
  233 +
  234 + disableSelection: (function() {
  235 + var eventType = "onselectstart" in document.createElement( "div" ) ?
  236 + "selectstart" :
  237 + "mousedown";
  238 +
  239 + return function() {
  240 + return this.bind( eventType + ".ui-disableSelection", function( event ) {
  241 + event.preventDefault();
  242 + });
  243 + };
  244 + })(),
  245 +
  246 + enableSelection: function() {
  247 + return this.unbind( ".ui-disableSelection" );
  248 + },
  249 +
  250 + zIndex: function( zIndex ) {
  251 + if ( zIndex !== undefined ) {
  252 + return this.css( "zIndex", zIndex );
  253 + }
  254 +
  255 + if ( this.length ) {
  256 + var elem = $( this[ 0 ] ), position, value;
  257 + while ( elem.length && elem[ 0 ] !== document ) {
  258 + // Ignore z-index if position is set to a value where z-index is ignored by the browser
  259 + // This makes behavior of this function consistent across browsers
  260 + // WebKit always returns auto if the element is positioned
  261 + position = elem.css( "position" );
  262 + if ( position === "absolute" || position === "relative" || position === "fixed" ) {
  263 + // IE returns 0 when zIndex is not specified
  264 + // other browsers return a string
  265 + // we ignore the case of nested elements with an explicit value of 0
  266 + // <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
  267 + value = parseInt( elem.css( "zIndex" ), 10 );
  268 + if ( !isNaN( value ) && value !== 0 ) {
  269 + return value;
  270 + }
  271 + }
  272 + elem = elem.parent();
  273 + }
  274 + }
  275 +
  276 + return 0;
  277 + }
  278 +});
  279 +
  280 +// $.ui.plugin is deprecated. Use $.widget() extensions instead.
  281 +$.ui.plugin = {
  282 + add: function( module, option, set ) {
  283 + var i,
  284 + proto = $.ui[ module ].prototype;
  285 + for ( i in set ) {
  286 + proto.plugins[ i ] = proto.plugins[ i ] || [];
  287 + proto.plugins[ i ].push( [ option, set[ i ] ] );
  288 + }
  289 + },
  290 + call: function( instance, name, args, allowDisconnected ) {
  291 + var i,
  292 + set = instance.plugins[ name ];
  293 +
  294 + if ( !set ) {
  295 + return;
  296 + }
  297 +
  298 + if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) ) {
  299 + return;
  300 + }
  301 +
  302 + for ( i = 0; i < set.length; i++ ) {
  303 + if ( instance.options[ set[ i ][ 0 ] ] ) {
  304 + set[ i ][ 1 ].apply( instance.element, args );
  305 + }
  306 + }
  307 + }
  308 +};
  309 +
  310 +
  311 +/*!
  312 + * jQuery UI Widget 1.11.4
  313 + * http://jqueryui.com
  314 + *
  315 + * Copyright jQuery Foundation and other contributors
  316 + * Released under the MIT license.
  317 + * http://jquery.org/license
  318 + *
  319 + * http://api.jqueryui.com/jQuery.widget/
  320 + */
  321 +
  322 +
  323 +var widget_uuid = 0,
  324 + widget_slice = Array.prototype.slice;
  325 +
  326 +$.cleanData = (function( orig ) {
  327 + return function( elems ) {
  328 + var events, elem, i;
  329 + for ( i = 0; (elem = elems[i]) != null; i++ ) {
  330 + try {
  331 +
  332 + // Only trigger remove when necessary to save time
  333 + events = $._data( elem, "events" );
  334 + if ( events && events.remove ) {
  335 + $( elem ).triggerHandler( "remove" );
  336 + }
  337 +
  338 + // http://bugs.jquery.com/ticket/8235
  339 + } catch ( e ) {}
  340 + }
  341 + orig( elems );
  342 + };
  343 +})( $.cleanData );
  344 +
  345 +$.widget = function( name, base, prototype ) {
  346 + var fullName, existingConstructor, constructor, basePrototype,
  347 + // proxiedPrototype allows the provided prototype to remain unmodified
  348 + // so that it can be used as a mixin for multiple widgets (#8876)
  349 + proxiedPrototype = {},
  350 + namespace = name.split( "." )[ 0 ];
  351 +
  352 + name = name.split( "." )[ 1 ];
  353 + fullName = namespace + "-" + name;
  354 +
  355 + if ( !prototype ) {
  356 + prototype = base;
  357 + base = $.Widget;
  358 + }
  359 +
  360 + // create selector for plugin
  361 + $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
  362 + return !!$.data( elem, fullName );
  363 + };
  364 +
  365 + $[ namespace ] = $[ namespace ] || {};
  366 + existingConstructor = $[ namespace ][ name ];
  367 + constructor = $[ namespace ][ name ] = function( options, element ) {
  368 + // allow instantiation without "new" keyword
  369 + if ( !this._createWidget ) {
  370 + return new constructor( options, element );
  371 + }
  372 +
  373 + // allow instantiation without initializing for simple inheritance
  374 + // must use "new" keyword (the code above always passes args)
  375 + if ( arguments.length ) {
  376 + this._createWidget( options, element );
  377 + }
  378 + };
  379 + // extend with the existing constructor to carry over any static properties
  380 + $.extend( constructor, existingConstructor, {
  381 + version: prototype.version,
  382 + // copy the object used to create the prototype in case we need to
  383 + // redefine the widget later
  384 + _proto: $.extend( {}, prototype ),
  385 + // track widgets that inherit from this widget in case this widget is
  386 + // redefined after a widget inherits from it
  387 + _childConstructors: []
  388 + });
  389 +
  390 + basePrototype = new base();
  391 + // we need to make the options hash a property directly on the new instance
  392 + // otherwise we'll modify the options hash on the prototype that we're
  393 + // inheriting from
  394 + basePrototype.options = $.widget.extend( {}, basePrototype.options );
  395 + $.each( prototype, function( prop, value ) {
  396 + if ( !$.isFunction( value ) ) {
  397 + proxiedPrototype[ prop ] = value;
  398 + return;
  399 + }
  400 + proxiedPrototype[ prop ] = (function() {
  401 + var _super = function() {
  402 + return base.prototype[ prop ].apply( this, arguments );
  403 + },
  404 + _superApply = function( args ) {
  405 + return base.prototype[ prop ].apply( this, args );
  406 + };
  407 + return function() {
  408 + var __super = this._super,
  409 + __superApply = this._superApply,
  410 + returnValue;
  411 +
  412 + this._super = _super;
  413 + this._superApply = _superApply;
  414 +
  415 + returnValue = value.apply( this, arguments );
  416 +
  417 + this._super = __super;
  418 + this._superApply = __superApply;
  419 +
  420 + return returnValue;
  421 + };
  422 + })();
  423 + });
  424 + constructor.prototype = $.widget.extend( basePrototype, {
  425 + // TODO: remove support for widgetEventPrefix
  426 + // always use the name + a colon as the prefix, e.g., draggable:start
  427 + // don't prefix for widgets that aren't DOM-based
  428 + widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name
  429 + }, proxiedPrototype, {
  430 + constructor: constructor,
  431 + namespace: namespace,
  432 + widgetName: name,
  433 + widgetFullName: fullName
  434 + });
  435 +
  436 + // If this widget is being redefined then we need to find all widgets that
  437 + // are inheriting from it and redefine all of them so that they inherit from
  438 + // the new version of this widget. We're essentially trying to replace one
  439 + // level in the prototype chain.
  440 + if ( existingConstructor ) {
  441 + $.each( existingConstructor._childConstructors, function( i, child ) {
  442 + var childPrototype = child.prototype;
  443 +
  444 + // redefine the child widget using the same prototype that was
  445 + // originally used, but inherit from the new version of the base
  446 + $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );
  447 + });
  448 + // remove the list of existing child constructors from the old constructor
  449 + // so the old child constructors can be garbage collected
  450 + delete existingConstructor._childConstructors;
  451 + } else {
  452 + base._childConstructors.push( constructor );
  453 + }
  454 +
  455 + $.widget.bridge( name, constructor );
  456 +
  457 + return constructor;
  458 +};
  459 +
  460 +$.widget.extend = function( target ) {
  461 + var input = widget_slice.call( arguments, 1 ),
  462 + inputIndex = 0,
  463 + inputLength = input.length,
  464 + key,
  465 + value;
  466 + for ( ; inputIndex < inputLength; inputIndex++ ) {
  467 + for ( key in input[ inputIndex ] ) {
  468 + value = input[ inputIndex ][ key ];
  469 + if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
  470 + // Clone objects
  471 + if ( $.isPlainObject( value ) ) {
  472 + target[ key ] = $.isPlainObject( target[ key ] ) ?
  473 + $.widget.extend( {}, target[ key ], value ) :
  474 + // Don't extend strings, arrays, etc. with objects
  475 + $.widget.extend( {}, value );
  476 + // Copy everything else by reference
  477 + } else {
  478 + target[ key ] = value;
  479 + }
  480 + }
  481 + }
  482 + }
  483 + return target;
  484 +};
  485 +
  486 +$.widget.bridge = function( name, object ) {
  487 + var fullName = object.prototype.widgetFullName || name;
  488 + $.fn[ name ] = function( options ) {
  489 + var isMethodCall = typeof options === "string",
  490 + args = widget_slice.call( arguments, 1 ),
  491 + returnValue = this;
  492 +
  493 + if ( isMethodCall ) {
  494 + this.each(function() {
  495 + var methodValue,
  496 + instance = $.data( this, fullName );
  497 + if ( options === "instance" ) {
  498 + returnValue = instance;
  499 + return false;
  500 + }
  501 + if ( !instance ) {
  502 + return $.error( "cannot call methods on " + name + " prior to initialization; " +
  503 + "attempted to call method '" + options + "'" );
  504 + }
  505 + if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
  506 + return $.error( "no such method '" + options + "' for " + name + " widget instance" );
  507 + }
  508 + methodValue = instance[ options ].apply( instance, args );
  509 + if ( methodValue !== instance && methodValue !== undefined ) {
  510 + returnValue = methodValue && methodValue.jquery ?
  511 + returnValue.pushStack( methodValue.get() ) :
  512 + methodValue;
  513 + return false;
  514 + }
  515 + });
  516 + } else {
  517 +
  518 + // Allow multiple hashes to be passed on init
  519 + if ( args.length ) {
  520 + options = $.widget.extend.apply( null, [ options ].concat(args) );
  521 + }
  522 +
  523 + this.each(function() {
  524 + var instance = $.data( this, fullName );
  525 + if ( instance ) {
  526 + instance.option( options || {} );
  527 + if ( instance._init ) {
  528 + instance._init();
  529 + }
  530 + } else {
  531 + $.data( this, fullName, new object( options, this ) );
  532 + }
  533 + });
  534 + }
  535 +
  536 + return returnValue;
  537 + };
  538 +};
  539 +
  540 +$.Widget = function( /* options, element */ ) {};
  541 +$.Widget._childConstructors = [];
  542 +
  543 +$.Widget.prototype = {
  544 + widgetName: "widget",
  545 + widgetEventPrefix: "",
  546 + defaultElement: "<div>",
  547 + options: {
  548 + disabled: false,
  549 +
  550 + // callbacks
  551 + create: null
  552 + },
  553 + _createWidget: function( options, element ) {
  554 + element = $( element || this.defaultElement || this )[ 0 ];
  555 + this.element = $( element );
  556 + this.uuid = widget_uuid++;
  557 + this.eventNamespace = "." + this.widgetName + this.uuid;
  558 +
  559 + this.bindings = $();
  560 + this.hoverable = $();
  561 + this.focusable = $();
  562 +
  563 + if ( element !== this ) {
  564 + $.data( element, this.widgetFullName, this );
  565 + this._on( true, this.element, {
  566 + remove: function( event ) {
  567 + if ( event.target === element ) {
  568 + this.destroy();
  569 + }
  570 + }
  571 + });
  572 + this.document = $( element.style ?
  573 + // element within the document
  574 + element.ownerDocument :
  575 + // element is window or document
  576 + element.document || element );
  577 + this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
  578 + }
  579 +
  580 + this.options = $.widget.extend( {},
  581 + this.options,
  582 + this._getCreateOptions(),
  583 + options );
  584 +
  585 + this._create();
  586 + this._trigger( "create", null, this._getCreateEventData() );
  587 + this._init();
  588 + },
  589 + _getCreateOptions: $.noop,
  590 + _getCreateEventData: $.noop,
  591 + _create: $.noop,
  592 + _init: $.noop,
  593 +
  594 + destroy: function() {
  595 + this._destroy();
  596 + // we can probably remove the unbind calls in 2.0
  597 + // all event bindings should go through this._on()
  598 + this.element
  599 + .unbind( this.eventNamespace )
  600 + .removeData( this.widgetFullName )
  601 + // support: jquery <1.6.3
  602 + // http://bugs.jquery.com/ticket/9413
  603 + .removeData( $.camelCase( this.widgetFullName ) );
  604 + this.widget()
  605 + .unbind( this.eventNamespace )
  606 + .removeAttr( "aria-disabled" )
  607 + .removeClass(
  608 + this.widgetFullName + "-disabled " +
  609 + "ui-state-disabled" );
  610 +
  611 + // clean up events and states
  612 + this.bindings.unbind( this.eventNamespace );
  613 + this.hoverable.removeClass( "ui-state-hover" );
  614 + this.focusable.removeClass( "ui-state-focus" );
  615 + },
  616 + _destroy: $.noop,
  617 +
  618 + widget: function() {
  619 + return this.element;
  620 + },
  621 +
  622 + option: function( key, value ) {
  623 + var options = key,
  624 + parts,
  625 + curOption,
  626 + i;
  627 +
  628 + if ( arguments.length === 0 ) {
  629 + // don't return a reference to the internal hash
  630 + return $.widget.extend( {}, this.options );
  631 + }
  632 +
  633 + if ( typeof key === "string" ) {
  634 + // handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
  635 + options = {};
  636 + parts = key.split( "." );
  637 + key = parts.shift();
  638 + if ( parts.length ) {
  639 + curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
  640 + for ( i = 0; i < parts.length - 1; i++ ) {
  641 + curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
  642 + curOption = curOption[ parts[ i ] ];
  643 + }
  644 + key = parts.pop();
  645 + if ( arguments.length === 1 ) {
  646 + return curOption[ key ] === undefined ? null : curOption[ key ];
  647 + }
  648 + curOption[ key ] = value;
  649 + } else {
  650 + if ( arguments.length === 1 ) {
  651 + return this.options[ key ] === undefined ? null : this.options[ key ];
  652 + }
  653 + options[ key ] = value;
  654 + }
  655 + }
  656 +
  657 + this._setOptions( options );
  658 +
  659 + return this;
  660 + },
  661 + _setOptions: function( options ) {
  662 + var key;
  663 +
  664 + for ( key in options ) {
  665 + this._setOption( key, options[ key ] );
  666 + }
  667 +
  668 + return this;
  669 + },
  670 + _setOption: function( key, value ) {
  671 + this.options[ key ] = value;
  672 +
  673 + if ( key === "disabled" ) {
  674 + this.widget()
  675 + .toggleClass( this.widgetFullName + "-disabled", !!value );
  676 +
  677 + // If the widget is becoming disabled, then nothing is interactive
  678 + if ( value ) {
  679 + this.hoverable.removeClass( "ui-state-hover" );
  680 + this.focusable.removeClass( "ui-state-focus" );
  681 + }
  682 + }
  683 +
  684 + return this;
  685 + },
  686 +
  687 + enable: function() {
  688 + return this._setOptions({ disabled: false });
  689 + },
  690 + disable: function() {
  691 + return this._setOptions({ disabled: true });
  692 + },
  693 +
  694 + _on: function( suppressDisabledCheck, element, handlers ) {
  695 + var delegateElement,
  696 + instance = this;
  697 +
  698 + // no suppressDisabledCheck flag, shuffle arguments
  699 + if ( typeof suppressDisabledCheck !== "boolean" ) {
  700 + handlers = element;
  701 + element = suppressDisabledCheck;
  702 + suppressDisabledCheck = false;
  703 + }
  704 +
  705 + // no element argument, shuffle and use this.element
  706 + if ( !handlers ) {
  707 + handlers = element;
  708 + element = this.element;
  709 + delegateElement = this.widget();
  710 + } else {
  711 + element = delegateElement = $( element );
  712 + this.bindings = this.bindings.add( element );
  713 + }
  714 +
  715 + $.each( handlers, function( event, handler ) {
  716 + function handlerProxy() {
  717 + // allow widgets to customize the disabled handling
  718 + // - disabled as an array instead of boolean
  719 + // - disabled class as method for disabling individual parts
  720 + if ( !suppressDisabledCheck &&
  721 + ( instance.options.disabled === true ||
  722 + $( this ).hasClass( "ui-state-disabled" ) ) ) {
  723 + return;
  724 + }
  725 + return ( typeof handler === "string" ? instance[ handler ] : handler )
  726 + .apply( instance, arguments );
  727 + }
  728 +
  729 + // copy the guid so direct unbinding works
  730 + if ( typeof handler !== "string" ) {
  731 + handlerProxy.guid = handler.guid =
  732 + handler.guid || handlerProxy.guid || $.guid++;
  733 + }
  734 +
  735 + var match = event.match( /^([\w:-]*)\s*(.*)$/ ),
  736 + eventName = match[1] + instance.eventNamespace,
  737 + selector = match[2];
  738 + if ( selector ) {
  739 + delegateElement.delegate( selector, eventName, handlerProxy );
  740 + } else {
  741 + element.bind( eventName, handlerProxy );
  742 + }
  743 + });
  744 + },
  745 +
  746 + _off: function( element, eventName ) {
  747 + eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) +
  748 + this.eventNamespace;
  749 + element.unbind( eventName ).undelegate( eventName );
  750 +
  751 + // Clear the stack to avoid memory leaks (#10056)
  752 + this.bindings = $( this.bindings.not( element ).get() );
  753 + this.focusable = $( this.focusable.not( element ).get() );
  754 + this.hoverable = $( this.hoverable.not( element ).get() );
  755 + },
  756 +
  757 + _delay: function( handler, delay ) {
  758 + function handlerProxy() {
  759 + return ( typeof handler === "string" ? instance[ handler ] : handler )
  760 + .apply( instance, arguments );
  761 + }
  762 + var instance = this;
  763 + return setTimeout( handlerProxy, delay || 0 );
  764 + },
  765 +
  766 + _hoverable: function( element ) {
  767 + this.hoverable = this.hoverable.add( element );
  768 + this._on( element, {
  769 + mouseenter: function( event ) {
  770 + $( event.currentTarget ).addClass( "ui-state-hover" );
  771 + },
  772 + mouseleave: function( event ) {
  773 + $( event.currentTarget ).removeClass( "ui-state-hover" );
  774 + }
  775 + });
  776 + },
  777 +
  778 + _focusable: function( element ) {
  779 + this.focusable = this.focusable.add( element );
  780 + this._on( element, {
  781 + focusin: function( event ) {
  782 + $( event.currentTarget ).addClass( "ui-state-focus" );
  783 + },
  784 + focusout: function( event ) {
  785 + $( event.currentTarget ).removeClass( "ui-state-focus" );
  786 + }
  787 + });
  788 + },
  789 +
  790 + _trigger: function( type, event, data ) {
  791 + var prop, orig,
  792 + callback = this.options[ type ];
  793 +
  794 + data = data || {};
  795 + event = $.Event( event );
  796 + event.type = ( type === this.widgetEventPrefix ?
  797 + type :
  798 + this.widgetEventPrefix + type ).toLowerCase();
  799 + // the original event may come from any element
  800 + // so we need to reset the target on the new event
  801 + event.target = this.element[ 0 ];
  802 +
  803 + // copy original event properties over to the new event
  804 + orig = event.originalEvent;
  805 + if ( orig ) {
  806 + for ( prop in orig ) {
  807 + if ( !( prop in event ) ) {
  808 + event[ prop ] = orig[ prop ];
  809 + }
  810 + }
  811 + }
  812 +
  813 + this.element.trigger( event, data );
  814 + return !( $.isFunction( callback ) &&
  815 + callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
  816 + event.isDefaultPrevented() );
  817 + }
  818 +};
  819 +
  820 +$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
  821 + $.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
  822 + if ( typeof options === "string" ) {
  823 + options = { effect: options };
  824 + }
  825 + var hasOptions,
  826 + effectName = !options ?
  827 + method :
  828 + options === true || typeof options === "number" ?
  829 + defaultEffect :
  830 + options.effect || defaultEffect;
  831 + options = options || {};
  832 + if ( typeof options === "number" ) {
  833 + options = { duration: options };
  834 + }
  835 + hasOptions = !$.isEmptyObject( options );
  836 + options.complete = callback;
  837 + if ( options.delay ) {
  838 + element.delay( options.delay );
  839 + }
  840 + if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
  841 + element[ method ]( options );
  842 + } else if ( effectName !== method && element[ effectName ] ) {
  843 + element[ effectName ]( options.duration, options.easing, callback );
  844 + } else {
  845 + element.queue(function( next ) {
  846 + $( this )[ method ]();
  847 + if ( callback ) {
  848 + callback.call( element[ 0 ] );
  849 + }
  850 + next();
  851 + });
  852 + }
  853 + };
  854 +});
  855 +
  856 +var widget = $.widget;
  857 +
  858 +
  859 +/*!
  860 + * jQuery UI Position 1.11.4
  861 + * http://jqueryui.com
  862 + *
  863 + * Copyright jQuery Foundation and other contributors
  864 + * Released under the MIT license.
  865 + * http://jquery.org/license
  866 + *
  867 + * http://api.jqueryui.com/position/
  868 + */
  869 +
  870 +(function() {
  871 +
  872 +$.ui = $.ui || {};
  873 +
  874 +var cachedScrollbarWidth, supportsOffsetFractions,
  875 + max = Math.max,
  876 + abs = Math.abs,
  877 + round = Math.round,
  878 + rhorizontal = /left|center|right/,
  879 + rvertical = /top|center|bottom/,
  880 + roffset = /[\+\-]\d+(\.[\d]+)?%?/,
  881 + rposition = /^\w+/,
  882 + rpercent = /%$/,
  883 + _position = $.fn.position;
  884 +
  885 +function getOffsets( offsets, width, height ) {
  886 + return [
  887 + parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),
  888 + parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )
  889 + ];
  890 +}
  891 +
  892 +function parseCss( element, property ) {
  893 + return parseInt( $.css( element, property ), 10 ) || 0;
  894 +}
  895 +
  896 +function getDimensions( elem ) {
  897 + var raw = elem[0];
  898 + if ( raw.nodeType === 9 ) {
  899 + return {
  900 + width: elem.width(),
  901 + height: elem.height(),
  902 + offset: { top: 0, left: 0 }
  903 + };
  904 + }
  905 + if ( $.isWindow( raw ) ) {
  906 + return {
  907 + width: elem.width(),
  908 + height: elem.height(),
  909 + offset: { top: elem.scrollTop(), left: elem.scrollLeft() }
  910 + };
  911 + }
  912 + if ( raw.preventDefault ) {
  913 + return {
  914 + width: 0,
  915 + height: 0,
  916 + offset: { top: raw.pageY, left: raw.pageX }
  917 + };
  918 + }
  919 + return {
  920 + width: elem.outerWidth(),
  921 + height: elem.outerHeight(),
  922 + offset: elem.offset()
  923 + };
  924 +}
  925 +
  926 +$.position = {
  927 + scrollbarWidth: function() {
  928 + if ( cachedScrollbarWidth !== undefined ) {
  929 + return cachedScrollbarWidth;
  930 + }
  931 + var w1, w2,
  932 + div = $( "<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>" ),
  933 + innerDiv = div.children()[0];
  934 +
  935 + $( "body" ).append( div );
  936 + w1 = innerDiv.offsetWidth;
  937 + div.css( "overflow", "scroll" );
  938 +
  939 + w2 = innerDiv.offsetWidth;
  940 +
  941 + if ( w1 === w2 ) {
  942 + w2 = div[0].clientWidth;
  943 + }
  944 +
  945 + div.remove();
  946 +
  947 + return (cachedScrollbarWidth = w1 - w2);
  948 + },
  949 + getScrollInfo: function( within ) {
  950 + var overflowX = within.isWindow || within.isDocument ? "" :
  951 + within.element.css( "overflow-x" ),
  952 + overflowY = within.isWindow || within.isDocument ? "" :
  953 + within.element.css( "overflow-y" ),
  954 + hasOverflowX = overflowX === "scroll" ||
  955 + ( overflowX === "auto" && within.width < within.element[0].scrollWidth ),
  956 + hasOverflowY = overflowY === "scroll" ||
  957 + ( overflowY === "auto" && within.height < within.element[0].scrollHeight );
  958 + return {
  959 + width: hasOverflowY ? $.position.scrollbarWidth() : 0,
  960 + height: hasOverflowX ? $.position.scrollbarWidth() : 0
  961 + };
  962 + },
  963 + getWithinInfo: function( element ) {
  964 + var withinElement = $( element || window ),
  965 + isWindow = $.isWindow( withinElement[0] ),
  966 + isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9;
  967 + return {
  968 + element: withinElement,
  969 + isWindow: isWindow,
  970 + isDocument: isDocument,
  971 + offset: withinElement.offset() || { left: 0, top: 0 },
  972 + scrollLeft: withinElement.scrollLeft(),
  973 + scrollTop: withinElement.scrollTop(),
  974 +
  975 + // support: jQuery 1.6.x
  976 + // jQuery 1.6 doesn't support .outerWidth/Height() on documents or windows
  977 + width: isWindow || isDocument ? withinElement.width() : withinElement.outerWidth(),
  978 + height: isWindow || isDocument ? withinElement.height() : withinElement.outerHeight()
  979 + };
  980 + }
  981 +};
  982 +
  983 +$.fn.position = function( options ) {
  984 + if ( !options || !options.of ) {
  985 + return _position.apply( this, arguments );
  986 + }
  987 +
  988 + // make a copy, we don't want to modify arguments
  989 + options = $.extend( {}, options );
  990 +
  991 + var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,
  992 + target = $( options.of ),
  993 + within = $.position.getWithinInfo( options.within ),
  994 + scrollInfo = $.position.getScrollInfo( within ),
  995 + collision = ( options.collision || "flip" ).split( " " ),
  996 + offsets = {};
  997 +
  998 + dimensions = getDimensions( target );
  999 + if ( target[0].preventDefault ) {
  1000 + // force left top to allow flipping
  1001 + options.at = "left top";
  1002 + }
  1003 + targetWidth = dimensions.width;
  1004 + targetHeight = dimensions.height;
  1005 + targetOffset = dimensions.offset;
  1006 + // clone to reuse original targetOffset later
  1007 + basePosition = $.extend( {}, targetOffset );
  1008 +
  1009 + // force my and at to have valid horizontal and vertical positions
  1010 + // if a value is missing or invalid, it will be converted to center
  1011 + $.each( [ "my", "at" ], function() {
  1012 + var pos = ( options[ this ] || "" ).split( " " ),
  1013 + horizontalOffset,
  1014 + verticalOffset;
  1015 +
  1016 + if ( pos.length === 1) {
  1017 + pos = rhorizontal.test( pos[ 0 ] ) ?
  1018 + pos.concat( [ "center" ] ) :
  1019 + rvertical.test( pos[ 0 ] ) ?
  1020 + [ "center" ].concat( pos ) :
  1021 + [ "center", "center" ];
  1022 + }
  1023 + pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";
  1024 + pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";
  1025 +
  1026 + // calculate offsets
  1027 + horizontalOffset = roffset.exec( pos[ 0 ] );
  1028 + verticalOffset = roffset.exec( pos[ 1 ] );
  1029 + offsets[ this ] = [
  1030 + horizontalOffset ? horizontalOffset[ 0 ] : 0,
  1031 + verticalOffset ? verticalOffset[ 0 ] : 0
  1032 + ];
  1033 +
  1034 + // reduce to just the positions without the offsets
  1035 + options[ this ] = [
  1036 + rposition.exec( pos[ 0 ] )[ 0 ],
  1037 + rposition.exec( pos[ 1 ] )[ 0 ]
  1038 + ];
  1039 + });
  1040 +
  1041 + // normalize collision option
  1042 + if ( collision.length === 1 ) {
  1043 + collision[ 1 ] = collision[ 0 ];
  1044 + }
  1045 +
  1046 + if ( options.at[ 0 ] === "right" ) {
  1047 + basePosition.left += targetWidth;
  1048 + } else if ( options.at[ 0 ] === "center" ) {
  1049 + basePosition.left += targetWidth / 2;
  1050 + }
  1051 +
  1052 + if ( options.at[ 1 ] === "bottom" ) {
  1053 + basePosition.top += targetHeight;
  1054 + } else if ( options.at[ 1 ] === "center" ) {
  1055 + basePosition.top += targetHeight / 2;
  1056 + }
  1057 +
  1058 + atOffset = getOffsets( offsets.at, targetWidth, targetHeight );
  1059 + basePosition.left += atOffset[ 0 ];
  1060 + basePosition.top += atOffset[ 1 ];
  1061 +
  1062 + return this.each(function() {
  1063 + var collisionPosition, using,
  1064 + elem = $( this ),
  1065 + elemWidth = elem.outerWidth(),
  1066 + elemHeight = elem.outerHeight(),
  1067 + marginLeft = parseCss( this, "marginLeft" ),
  1068 + marginTop = parseCss( this, "marginTop" ),
  1069 + collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + scrollInfo.width,
  1070 + collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + scrollInfo.height,
  1071 + position = $.extend( {}, basePosition ),
  1072 + myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );
  1073 +
  1074 + if ( options.my[ 0 ] === "right" ) {
  1075 + position.left -= elemWidth;
  1076 + } else if ( options.my[ 0 ] === "center" ) {
  1077 + position.left -= elemWidth / 2;
  1078 + }
  1079 +
  1080 + if ( options.my[ 1 ] === "bottom" ) {
  1081 + position.top -= elemHeight;
  1082 + } else if ( options.my[ 1 ] === "center" ) {
  1083 + position.top -= elemHeight / 2;
  1084 + }
  1085 +
  1086 + position.left += myOffset[ 0 ];
  1087 + position.top += myOffset[ 1 ];
  1088 +
  1089 + // if the browser doesn't support fractions, then round for consistent results
  1090 + if ( !supportsOffsetFractions ) {
  1091 + position.left = round( position.left );
  1092 + position.top = round( position.top );
  1093 + }
  1094 +
  1095 + collisionPosition = {
  1096 + marginLeft: marginLeft,
  1097 + marginTop: marginTop
  1098 + };
  1099 +
  1100 + $.each( [ "left", "top" ], function( i, dir ) {
  1101 + if ( $.ui.position[ collision[ i ] ] ) {
  1102 + $.ui.position[ collision[ i ] ][ dir ]( position, {
  1103 + targetWidth: targetWidth,
  1104 + targetHeight: targetHeight,
  1105 + elemWidth: elemWidth,
  1106 + elemHeight: elemHeight,
  1107 + collisionPosition: collisionPosition,
  1108 + collisionWidth: collisionWidth,
  1109 + collisionHeight: collisionHeight,
  1110 + offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],
  1111 + my: options.my,
  1112 + at: options.at,
  1113 + within: within,
  1114 + elem: elem
  1115 + });
  1116 + }
  1117 + });
  1118 +
  1119 + if ( options.using ) {
  1120 + // adds feedback as second argument to using callback, if present
  1121 + using = function( props ) {
  1122 + var left = targetOffset.left - position.left,
  1123 + right = left + targetWidth - elemWidth,
  1124 + top = targetOffset.top - position.top,
  1125 + bottom = top + targetHeight - elemHeight,
  1126 + feedback = {
  1127 + target: {
  1128 + element: target,
  1129 + left: targetOffset.left,
  1130 + top: targetOffset.top,
  1131 + width: targetWidth,
  1132 + height: targetHeight
  1133 + },
  1134 + element: {
  1135 + element: elem,
  1136 + left: position.left,
  1137 + top: position.top,
  1138 + width: elemWidth,
  1139 + height: elemHeight
  1140 + },
  1141 + horizontal: right < 0 ? "left" : left > 0 ? "right" : "center",
  1142 + vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"
  1143 + };
  1144 + if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {
  1145 + feedback.horizontal = "center";
  1146 + }
  1147 + if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {
  1148 + feedback.vertical = "middle";
  1149 + }
  1150 + if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {
  1151 + feedback.important = "horizontal";
  1152 + } else {
  1153 + feedback.important = "vertical";
  1154 + }
  1155 + options.using.call( this, props, feedback );
  1156 + };
  1157 + }
  1158 +
  1159 + elem.offset( $.extend( position, { using: using } ) );
  1160 + });
  1161 +};
  1162 +
  1163 +$.ui.position = {
  1164 + fit: {
  1165 + left: function( position, data ) {
  1166 + var within = data.within,
  1167 + withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,
  1168 + outerWidth = within.width,
  1169 + collisionPosLeft = position.left - data.collisionPosition.marginLeft,
  1170 + overLeft = withinOffset - collisionPosLeft,
  1171 + overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,
  1172 + newOverRight;
  1173 +
  1174 + // element is wider than within
  1175 + if ( data.collisionWidth > outerWidth ) {
  1176 + // element is initially over the left side of within
  1177 + if ( overLeft > 0 && overRight <= 0 ) {
  1178 + newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset;
  1179 + position.left += overLeft - newOverRight;
  1180 + // element is initially over right side of within
  1181 + } else if ( overRight > 0 && overLeft <= 0 ) {
  1182 + position.left = withinOffset;
  1183 + // element is initially over both left and right sides of within
  1184 + } else {
  1185 + if ( overLeft > overRight ) {
  1186 + position.left = withinOffset + outerWidth - data.collisionWidth;
  1187 + } else {
  1188 + position.left = withinOffset;
  1189 + }
  1190 + }
  1191 + // too far left -> align with left edge
  1192 + } else if ( overLeft > 0 ) {
  1193 + position.left += overLeft;
  1194 + // too far right -> align with right edge
  1195 + } else if ( overRight > 0 ) {
  1196 + position.left -= overRight;
  1197 + // adjust based on position and margin
  1198 + } else {
  1199 + position.left = max( position.left - collisionPosLeft, position.left );
  1200 + }
  1201 + },
  1202 + top: function( position, data ) {
  1203 + var within = data.within,
  1204 + withinOffset = within.isWindow ? within.scrollTop : within.offset.top,
  1205 + outerHeight = data.within.height,
  1206 + collisionPosTop = position.top - data.collisionPosition.marginTop,
  1207 + overTop = withinOffset - collisionPosTop,
  1208 + overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,
  1209 + newOverBottom;
  1210 +
  1211 + // element is taller than within
  1212 + if ( data.collisionHeight > outerHeight ) {
  1213 + // element is initially over the top of within
  1214 + if ( overTop > 0 && overBottom <= 0 ) {
  1215 + newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset;
  1216 + position.top += overTop - newOverBottom;
  1217 + // element is initially over bottom of within
  1218 + } else if ( overBottom > 0 && overTop <= 0 ) {
  1219 + position.top = withinOffset;
  1220 + // element is initially over both top and bottom of within
  1221 + } else {
  1222 + if ( overTop > overBottom ) {
  1223 + position.top = withinOffset + outerHeight - data.collisionHeight;
  1224 + } else {
  1225 + position.top = withinOffset;
  1226 + }
  1227 + }
  1228 + // too far up -> align with top
  1229 + } else if ( overTop > 0 ) {
  1230 + position.top += overTop;
  1231 + // too far down -> align with bottom edge
  1232 + } else if ( overBottom > 0 ) {
  1233 + position.top -= overBottom;
  1234 + // adjust based on position and margin
  1235 + } else {
  1236 + position.top = max( position.top - collisionPosTop, position.top );
  1237 + }
  1238 + }
  1239 + },
  1240 + flip: {
  1241 + left: function( position, data ) {
  1242 + var within = data.within,
  1243 + withinOffset = within.offset.left + within.scrollLeft,
  1244 + outerWidth = within.width,
  1245 + offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,
  1246 + collisionPosLeft = position.left - data.collisionPosition.marginLeft,
  1247 + overLeft = collisionPosLeft - offsetLeft,
  1248 + overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,
  1249 + myOffset = data.my[ 0 ] === "left" ?
  1250 + -data.elemWidth :
  1251 + data.my[ 0 ] === "right" ?
  1252 + data.elemWidth :
  1253 + 0,
  1254 + atOffset = data.at[ 0 ] === "left" ?
  1255 + data.targetWidth :
  1256 + data.at[ 0 ] === "right" ?
  1257 + -data.targetWidth :
  1258 + 0,
  1259 + offset = -2 * data.offset[ 0 ],
  1260 + newOverRight,
  1261 + newOverLeft;
  1262 +
  1263 + if ( overLeft < 0 ) {
  1264 + newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset;
  1265 + if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {
  1266 + position.left += myOffset + atOffset + offset;
  1267 + }
  1268 + } else if ( overRight > 0 ) {
  1269 + newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft;
  1270 + if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {
  1271 + position.left += myOffset + atOffset + offset;
  1272 + }
  1273 + }
  1274 + },
  1275 + top: function( position, data ) {
  1276 + var within = data.within,
  1277 + withinOffset = within.offset.top + within.scrollTop,
  1278 + outerHeight = within.height,
  1279 + offsetTop = within.isWindow ? within.scrollTop : within.offset.top,
  1280 + collisionPosTop = position.top - data.collisionPosition.marginTop,
  1281 + overTop = collisionPosTop - offsetTop,
  1282 + overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,
  1283 + top = data.my[ 1 ] === "top",
  1284 + myOffset = top ?
  1285 + -data.elemHeight :
  1286 + data.my[ 1 ] === "bottom" ?
  1287 + data.elemHeight :
  1288 + 0,
  1289 + atOffset = data.at[ 1 ] === "top" ?
  1290 + data.targetHeight :
  1291 + data.at[ 1 ] === "bottom" ?
  1292 + -data.targetHeight :
  1293 + 0,
  1294 + offset = -2 * data.offset[ 1 ],
  1295 + newOverTop,
  1296 + newOverBottom;
  1297 + if ( overTop < 0 ) {
  1298 + newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset;
  1299 + if ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) {
  1300 + position.top += myOffset + atOffset + offset;
  1301 + }
  1302 + } else if ( overBottom > 0 ) {
  1303 + newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop;
  1304 + if ( newOverTop > 0 || abs( newOverTop ) < overBottom ) {
  1305 + position.top += myOffset + atOffset + offset;
  1306 + }
  1307 + }
  1308 + }
  1309 + },
  1310 + flipfit: {
  1311 + left: function() {
  1312 + $.ui.position.flip.left.apply( this, arguments );
  1313 + $.ui.position.fit.left.apply( this, arguments );
  1314 + },
  1315 + top: function() {
  1316 + $.ui.position.flip.top.apply( this, arguments );
  1317 + $.ui.position.fit.top.apply( this, arguments );
  1318 + }
  1319 + }
  1320 +};
  1321 +
  1322 +// fraction support test
  1323 +(function() {
  1324 + var testElement, testElementParent, testElementStyle, offsetLeft, i,
  1325 + body = document.getElementsByTagName( "body" )[ 0 ],
  1326 + div = document.createElement( "div" );
  1327 +
  1328 + //Create a "fake body" for testing based on method used in jQuery.support
  1329 + testElement = document.createElement( body ? "div" : "body" );
  1330 + testElementStyle = {
  1331 + visibility: "hidden",
  1332 + width: 0,
  1333 + height: 0,
  1334 + border: 0,
  1335 + margin: 0,
  1336 + background: "none"
  1337 + };
  1338 + if ( body ) {
  1339 + $.extend( testElementStyle, {
  1340 + position: "absolute",
  1341 + left: "-1000px",
  1342 + top: "-1000px"
  1343 + });
  1344 + }
  1345 + for ( i in testElementStyle ) {
  1346 + testElement.style[ i ] = testElementStyle[ i ];
  1347 + }
  1348 + testElement.appendChild( div );
  1349 + testElementParent = body || document.documentElement;
  1350 + testElementParent.insertBefore( testElement, testElementParent.firstChild );
  1351 +
  1352 + div.style.cssText = "position: absolute; left: 10.7432222px;";
  1353 +
  1354 + offsetLeft = $( div ).offset().left;
  1355 + supportsOffsetFractions = offsetLeft > 10 && offsetLeft < 11;
  1356 +
  1357 + testElement.innerHTML = "";
  1358 + testElementParent.removeChild( testElement );
  1359 +})();
  1360 +
  1361 +})();
  1362 +
  1363 +var position = $.ui.position;
  1364 +
  1365 +
  1366 +/*!
  1367 + * jQuery UI Menu 1.11.4
  1368 + * http://jqueryui.com
  1369 + *
  1370 + * Copyright jQuery Foundation and other contributors
  1371 + * Released under the MIT license.
  1372 + * http://jquery.org/license
  1373 + *
  1374 + * http://api.jqueryui.com/menu/
  1375 + */
  1376 +
  1377 +
  1378 +var menu = $.widget( "ui.menu", {
  1379 + version: "1.11.4",
  1380 + defaultElement: "<ul>",
  1381 + delay: 300,
  1382 + options: {
  1383 + icons: {
  1384 + submenu: "ui-icon-carat-1-e"
  1385 + },
  1386 + items: "> *",
  1387 + menus: "ul",
  1388 + position: {
  1389 + my: "left-1 top",
  1390 + at: "right top"
  1391 + },
  1392 + role: "menu",
  1393 +
  1394 + // callbacks
  1395 + blur: null,
  1396 + focus: null,
  1397 + select: null
  1398 + },
  1399 +
  1400 + _create: function() {
  1401 + this.activeMenu = this.element;
  1402 +
  1403 + // Flag used to prevent firing of the click handler
  1404 + // as the event bubbles up through nested menus
  1405 + this.mouseHandled = false;
  1406 + this.element
  1407 + .uniqueId()
  1408 + .addClass( "ui-menu ui-widget ui-widget-content" )
  1409 + .toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length )
  1410 + .attr({
  1411 + role: this.options.role,
  1412 + tabIndex: 0
  1413 + });
  1414 +
  1415 + if ( this.options.disabled ) {
  1416 + this.element
  1417 + .addClass( "ui-state-disabled" )
  1418 + .attr( "aria-disabled", "true" );
  1419 + }
  1420 +
  1421 + this._on({
  1422 + // Prevent focus from sticking to links inside menu after clicking
  1423 + // them (focus should always stay on UL during navigation).
  1424 + "mousedown .ui-menu-item": function( event ) {
  1425 + event.preventDefault();
  1426 + },
  1427 + "click .ui-menu-item": function( event ) {
  1428 + var target = $( event.target );
  1429 + if ( !this.mouseHandled && target.not( ".ui-state-disabled" ).length ) {
  1430 + this.select( event );
  1431 +
  1432 + // Only set the mouseHandled flag if the event will bubble, see #9469.
  1433 + if ( !event.isPropagationStopped() ) {
  1434 + this.mouseHandled = true;
  1435 + }
  1436 +
  1437 + // Open submenu on click
  1438 + if ( target.has( ".ui-menu" ).length ) {
  1439 + this.expand( event );
  1440 + } else if ( !this.element.is( ":focus" ) && $( this.document[ 0 ].activeElement ).closest( ".ui-menu" ).length ) {
  1441 +
  1442 + // Redirect focus to the menu
  1443 + this.element.trigger( "focus", [ true ] );
  1444 +
  1445 + // If the active item is on the top level, let it stay active.
  1446 + // Otherwise, blur the active item since it is no longer visible.
  1447 + if ( this.active && this.active.parents( ".ui-menu" ).length === 1 ) {
  1448 + clearTimeout( this.timer );
  1449 + }
  1450 + }
  1451 + }
  1452 + },
  1453 + "mouseenter .ui-menu-item": function( event ) {
  1454 + // Ignore mouse events while typeahead is active, see #10458.
  1455 + // Prevents focusing the wrong item when typeahead causes a scroll while the mouse
  1456 + // is over an item in the menu
  1457 + if ( this.previousFilter ) {
  1458 + return;
  1459 + }
  1460 + var target = $( event.currentTarget );
  1461 + // Remove ui-state-active class from siblings of the newly focused menu item
  1462 + // to avoid a jump caused by adjacent elements both having a class with a border
  1463 + target.siblings( ".ui-state-active" ).removeClass( "ui-state-active" );
  1464 + this.focus( event, target );
  1465 + },
  1466 + mouseleave: "collapseAll",
  1467 + "mouseleave .ui-menu": "collapseAll",
  1468 + focus: function( event, keepActiveItem ) {
  1469 + // If there's already an active item, keep it active
  1470 + // If not, activate the first item
  1471 + var item = this.active || this.element.find( this.options.items ).eq( 0 );
  1472 +
  1473 + if ( !keepActiveItem ) {
  1474 + this.focus( event, item );
  1475 + }
  1476 + },
  1477 + blur: function( event ) {
  1478 + this._delay(function() {
  1479 + if ( !$.contains( this.element[0], this.document[0].activeElement ) ) {
  1480 + this.collapseAll( event );
  1481 + }
  1482 + });
  1483 + },
  1484 + keydown: "_keydown"
  1485 + });
  1486 +
  1487 + this.refresh();
  1488 +
  1489 + // Clicks outside of a menu collapse any open menus
  1490 + this._on( this.document, {
  1491 + click: function( event ) {
  1492 + if ( this._closeOnDocumentClick( event ) ) {
  1493 + this.collapseAll( event );
  1494 + }
  1495 +
  1496 + // Reset the mouseHandled flag
  1497 + this.mouseHandled = false;
  1498 + }
  1499 + });
  1500 + },
  1501 +
  1502 + _destroy: function() {
  1503 + // Destroy (sub)menus
  1504 + this.element
  1505 + .removeAttr( "aria-activedescendant" )
  1506 + .find( ".ui-menu" ).addBack()
  1507 + .removeClass( "ui-menu ui-widget ui-widget-content ui-menu-icons ui-front" )
  1508 + .removeAttr( "role" )
  1509 + .removeAttr( "tabIndex" )
  1510 + .removeAttr( "aria-labelledby" )
  1511 + .removeAttr( "aria-expanded" )
  1512 + .removeAttr( "aria-hidden" )
  1513 + .removeAttr( "aria-disabled" )
  1514 + .removeUniqueId()
  1515 + .show();
  1516 +
  1517 + // Destroy menu items
  1518 + this.element.find( ".ui-menu-item" )
  1519 + .removeClass( "ui-menu-item" )
  1520 + .removeAttr( "role" )
  1521 + .removeAttr( "aria-disabled" )
  1522 + .removeUniqueId()
  1523 + .removeClass( "ui-state-hover" )
  1524 + .removeAttr( "tabIndex" )
  1525 + .removeAttr( "role" )
  1526 + .removeAttr( "aria-haspopup" )
  1527 + .children().each( function() {
  1528 + var elem = $( this );
  1529 + if ( elem.data( "ui-menu-submenu-carat" ) ) {
  1530 + elem.remove();
  1531 + }
  1532 + });
  1533 +
  1534 + // Destroy menu dividers
  1535 + this.element.find( ".ui-menu-divider" ).removeClass( "ui-menu-divider ui-widget-content" );
  1536 + },
  1537 +
  1538 + _keydown: function( event ) {
  1539 + var match, prev, character, skip,
  1540 + preventDefault = true;
  1541 +
  1542 + switch ( event.keyCode ) {
  1543 + case $.ui.keyCode.PAGE_UP:
  1544 + this.previousPage( event );
  1545 + break;
  1546 + case $.ui.keyCode.PAGE_DOWN:
  1547 + this.nextPage( event );
  1548 + break;
  1549 + case $.ui.keyCode.HOME:
  1550 + this._move( "first", "first", event );
  1551 + break;
  1552 + case $.ui.keyCode.END:
  1553 + this._move( "last", "last", event );
  1554 + break;
  1555 + case $.ui.keyCode.UP:
  1556 + this.previous( event );
  1557 + break;
  1558 + case $.ui.keyCode.DOWN:
  1559 + this.next( event );
  1560 + break;
  1561 + case $.ui.keyCode.LEFT:
  1562 + this.collapse( event );
  1563 + break;
  1564 + case $.ui.keyCode.RIGHT:
  1565 + if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {
  1566 + this.expand( event );
  1567 + }
  1568 + break;
  1569 + case $.ui.keyCode.ENTER:
  1570 + case $.ui.keyCode.SPACE:
  1571 + this._activate( event );
  1572 + break;
  1573 + case $.ui.keyCode.ESCAPE:
  1574 + this.collapse( event );
  1575 + break;
  1576 + default:
  1577 + preventDefault = false;
  1578 + prev = this.previousFilter || "";
  1579 + character = String.fromCharCode( event.keyCode );
  1580 + skip = false;
  1581 +
  1582 + clearTimeout( this.filterTimer );
  1583 +
  1584 + if ( character === prev ) {
  1585 + skip = true;
  1586 + } else {
  1587 + character = prev + character;
  1588 + }
  1589 +
  1590 + match = this._filterMenuItems( character );
  1591 + match = skip && match.index( this.active.next() ) !== -1 ?
  1592 + this.active.nextAll( ".ui-menu-item" ) :
  1593 + match;
  1594 +
  1595 + // If no matches on the current filter, reset to the last character pressed
  1596 + // to move down the menu to the first item that starts with that character
  1597 + if ( !match.length ) {
  1598 + character = String.fromCharCode( event.keyCode );
  1599 + match = this._filterMenuItems( character );
  1600 + }
  1601 +
  1602 + if ( match.length ) {
  1603 + this.focus( event, match );
  1604 + this.previousFilter = character;
  1605 + this.filterTimer = this._delay(function() {
  1606 + delete this.previousFilter;
  1607 + }, 1000 );
  1608 + } else {
  1609 + delete this.previousFilter;
  1610 + }
  1611 + }
  1612 +
  1613 + if ( preventDefault ) {
  1614 + event.preventDefault();
  1615 + }
  1616 + },
  1617 +
  1618 + _activate: function( event ) {
  1619 + if ( !this.active.is( ".ui-state-disabled" ) ) {
  1620 + if ( this.active.is( "[aria-haspopup='true']" ) ) {
  1621 + this.expand( event );
  1622 + } else {
  1623 + this.select( event );
  1624 + }
  1625 + }
  1626 + },
  1627 +
  1628 + refresh: function() {
  1629 + var menus, items,
  1630 + that = this,
  1631 + icon = this.options.icons.submenu,
  1632 + submenus = this.element.find( this.options.menus );
  1633 +
  1634 + this.element.toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length );
  1635 +
  1636 + // Initialize nested menus
  1637 + submenus.filter( ":not(.ui-menu)" )
  1638 + .addClass( "ui-menu ui-widget ui-widget-content ui-front" )
  1639 + .hide()
  1640 + .attr({
  1641 + role: this.options.role,
  1642 + "aria-hidden": "true",
  1643 + "aria-expanded": "false"
  1644 + })
  1645 + .each(function() {
  1646 + var menu = $( this ),
  1647 + item = menu.parent(),
  1648 + submenuCarat = $( "<span>" )
  1649 + .addClass( "ui-menu-icon ui-icon " + icon )
  1650 + .data( "ui-menu-submenu-carat", true );
  1651 +
  1652 + item
  1653 + .attr( "aria-haspopup", "true" )
  1654 + .prepend( submenuCarat );
  1655 + menu.attr( "aria-labelledby", item.attr( "id" ) );
  1656 + });
  1657 +
  1658 + menus = submenus.add( this.element );
  1659 + items = menus.find( this.options.items );
  1660 +
  1661 + // Initialize menu-items containing spaces and/or dashes only as dividers
  1662 + items.not( ".ui-menu-item" ).each(function() {
  1663 + var item = $( this );
  1664 + if ( that._isDivider( item ) ) {
  1665 + item.addClass( "ui-widget-content ui-menu-divider" );
  1666 + }
  1667 + });
  1668 +
  1669 + // Don't refresh list items that are already adapted
  1670 + items.not( ".ui-menu-item, .ui-menu-divider" )
  1671 + .addClass( "ui-menu-item" )
  1672 + .uniqueId()
  1673 + .attr({
  1674 + tabIndex: -1,
  1675 + role: this._itemRole()
  1676 + });
  1677 +
  1678 + // Add aria-disabled attribute to any disabled menu item
  1679 + items.filter( ".ui-state-disabled" ).attr( "aria-disabled", "true" );
  1680 +
  1681 + // If the active item has been removed, blur the menu
  1682 + if ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
  1683 + this.blur();
  1684 + }
  1685 + },
  1686 +
  1687 + _itemRole: function() {
  1688 + return {
  1689 + menu: "menuitem",
  1690 + listbox: "option"
  1691 + }[ this.options.role ];
  1692 + },
  1693 +
  1694 + _setOption: function( key, value ) {
  1695 + if ( key === "icons" ) {
  1696 + this.element.find( ".ui-menu-icon" )
  1697 + .removeClass( this.options.icons.submenu )
  1698 + .addClass( value.submenu );
  1699 + }
  1700 + if ( key === "disabled" ) {
  1701 + this.element
  1702 + .toggleClass( "ui-state-disabled", !!value )
  1703 + .attr( "aria-disabled", value );
  1704 + }
  1705 + this._super( key, value );
  1706 + },
  1707 +
  1708 + focus: function( event, item ) {
  1709 + var nested, focused;
  1710 + this.blur( event, event && event.type === "focus" );
  1711 +
  1712 + this._scrollIntoView( item );
  1713 +
  1714 + this.active = item.first();
  1715 + focused = this.active.addClass( "ui-state-focus" ).removeClass( "ui-state-active" );
  1716 + // Only update aria-activedescendant if there's a role
  1717 + // otherwise we assume focus is managed elsewhere
  1718 + if ( this.options.role ) {
  1719 + this.element.attr( "aria-activedescendant", focused.attr( "id" ) );
  1720 + }
  1721 +
  1722 + // Highlight active parent menu item, if any
  1723 + this.active
  1724 + .parent()
  1725 + .closest( ".ui-menu-item" )
  1726 + .addClass( "ui-state-active" );
  1727 +
  1728 + if ( event && event.type === "keydown" ) {
  1729 + this._close();
  1730 + } else {
  1731 + this.timer = this._delay(function() {
  1732 + this._close();
  1733 + }, this.delay );
  1734 + }
  1735 +
  1736 + nested = item.children( ".ui-menu" );
  1737 + if ( nested.length && event && ( /^mouse/.test( event.type ) ) ) {
  1738 + this._startOpening(nested);
  1739 + }
  1740 + this.activeMenu = item.parent();
  1741 +
  1742 + this._trigger( "focus", event, { item: item } );
  1743 + },
  1744 +
  1745 + _scrollIntoView: function( item ) {
  1746 + var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;
  1747 + if ( this._hasScroll() ) {
  1748 + borderTop = parseFloat( $.css( this.activeMenu[0], "borderTopWidth" ) ) || 0;
  1749 + paddingTop = parseFloat( $.css( this.activeMenu[0], "paddingTop" ) ) || 0;
  1750 + offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;
  1751 + scroll = this.activeMenu.scrollTop();
  1752 + elementHeight = this.activeMenu.height();
  1753 + itemHeight = item.outerHeight();
  1754 +
  1755 + if ( offset < 0 ) {
  1756 + this.activeMenu.scrollTop( scroll + offset );
  1757 + } else if ( offset + itemHeight > elementHeight ) {
  1758 + this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );
  1759 + }
  1760 + }
  1761 + },
  1762 +
  1763 + blur: function( event, fromFocus ) {
  1764 + if ( !fromFocus ) {
  1765 + clearTimeout( this.timer );
  1766 + }
  1767 +
  1768 + if ( !this.active ) {
  1769 + return;
  1770 + }
  1771 +
  1772 + this.active.removeClass( "ui-state-focus" );
  1773 + this.active = null;
  1774 +
  1775 + this._trigger( "blur", event, { item: this.active } );
  1776 + },
  1777 +
  1778 + _startOpening: function( submenu ) {
  1779 + clearTimeout( this.timer );
  1780 +
  1781 + // Don't open if already open fixes a Firefox bug that caused a .5 pixel
  1782 + // shift in the submenu position when mousing over the carat icon
  1783 + if ( submenu.attr( "aria-hidden" ) !== "true" ) {
  1784 + return;
  1785 + }
  1786 +
  1787 + this.timer = this._delay(function() {
  1788 + this._close();
  1789 + this._open( submenu );
  1790 + }, this.delay );
  1791 + },
  1792 +
  1793 + _open: function( submenu ) {
  1794 + var position = $.extend({
  1795 + of: this.active
  1796 + }, this.options.position );
  1797 +
  1798 + clearTimeout( this.timer );
  1799 + this.element.find( ".ui-menu" ).not( submenu.parents( ".ui-menu" ) )
  1800 + .hide()
  1801 + .attr( "aria-hidden", "true" );
  1802 +
  1803 + submenu
  1804 + .show()
  1805 + .removeAttr( "aria-hidden" )
  1806 + .attr( "aria-expanded", "true" )
  1807 + .position( position );
  1808 + },
  1809 +
  1810 + collapseAll: function( event, all ) {
  1811 + clearTimeout( this.timer );
  1812 + this.timer = this._delay(function() {
  1813 + // If we were passed an event, look for the submenu that contains the event
  1814 + var currentMenu = all ? this.element :
  1815 + $( event && event.target ).closest( this.element.find( ".ui-menu" ) );
  1816 +
  1817 + // If we found no valid submenu ancestor, use the main menu to close all sub menus anyway
  1818 + if ( !currentMenu.length ) {
  1819 + currentMenu = this.element;
  1820 + }
  1821 +
  1822 + this._close( currentMenu );
  1823 +
  1824 + this.blur( event );
  1825 + this.activeMenu = currentMenu;
  1826 + }, this.delay );
  1827 + },
  1828 +
  1829 + // With no arguments, closes the currently active menu - if nothing is active
  1830 + // it closes all menus. If passed an argument, it will search for menus BELOW
  1831 + _close: function( startMenu ) {
  1832 + if ( !startMenu ) {
  1833 + startMenu = this.active ? this.active.parent() : this.element;
  1834 + }
  1835 +
  1836 + startMenu
  1837 + .find( ".ui-menu" )
  1838 + .hide()
  1839 + .attr( "aria-hidden", "true" )
  1840 + .attr( "aria-expanded", "false" )
  1841 + .end()
  1842 + .find( ".ui-state-active" ).not( ".ui-state-focus" )
  1843 + .removeClass( "ui-state-active" );
  1844 + },
  1845 +
  1846 + _closeOnDocumentClick: function( event ) {
  1847 + return !$( event.target ).closest( ".ui-menu" ).length;
  1848 + },
  1849 +
  1850 + _isDivider: function( item ) {
  1851 +
  1852 + // Match hyphen, em dash, en dash
  1853 + return !/[^\-\u2014\u2013\s]/.test( item.text() );
  1854 + },
  1855 +
  1856 + collapse: function( event ) {
  1857 + var newItem = this.active &&
  1858 + this.active.parent().closest( ".ui-menu-item", this.element );
  1859 + if ( newItem && newItem.length ) {
  1860 + this._close();
  1861 + this.focus( event, newItem );
  1862 + }
  1863 + },
  1864 +
  1865 + expand: function( event ) {
  1866 + var newItem = this.active &&
  1867 + this.active
  1868 + .children( ".ui-menu " )
  1869 + .find( this.options.items )
  1870 + .first();
  1871 +
  1872 + if ( newItem && newItem.length ) {
  1873 + this._open( newItem.parent() );
  1874 +
  1875 + // Delay so Firefox will not hide activedescendant change in expanding submenu from AT
  1876 + this._delay(function() {
  1877 + this.focus( event, newItem );
  1878 + });
  1879 + }
  1880 + },
  1881 +
  1882 + next: function( event ) {
  1883 + this._move( "next", "first", event );
  1884 + },
  1885 +
  1886 + previous: function( event ) {
  1887 + this._move( "prev", "last", event );
  1888 + },
  1889 +
  1890 + isFirstItem: function() {
  1891 + return this.active && !this.active.prevAll( ".ui-menu-item" ).length;
  1892 + },
  1893 +
  1894 + isLastItem: function() {
  1895 + return this.active && !this.active.nextAll( ".ui-menu-item" ).length;
  1896 + },
  1897 +
  1898 + _move: function( direction, filter, event ) {
  1899 + var next;
  1900 + if ( this.active ) {
  1901 + if ( direction === "first" || direction === "last" ) {
  1902 + next = this.active
  1903 + [ direction === "first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" )
  1904 + .eq( -1 );
  1905 + } else {
  1906 + next = this.active
  1907 + [ direction + "All" ]( ".ui-menu-item" )
  1908 + .eq( 0 );
  1909 + }
  1910 + }
  1911 + if ( !next || !next.length || !this.active ) {
  1912 + next = this.activeMenu.find( this.options.items )[ filter ]();
  1913 + }
  1914 +
  1915 + this.focus( event, next );
  1916 + },
  1917 +
  1918 + nextPage: function( event ) {
  1919 + var item, base, height;
  1920 +
  1921 + if ( !this.active ) {
  1922 + this.next( event );
  1923 + return;
  1924 + }
  1925 + if ( this.isLastItem() ) {
  1926 + return;
  1927 + }
  1928 + if ( this._hasScroll() ) {
  1929 + base = this.active.offset().top;
  1930 + height = this.element.height();
  1931 + this.active.nextAll( ".ui-menu-item" ).each(function() {
  1932 + item = $( this );
  1933 + return item.offset().top - base - height < 0;
  1934 + });
  1935 +
  1936 + this.focus( event, item );
  1937 + } else {
  1938 + this.focus( event, this.activeMenu.find( this.options.items )
  1939 + [ !this.active ? "first" : "last" ]() );
  1940 + }
  1941 + },
  1942 +
  1943 + previousPage: function( event ) {
  1944 + var item, base, height;
  1945 + if ( !this.active ) {
  1946 + this.next( event );
  1947 + return;
  1948 + }
  1949 + if ( this.isFirstItem() ) {
  1950 + return;
  1951 + }
  1952 + if ( this._hasScroll() ) {
  1953 + base = this.active.offset().top;
  1954 + height = this.element.height();
  1955 + this.active.prevAll( ".ui-menu-item" ).each(function() {
  1956 + item = $( this );
  1957 + return item.offset().top - base + height > 0;
  1958 + });
  1959 +
  1960 + this.focus( event, item );
  1961 + } else {
  1962 + this.focus( event, this.activeMenu.find( this.options.items ).first() );
  1963 + }
  1964 + },
  1965 +
  1966 + _hasScroll: function() {
  1967 + return this.element.outerHeight() < this.element.prop( "scrollHeight" );
  1968 + },
  1969 +
  1970 + select: function( event ) {
  1971 + // TODO: It should never be possible to not have an active item at this
  1972 + // point, but the tests don't trigger mouseenter before click.
  1973 + this.active = this.active || $( event.target ).closest( ".ui-menu-item" );
  1974 + var ui = { item: this.active };
  1975 + if ( !this.active.has( ".ui-menu" ).length ) {
  1976 + this.collapseAll( event, true );
  1977 + }
  1978 + this._trigger( "select", event, ui );
  1979 + },
  1980 +
  1981 + _filterMenuItems: function(character) {
  1982 + var escapedCharacter = character.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" ),
  1983 + regex = new RegExp( "^" + escapedCharacter, "i" );
  1984 +
  1985 + return this.activeMenu
  1986 + .find( this.options.items )
  1987 +
  1988 + // Only match on items, not dividers or other content (#10571)
  1989 + .filter( ".ui-menu-item" )
  1990 + .filter(function() {
  1991 + return regex.test( $.trim( $( this ).text() ) );
  1992 + });
  1993 + }
  1994 +});
  1995 +
  1996 +
  1997 +/*!
  1998 + * jQuery UI Autocomplete 1.11.4
  1999 + * http://jqueryui.com
  2000 + *
  2001 + * Copyright jQuery Foundation and other contributors
  2002 + * Released under the MIT license.
  2003 + * http://jquery.org/license
  2004 + *
  2005 + * http://api.jqueryui.com/autocomplete/
  2006 + */
  2007 +
  2008 +
  2009 +$.widget( "ui.autocomplete", {
  2010 + version: "1.11.4",
  2011 + defaultElement: "<input>",
  2012 + options: {
  2013 + appendTo: null,
  2014 + autoFocus: false,
  2015 + delay: 300,
  2016 + minLength: 1,
  2017 + position: {
  2018 + my: "left top",
  2019 + at: "left bottom",
  2020 + collision: "none"
  2021 + },
  2022 + source: null,
  2023 +
  2024 + // callbacks
  2025 + change: null,
  2026 + close: null,
  2027 + focus: null,
  2028 + open: null,
  2029 + response: null,
  2030 + search: null,
  2031 + select: null
  2032 + },
  2033 +
  2034 + requestIndex: 0,
  2035 + pending: 0,
  2036 +
  2037 + _create: function() {
  2038 + // Some browsers only repeat keydown events, not keypress events,
  2039 + // so we use the suppressKeyPress flag to determine if we've already
  2040 + // handled the keydown event. #7269
  2041 + // Unfortunately the code for & in keypress is the same as the up arrow,
  2042 + // so we use the suppressKeyPressRepeat flag to avoid handling keypress
  2043 + // events when we know the keydown event was used to modify the
  2044 + // search term. #7799
  2045 + var suppressKeyPress, suppressKeyPressRepeat, suppressInput,
  2046 + nodeName = this.element[ 0 ].nodeName.toLowerCase(),
  2047 + isTextarea = nodeName === "textarea",
  2048 + isInput = nodeName === "input";
  2049 +
  2050 + this.isMultiLine =
  2051 + // Textareas are always multi-line
  2052 + isTextarea ? true :
  2053 + // Inputs are always single-line, even if inside a contentEditable element
  2054 + // IE also treats inputs as contentEditable
  2055 + isInput ? false :
  2056 + // All other element types are determined by whether or not they're contentEditable
  2057 + this.element.prop( "isContentEditable" );
  2058 +
  2059 + this.valueMethod = this.element[ isTextarea || isInput ? "val" : "text" ];
  2060 + this.isNewMenu = true;
  2061 +
  2062 + this.element
  2063 + .addClass( "ui-autocomplete-input" )
  2064 + .attr( "autocomplete", "off" );
  2065 +
  2066 + this._on( this.element, {
  2067 + keydown: function( event ) {
  2068 + if ( this.element.prop( "readOnly" ) ) {
  2069 + suppressKeyPress = true;
  2070 + suppressInput = true;
  2071 + suppressKeyPressRepeat = true;
  2072 + return;
  2073 + }
  2074 +
  2075 + suppressKeyPress = false;
  2076 + suppressInput = false;
  2077 + suppressKeyPressRepeat = false;
  2078 + var keyCode = $.ui.keyCode;
  2079 + switch ( event.keyCode ) {
  2080 + case keyCode.PAGE_UP:
  2081 + suppressKeyPress = true;
  2082 + this._move( "previousPage", event );
  2083 + break;
  2084 + case keyCode.PAGE_DOWN:
  2085 + suppressKeyPress = true;
  2086 + this._move( "nextPage", event );
  2087 + break;
  2088 + case keyCode.UP:
  2089 + suppressKeyPress = true;
  2090 + this._keyEvent( "previous", event );
  2091 + break;
  2092 + case keyCode.DOWN:
  2093 + suppressKeyPress = true;
  2094 + this._keyEvent( "next", event );
  2095 + break;
  2096 + case keyCode.ENTER:
  2097 + // when menu is open and has focus
  2098 + if ( this.menu.active ) {
  2099 + // #6055 - Opera still allows the keypress to occur
  2100 + // which causes forms to submit
  2101 + suppressKeyPress = true;
  2102 + event.preventDefault();
  2103 + this.menu.select( event );
  2104 + }
  2105 + break;
  2106 + case keyCode.TAB:
  2107 + if ( this.menu.active ) {
  2108 + this.menu.select( event );
  2109 + }
  2110 + break;
  2111 + case keyCode.ESCAPE:
  2112 + if ( this.menu.element.is( ":visible" ) ) {
  2113 + if ( !this.isMultiLine ) {
  2114 + this._value( this.term );
  2115 + }
  2116 + this.close( event );
  2117 + // Different browsers have different default behavior for escape
  2118 + // Single press can mean undo or clear
  2119 + // Double press in IE means clear the whole form
  2120 + event.preventDefault();
  2121 + }
  2122 + break;
  2123 + default:
  2124 + suppressKeyPressRepeat = true;
  2125 + // search timeout should be triggered before the input value is changed
  2126 + this._searchTimeout( event );
  2127 + break;
  2128 + }
  2129 + },
  2130 + keypress: function( event ) {
  2131 + if ( suppressKeyPress ) {
  2132 + suppressKeyPress = false;
  2133 + if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
  2134 + event.preventDefault();
  2135 + }
  2136 + return;
  2137 + }
  2138 + if ( suppressKeyPressRepeat ) {
  2139 + return;
  2140 + }
  2141 +
  2142 + // replicate some key handlers to allow them to repeat in Firefox and Opera
  2143 + var keyCode = $.ui.keyCode;
  2144 + switch ( event.keyCode ) {
  2145 + case keyCode.PAGE_UP:
  2146 + this._move( "previousPage", event );
  2147 + break;
  2148 + case keyCode.PAGE_DOWN:
  2149 + this._move( "nextPage", event );
  2150 + break;
  2151 + case keyCode.UP:
  2152 + this._keyEvent( "previous", event );
  2153 + break;
  2154 + case keyCode.DOWN:
  2155 + this._keyEvent( "next", event );
  2156 + break;
  2157 + }
  2158 + },
  2159 + input: function( event ) {
  2160 + if ( suppressInput ) {
  2161 + suppressInput = false;
  2162 + event.preventDefault();
  2163 + return;
  2164 + }
  2165 + this._searchTimeout( event );
  2166 + },
  2167 + focus: function() {
  2168 + this.selectedItem = null;
  2169 + this.previous = this._value();
  2170 + },
  2171 + blur: function( event ) {
  2172 + if ( this.cancelBlur ) {
  2173 + delete this.cancelBlur;
  2174 + return;
  2175 + }
  2176 +
  2177 + clearTimeout( this.searching );
  2178 + this.close( event );
  2179 + this._change( event );
  2180 + }
  2181 + });
  2182 +
  2183 + this._initSource();
  2184 + this.menu = $( "<ul>" )
  2185 + .addClass( "ui-autocomplete ui-front" )
  2186 + .appendTo( this._appendTo() )
  2187 + .menu({
  2188 + // disable ARIA support, the live region takes care of that
  2189 + role: null
  2190 + })
  2191 + .hide()
  2192 + .menu( "instance" );
  2193 +
  2194 + this._on( this.menu.element, {
  2195 + mousedown: function( event ) {
  2196 + // prevent moving focus out of the text field
  2197 + event.preventDefault();
  2198 +
  2199 + // IE doesn't prevent moving focus even with event.preventDefault()
  2200 + // so we set a flag to know when we should ignore the blur event
  2201 + this.cancelBlur = true;
  2202 + this._delay(function() {
  2203 + delete this.cancelBlur;
  2204 + });
  2205 +
  2206 + // clicking on the scrollbar causes focus to shift to the body
  2207 + // but we can't detect a mouseup or a click immediately afterward
  2208 + // so we have to track the next mousedown and close the menu if
  2209 + // the user clicks somewhere outside of the autocomplete
  2210 + var menuElement = this.menu.element[ 0 ];
  2211 + if ( !$( event.target ).closest( ".ui-menu-item" ).length ) {
  2212 + this._delay(function() {
  2213 + var that = this;
  2214 + this.document.one( "mousedown", function( event ) {
  2215 + if ( event.target !== that.element[ 0 ] &&
  2216 + event.target !== menuElement &&
  2217 + !$.contains( menuElement, event.target ) ) {
  2218 + that.close();
  2219 + }
  2220 + });
  2221 + });
  2222 + }
  2223 + },
  2224 + menufocus: function( event, ui ) {
  2225 + var label, item;
  2226 + // support: Firefox
  2227 + // Prevent accidental activation of menu items in Firefox (#7024 #9118)
  2228 + if ( this.isNewMenu ) {
  2229 + this.isNewMenu = false;
  2230 + if ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) {
  2231 + this.menu.blur();
  2232 +
  2233 + this.document.one( "mousemove", function() {
  2234 + $( event.target ).trigger( event.originalEvent );
  2235 + });
  2236 +
  2237 + return;
  2238 + }
  2239 + }
  2240 +
  2241 + item = ui.item.data( "ui-autocomplete-item" );
  2242 + if ( false !== this._trigger( "focus", event, { item: item } ) ) {
  2243 + // use value to match what will end up in the input, if it was a key event
  2244 + if ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) {
  2245 + this._value( item.value );
  2246 + }
  2247 + }
  2248 +
  2249 + // Announce the value in the liveRegion
  2250 + label = ui.item.attr( "aria-label" ) || item.value;
  2251 + if ( label && $.trim( label ).length ) {
  2252 + this.liveRegion.children().hide();
  2253 + $( "<div>" ).text( label ).appendTo( this.liveRegion );
  2254 + }
  2255 + },
  2256 + menuselect: function( event, ui ) {
  2257 + var item = ui.item.data( "ui-autocomplete-item" ),
  2258 + previous = this.previous;
  2259 +
  2260 + // only trigger when focus was lost (click on menu)
  2261 + if ( this.element[ 0 ] !== this.document[ 0 ].activeElement ) {
  2262 + this.element.focus();
  2263 + this.previous = previous;
  2264 + // #6109 - IE triggers two focus events and the second
  2265 + // is asynchronous, so we need to reset the previous
  2266 + // term synchronously and asynchronously :-(
  2267 + this._delay(function() {
  2268 + this.previous = previous;
  2269 + this.selectedItem = item;
  2270 + });
  2271 + }
  2272 +
  2273 + if ( false !== this._trigger( "select", event, { item: item } ) ) {
  2274 + this._value( item.value );
  2275 + }
  2276 + // reset the term after the select event
  2277 + // this allows custom select handling to work properly
  2278 + this.term = this._value();
  2279 +
  2280 + this.close( event );
  2281 + this.selectedItem = item;
  2282 + }
  2283 + });
  2284 +
  2285 + this.liveRegion = $( "<span>", {
  2286 + role: "status",
  2287 + "aria-live": "assertive",
  2288 + "aria-relevant": "additions"
  2289 + })
  2290 + .addClass( "ui-helper-hidden-accessible" )
  2291 + .appendTo( this.document[ 0 ].body );
  2292 +
  2293 + // turning off autocomplete prevents the browser from remembering the
  2294 + // value when navigating through history, so we re-enable autocomplete
  2295 + // if the page is unloaded before the widget is destroyed. #7790
  2296 + this._on( this.window, {
  2297 + beforeunload: function() {
  2298 + this.element.removeAttr( "autocomplete" );
  2299 + }
  2300 + });
  2301 + },
  2302 +
  2303 + _destroy: function() {
  2304 + clearTimeout( this.searching );
  2305 + this.element
  2306 + .removeClass( "ui-autocomplete-input" )
  2307 + .removeAttr( "autocomplete" );
  2308 + this.menu.element.remove();
  2309 + this.liveRegion.remove();
  2310 + },
  2311 +
  2312 + _setOption: function( key, value ) {
  2313 + this._super( key, value );
  2314 + if ( key === "source" ) {
  2315 + this._initSource();
  2316 + }
  2317 + if ( key === "appendTo" ) {
  2318 + this.menu.element.appendTo( this._appendTo() );
  2319 + }
  2320 + if ( key === "disabled" && value && this.xhr ) {
  2321 + this.xhr.abort();
  2322 + }
  2323 + },
  2324 +
  2325 + _appendTo: function() {
  2326 + var element = this.options.appendTo;
  2327 +
  2328 + if ( element ) {
  2329 + element = element.jquery || element.nodeType ?
  2330 + $( element ) :
  2331 + this.document.find( element ).eq( 0 );
  2332 + }
  2333 +
  2334 + if ( !element || !element[ 0 ] ) {
  2335 + element = this.element.closest( ".ui-front" );
  2336 + }
  2337 +
  2338 + if ( !element.length ) {
  2339 + element = this.document[ 0 ].body;
  2340 + }
  2341 +
  2342 + return element;
  2343 + },
  2344 +
  2345 + _initSource: function() {
  2346 + var array, url,
  2347 + that = this;
  2348 + if ( $.isArray( this.options.source ) ) {
  2349 + array = this.options.source;
  2350 + this.source = function( request, response ) {
  2351 + response( $.ui.autocomplete.filter( array, request.term ) );
  2352 + };
  2353 + } else if ( typeof this.options.source === "string" ) {
  2354 + url = this.options.source;
  2355 + this.source = function( request, response ) {
  2356 + if ( that.xhr ) {
  2357 + that.xhr.abort();
  2358 + }
  2359 + that.xhr = $.ajax({
  2360 + url: url,
  2361 + data: request,
  2362 + dataType: "json",
  2363 + success: function( data ) {
  2364 + response( data );
  2365 + },
  2366 + error: function() {
  2367 + response([]);
  2368 + }
  2369 + });
  2370 + };
  2371 + } else {
  2372 + this.source = this.options.source;
  2373 + }
  2374 + },
  2375 +
  2376 + _searchTimeout: function( event ) {
  2377 + clearTimeout( this.searching );
  2378 + this.searching = this._delay(function() {
  2379 +
  2380 + // Search if the value has changed, or if the user retypes the same value (see #7434)
  2381 + var equalValues = this.term === this._value(),
  2382 + menuVisible = this.menu.element.is( ":visible" ),
  2383 + modifierKey = event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
  2384 +
  2385 + if ( !equalValues || ( equalValues && !menuVisible && !modifierKey ) ) {
  2386 + this.selectedItem = null;
  2387 + this.search( null, event );
  2388 + }
  2389 + }, this.options.delay );
  2390 + },
  2391 +
  2392 + search: function( value, event ) {
  2393 + value = value != null ? value : this._value();
  2394 +
  2395 + // always save the actual value, not the one passed as an argument
  2396 + this.term = this._value();
  2397 +
  2398 + if ( value.length < this.options.minLength ) {
  2399 + return this.close( event );
  2400 + }
  2401 +
  2402 + if ( this._trigger( "search", event ) === false ) {
  2403 + return;
  2404 + }
  2405 +
  2406 + return this._search( value );
  2407 + },
  2408 +
  2409 + _search: function( value ) {
  2410 + this.pending++;
  2411 + this.element.addClass( "ui-autocomplete-loading" );
  2412 + this.cancelSearch = false;
  2413 +
  2414 + this.source( { term: value }, this._response() );
  2415 + },
  2416 +
  2417 + _response: function() {
  2418 + var index = ++this.requestIndex;
  2419 +
  2420 + return $.proxy(function( content ) {
  2421 + if ( index === this.requestIndex ) {
  2422 + this.__response( content );
  2423 + }
  2424 +
  2425 + this.pending--;
  2426 + if ( !this.pending ) {
  2427 + this.element.removeClass( "ui-autocomplete-loading" );
  2428 + }
  2429 + }, this );
  2430 + },
  2431 +
  2432 + __response: function( content ) {
  2433 + if ( content ) {
  2434 + content = this._normalize( content );
  2435 + }
  2436 + this._trigger( "response", null, { content: content } );
  2437 + if ( !this.options.disabled && content && content.length && !this.cancelSearch ) {
  2438 + this._suggest( content );
  2439 + this._trigger( "open" );
  2440 + } else {
  2441 + // use ._close() instead of .close() so we don't cancel future searches
  2442 + this._close();
  2443 + }
  2444 + },
  2445 +
  2446 + close: function( event ) {
  2447 + this.cancelSearch = true;
  2448 + this._close( event );
  2449 + },
  2450 +
  2451 + _close: function( event ) {
  2452 + if ( this.menu.element.is( ":visible" ) ) {
  2453 + this.menu.element.hide();
  2454 + this.menu.blur();
  2455 + this.isNewMenu = true;
  2456 + this._trigger( "close", event );
  2457 + }
  2458 + },
  2459 +
  2460 + _change: function( event ) {
  2461 + if ( this.previous !== this._value() ) {
  2462 + this._trigger( "change", event, { item: this.selectedItem } );
  2463 + }
  2464 + },
  2465 +
  2466 + _normalize: function( items ) {
  2467 + // assume all items have the right format when the first item is complete
  2468 + if ( items.length && items[ 0 ].label && items[ 0 ].value ) {
  2469 + return items;
  2470 + }
  2471 + return $.map( items, function( item ) {
  2472 + if ( typeof item === "string" ) {
  2473 + return {
  2474 + label: item,
  2475 + value: item
  2476 + };
  2477 + }
  2478 + return $.extend( {}, item, {
  2479 + label: item.label || item.value,
  2480 + value: item.value || item.label
  2481 + });
  2482 + });
  2483 + },
  2484 +
  2485 + _suggest: function( items ) {
  2486 + var ul = this.menu.element.empty();
  2487 + this._renderMenu( ul, items );
  2488 + this.isNewMenu = true;
  2489 + this.menu.refresh();
  2490 +
  2491 + // size and position menu
  2492 + ul.show();
  2493 + this._resizeMenu();
  2494 + ul.position( $.extend({
  2495 + of: this.element
  2496 + }, this.options.position ) );
  2497 +
  2498 + if ( this.options.autoFocus ) {
  2499 + this.menu.next();
  2500 + }
  2501 + },
  2502 +
  2503 + _resizeMenu: function() {
  2504 + var ul = this.menu.element;
  2505 + ul.outerWidth( Math.max(
  2506 + // Firefox wraps long text (possibly a rounding bug)
  2507 + // so we add 1px to avoid the wrapping (#7513)
  2508 + ul.width( "" ).outerWidth() + 1,
  2509 + this.element.outerWidth()
  2510 + ) );
  2511 + },
  2512 +
  2513 + _renderMenu: function( ul, items ) {
  2514 + var that = this;
  2515 + $.each( items, function( index, item ) {
  2516 + that._renderItemData( ul, item );
  2517 + });
  2518 + },
  2519 +
  2520 + _renderItemData: function( ul, item ) {
  2521 + return this._renderItem( ul, item ).data( "ui-autocomplete-item", item );
  2522 + },
  2523 +
  2524 + _renderItem: function( ul, item ) {
  2525 + return $( "<li>" ).text( item.label ).appendTo( ul );
  2526 + },
  2527 +
  2528 + _move: function( direction, event ) {
  2529 + if ( !this.menu.element.is( ":visible" ) ) {
  2530 + this.search( null, event );
  2531 + return;
  2532 + }
  2533 + if ( this.menu.isFirstItem() && /^previous/.test( direction ) ||
  2534 + this.menu.isLastItem() && /^next/.test( direction ) ) {
  2535 +
  2536 + if ( !this.isMultiLine ) {
  2537 + this._value( this.term );
  2538 + }
  2539 +
  2540 + this.menu.blur();
  2541 + return;
  2542 + }
  2543 + this.menu[ direction ]( event );
  2544 + },
  2545 +
  2546 + widget: function() {
  2547 + return this.menu.element;
  2548 + },
  2549 +
  2550 + _value: function() {
  2551 + return this.valueMethod.apply( this.element, arguments );
  2552 + },
  2553 +
  2554 + _keyEvent: function( keyEvent, event ) {
  2555 + if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
  2556 + this._move( keyEvent, event );
  2557 +
  2558 + // prevents moving cursor to beginning/end of the text field in some browsers
  2559 + event.preventDefault();
  2560 + }
  2561 + }
  2562 +});
  2563 +
  2564 +$.extend( $.ui.autocomplete, {
  2565 + escapeRegex: function( value ) {
  2566 + return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
  2567 + },
  2568 + filter: function( array, term ) {
  2569 + var matcher = new RegExp( $.ui.autocomplete.escapeRegex( term ), "i" );
  2570 + return $.grep( array, function( value ) {
  2571 + return matcher.test( value.label || value.value || value );
  2572 + });
  2573 + }
  2574 +});
  2575 +
  2576 +// live region extension, adding a `messages` option
  2577 +// NOTE: This is an experimental API. We are still investigating
  2578 +// a full solution for string manipulation and internationalization.
  2579 +$.widget( "ui.autocomplete", $.ui.autocomplete, {
  2580 + options: {
  2581 + messages: {
  2582 + noResults: "No search results.",
  2583 + results: function( amount ) {
  2584 + return amount + ( amount > 1 ? " results are" : " result is" ) +
  2585 + " available, use up and down arrow keys to navigate.";
  2586 + }
  2587 + }
  2588 + },
  2589 +
  2590 + __response: function( content ) {
  2591 + var message;
  2592 + this._superApply( arguments );
  2593 + if ( this.options.disabled || this.cancelSearch ) {
  2594 + return;
  2595 + }
  2596 + if ( content && content.length ) {
  2597 + message = this.options.messages.results( content.length );
  2598 + } else {
  2599 + message = this.options.messages.noResults;
  2600 + }
  2601 + this.liveRegion.children().hide();
  2602 + $( "<div>" ).text( message ).appendTo( this.liveRegion );
  2603 + }
  2604 +});
  2605 +
  2606 +var autocomplete = $.ui.autocomplete;
  2607 +
  2608 +
  2609 +/*!
  2610 + * jQuery UI Effects 1.11.4
  2611 + * http://jqueryui.com
  2612 + *
  2613 + * Copyright jQuery Foundation and other contributors
  2614 + * Released under the MIT license.
  2615 + * http://jquery.org/license
  2616 + *
  2617 + * http://api.jqueryui.com/category/effects-core/
  2618 + */
  2619 +
  2620 +
  2621 +var dataSpace = "ui-effects-",
  2622 +
  2623 + // Create a local jQuery because jQuery Color relies on it and the
  2624 + // global may not exist with AMD and a custom build (#10199)
  2625 + jQuery = $;
  2626 +
  2627 +$.effects = {
  2628 + effect: {}
  2629 +};
  2630 +
  2631 +/*!
  2632 + * jQuery Color Animations v2.1.2
  2633 + * https://github.com/jquery/jquery-color
  2634 + *
  2635 + * Copyright 2014 jQuery Foundation and other contributors
  2636 + * Released under the MIT license.
  2637 + * http://jquery.org/license
  2638 + *
  2639 + * Date: Wed Jan 16 08:47:09 2013 -0600
  2640 + */
  2641 +(function( jQuery, undefined ) {
  2642 +
  2643 + var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",
  2644 +
  2645 + // plusequals test for += 100 -= 100
  2646 + rplusequals = /^([\-+])=\s*(\d+\.?\d*)/,
  2647 + // a set of RE's that can match strings and generate color tuples.
  2648 + stringParsers = [ {
  2649 + re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
  2650 + parse: function( execResult ) {
  2651 + return [
  2652 + execResult[ 1 ],
  2653 + execResult[ 2 ],
  2654 + execResult[ 3 ],
  2655 + execResult[ 4 ]
  2656 + ];
  2657 + }
  2658 + }, {
  2659 + re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
  2660 + parse: function( execResult ) {
  2661 + return [
  2662 + execResult[ 1 ] * 2.55,
  2663 + execResult[ 2 ] * 2.55,
  2664 + execResult[ 3 ] * 2.55,
  2665 + execResult[ 4 ]
  2666 + ];
  2667 + }
  2668 + }, {
  2669 + // this regex ignores A-F because it's compared against an already lowercased string
  2670 + re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,
  2671 + parse: function( execResult ) {
  2672 + return [
  2673 + parseInt( execResult[ 1 ], 16 ),
  2674 + parseInt( execResult[ 2 ], 16 ),
  2675 + parseInt( execResult[ 3 ], 16 )
  2676 + ];
  2677 + }
  2678 + }, {
  2679 + // this regex ignores A-F because it's compared against an already lowercased string
  2680 + re: /#([a-f0-9])([a-f0-9])([a-f0-9])/,
  2681 + parse: function( execResult ) {
  2682 + return [
  2683 + parseInt( execResult[ 1 ] + execResult[ 1 ], 16 ),
  2684 + parseInt( execResult[ 2 ] + execResult[ 2 ], 16 ),
  2685 + parseInt( execResult[ 3 ] + execResult[ 3 ], 16 )
  2686 + ];
  2687 + }
  2688 + }, {
  2689 + re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
  2690 + space: "hsla",
  2691 + parse: function( execResult ) {
  2692 + return [
  2693 + execResult[ 1 ],
  2694 + execResult[ 2 ] / 100,
  2695 + execResult[ 3 ] / 100,
  2696 + execResult[ 4 ]
  2697 + ];
  2698 + }
  2699 + } ],
  2700 +
  2701 + // jQuery.Color( )
  2702 + color = jQuery.Color = function( color, green, blue, alpha ) {
  2703 + return new jQuery.Color.fn.parse( color, green, blue, alpha );
  2704 + },
  2705 + spaces = {
  2706 + rgba: {
  2707 + props: {
  2708 + red: {
  2709 + idx: 0,
  2710 + type: "byte"
  2711 + },
  2712 + green: {
  2713 + idx: 1,
  2714 + type: "byte"
  2715 + },
  2716 + blue: {
  2717 + idx: 2,
  2718 + type: "byte"
  2719 + }
  2720 + }
  2721 + },
  2722 +
  2723 + hsla: {
  2724 + props: {
  2725 + hue: {
  2726 + idx: 0,
  2727 + type: "degrees"
  2728 + },
  2729 + saturation: {
  2730 + idx: 1,
  2731 + type: "percent"
  2732 + },
  2733 + lightness: {
  2734 + idx: 2,
  2735 + type: "percent"
  2736 + }
  2737 + }
  2738 + }
  2739 + },
  2740 + propTypes = {
  2741 + "byte": {
  2742 + floor: true,
  2743 + max: 255
  2744 + },
  2745 + "percent": {
  2746 + max: 1
  2747 + },
  2748 + "degrees": {
  2749 + mod: 360,
  2750 + floor: true
  2751 + }
  2752 + },
  2753 + support = color.support = {},
  2754 +
  2755 + // element for support tests
  2756 + supportElem = jQuery( "<p>" )[ 0 ],
  2757 +
  2758 + // colors = jQuery.Color.names
  2759 + colors,
  2760 +
  2761 + // local aliases of functions called often
  2762 + each = jQuery.each;
  2763 +
  2764 +// determine rgba support immediately
  2765 +supportElem.style.cssText = "background-color:rgba(1,1,1,.5)";
  2766 +support.rgba = supportElem.style.backgroundColor.indexOf( "rgba" ) > -1;
  2767 +
  2768 +// define cache name and alpha properties
  2769 +// for rgba and hsla spaces
  2770 +each( spaces, function( spaceName, space ) {
  2771 + space.cache = "_" + spaceName;
  2772 + space.props.alpha = {
  2773 + idx: 3,
  2774 + type: "percent",
  2775 + def: 1
  2776 + };
  2777 +});
  2778 +
  2779 +function clamp( value, prop, allowEmpty ) {
  2780 + var type = propTypes[ prop.type ] || {};
  2781 +
  2782 + if ( value == null ) {
  2783 + return (allowEmpty || !prop.def) ? null : prop.def;
  2784 + }
  2785 +
  2786 + // ~~ is an short way of doing floor for positive numbers
  2787 + value = type.floor ? ~~value : parseFloat( value );
  2788 +
  2789 + // IE will pass in empty strings as value for alpha,
  2790 + // which will hit this case
  2791 + if ( isNaN( value ) ) {
  2792 + return prop.def;
  2793 + }
  2794 +
  2795 + if ( type.mod ) {
  2796 + // we add mod before modding to make sure that negatives values
  2797 + // get converted properly: -10 -> 350
  2798 + return (value + type.mod) % type.mod;
  2799 + }
  2800 +
  2801 + // for now all property types without mod have min and max
  2802 + return 0 > value ? 0 : type.max < value ? type.max : value;
  2803 +}
  2804 +
  2805 +function stringParse( string ) {
  2806 + var inst = color(),
  2807 + rgba = inst._rgba = [];
  2808 +
  2809 + string = string.toLowerCase();
  2810 +
  2811 + each( stringParsers, function( i, parser ) {
  2812 + var parsed,
  2813 + match = parser.re.exec( string ),
  2814 + values = match && parser.parse( match ),
  2815 + spaceName = parser.space || "rgba";
  2816 +
  2817 + if ( values ) {
  2818 + parsed = inst[ spaceName ]( values );
  2819 +
  2820 + // if this was an rgba parse the assignment might happen twice
  2821 + // oh well....
  2822 + inst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ];
  2823 + rgba = inst._rgba = parsed._rgba;
  2824 +
  2825 + // exit each( stringParsers ) here because we matched
  2826 + return false;
  2827 + }
  2828 + });
  2829 +
  2830 + // Found a stringParser that handled it
  2831 + if ( rgba.length ) {
  2832 +
  2833 + // if this came from a parsed string, force "transparent" when alpha is 0
  2834 + // chrome, (and maybe others) return "transparent" as rgba(0,0,0,0)
  2835 + if ( rgba.join() === "0,0,0,0" ) {
  2836 + jQuery.extend( rgba, colors.transparent );
  2837 + }
  2838 + return inst;
  2839 + }
  2840 +
  2841 + // named colors
  2842 + return colors[ string ];
  2843 +}
  2844 +
  2845 +color.fn = jQuery.extend( color.prototype, {
  2846 + parse: function( red, green, blue, alpha ) {
  2847 + if ( red === undefined ) {
  2848 + this._rgba = [ null, null, null, null ];
  2849 + return this;
  2850 + }
  2851 + if ( red.jquery || red.nodeType ) {
  2852 + red = jQuery( red ).css( green );
  2853 + green = undefined;
  2854 + }
  2855 +
  2856 + var inst = this,
  2857 + type = jQuery.type( red ),
  2858 + rgba = this._rgba = [];
  2859 +
  2860 + // more than 1 argument specified - assume ( red, green, blue, alpha )
  2861 + if ( green !== undefined ) {
  2862 + red = [ red, green, blue, alpha ];
  2863 + type = "array";
  2864 + }
  2865 +
  2866 + if ( type === "string" ) {
  2867 + return this.parse( stringParse( red ) || colors._default );
  2868 + }
  2869 +
  2870 + if ( type === "array" ) {
  2871 + each( spaces.rgba.props, function( key, prop ) {
  2872 + rgba[ prop.idx ] = clamp( red[ prop.idx ], prop );
  2873 + });
  2874 + return this;
  2875 + }
  2876 +
  2877 + if ( type === "object" ) {
  2878 + if ( red instanceof color ) {
  2879 + each( spaces, function( spaceName, space ) {
  2880 + if ( red[ space.cache ] ) {
  2881 + inst[ space.cache ] = red[ space.cache ].slice();
  2882 + }
  2883 + });
  2884 + } else {
  2885 + each( spaces, function( spaceName, space ) {
  2886 + var cache = space.cache;
  2887 + each( space.props, function( key, prop ) {
  2888 +
  2889 + // if the cache doesn't exist, and we know how to convert
  2890 + if ( !inst[ cache ] && space.to ) {
  2891 +
  2892 + // if the value was null, we don't need to copy it
  2893 + // if the key was alpha, we don't need to copy it either
  2894 + if ( key === "alpha" || red[ key ] == null ) {
  2895 + return;
  2896 + }
  2897 + inst[ cache ] = space.to( inst._rgba );
  2898 + }
  2899 +
  2900 + // this is the only case where we allow nulls for ALL properties.
  2901 + // call clamp with alwaysAllowEmpty
  2902 + inst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true );
  2903 + });
  2904 +
  2905 + // everything defined but alpha?
  2906 + if ( inst[ cache ] && jQuery.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) {
  2907 + // use the default of 1
  2908 + inst[ cache ][ 3 ] = 1;
  2909 + if ( space.from ) {
  2910 + inst._rgba = space.from( inst[ cache ] );
  2911 + }
  2912 + }
  2913 + });
  2914 + }
  2915 + return this;
  2916 + }
  2917 + },
  2918 + is: function( compare ) {
  2919 + var is = color( compare ),
  2920 + same = true,
  2921 + inst = this;
  2922 +
  2923 + each( spaces, function( _, space ) {
  2924 + var localCache,
  2925 + isCache = is[ space.cache ];
  2926 + if (isCache) {
  2927 + localCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || [];
  2928 + each( space.props, function( _, prop ) {
  2929 + if ( isCache[ prop.idx ] != null ) {
  2930 + same = ( isCache[ prop.idx ] === localCache[ prop.idx ] );
  2931 + return same;
  2932 + }
  2933 + });
  2934 + }
  2935 + return same;
  2936 + });
  2937 + return same;
  2938 + },
  2939 + _space: function() {
  2940 + var used = [],
  2941 + inst = this;
  2942 + each( spaces, function( spaceName, space ) {
  2943 + if ( inst[ space.cache ] ) {
  2944 + used.push( spaceName );
  2945 + }
  2946 + });
  2947 + return used.pop();
  2948 + },
  2949 + transition: function( other, distance ) {
  2950 + var end = color( other ),
  2951 + spaceName = end._space(),
  2952 + space = spaces[ spaceName ],
  2953 + startColor = this.alpha() === 0 ? color( "transparent" ) : this,
  2954 + start = startColor[ space.cache ] || space.to( startColor._rgba ),
  2955 + result = start.slice();
  2956 +
  2957 + end = end[ space.cache ];
  2958 + each( space.props, function( key, prop ) {
  2959 + var index = prop.idx,
  2960 + startValue = start[ index ],
  2961 + endValue = end[ index ],
  2962 + type = propTypes[ prop.type ] || {};
  2963 +
  2964 + // if null, don't override start value
  2965 + if ( endValue === null ) {
  2966 + return;
  2967 + }
  2968 + // if null - use end
  2969 + if ( startValue === null ) {
  2970 + result[ index ] = endValue;
  2971 + } else {
  2972 + if ( type.mod ) {
  2973 + if ( endValue - startValue > type.mod / 2 ) {
  2974 + startValue += type.mod;
  2975 + } else if ( startValue - endValue > type.mod / 2 ) {
  2976 + startValue -= type.mod;
  2977 + }
  2978 + }
  2979 + result[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop );
  2980 + }
  2981 + });
  2982 + return this[ spaceName ]( result );
  2983 + },
  2984 + blend: function( opaque ) {
  2985 + // if we are already opaque - return ourself
  2986 + if ( this._rgba[ 3 ] === 1 ) {
  2987 + return this;
  2988 + }
  2989 +
  2990 + var rgb = this._rgba.slice(),
  2991 + a = rgb.pop(),
  2992 + blend = color( opaque )._rgba;
  2993 +
  2994 + return color( jQuery.map( rgb, function( v, i ) {
  2995 + return ( 1 - a ) * blend[ i ] + a * v;
  2996 + }));
  2997 + },
  2998 + toRgbaString: function() {
  2999 + var prefix = "rgba(",
  3000 + rgba = jQuery.map( this._rgba, function( v, i ) {
  3001 + return v == null ? ( i > 2 ? 1 : 0 ) : v;
  3002 + });
  3003 +
  3004 + if ( rgba[ 3 ] === 1 ) {
  3005 + rgba.pop();
  3006 + prefix = "rgb(";
  3007 + }
  3008 +
  3009 + return prefix + rgba.join() + ")";
  3010 + },
  3011 + toHslaString: function() {
  3012 + var prefix = "hsla(",
  3013 + hsla = jQuery.map( this.hsla(), function( v, i ) {
  3014 + if ( v == null ) {
  3015 + v = i > 2 ? 1 : 0;
  3016 + }
  3017 +
  3018 + // catch 1 and 2
  3019 + if ( i && i < 3 ) {
  3020 + v = Math.round( v * 100 ) + "%";
  3021 + }
  3022 + return v;
  3023 + });
  3024 +
  3025 + if ( hsla[ 3 ] === 1 ) {
  3026 + hsla.pop();
  3027 + prefix = "hsl(";
  3028 + }
  3029 + return prefix + hsla.join() + ")";
  3030 + },
  3031 + toHexString: function( includeAlpha ) {
  3032 + var rgba = this._rgba.slice(),
  3033 + alpha = rgba.pop();
  3034 +
  3035 + if ( includeAlpha ) {
  3036 + rgba.push( ~~( alpha * 255 ) );
  3037 + }
  3038 +
  3039 + return "#" + jQuery.map( rgba, function( v ) {
  3040 +
  3041 + // default to 0 when nulls exist
  3042 + v = ( v || 0 ).toString( 16 );
  3043 + return v.length === 1 ? "0" + v : v;
  3044 + }).join("");
  3045 + },
  3046 + toString: function() {
  3047 + return this._rgba[ 3 ] === 0 ? "transparent" : this.toRgbaString();
  3048 + }
  3049 +});
  3050 +color.fn.parse.prototype = color.fn;
  3051 +
  3052 +// hsla conversions adapted from:
  3053 +// https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021
  3054 +
  3055 +function hue2rgb( p, q, h ) {
  3056 + h = ( h + 1 ) % 1;
  3057 + if ( h * 6 < 1 ) {
  3058 + return p + ( q - p ) * h * 6;
  3059 + }
  3060 + if ( h * 2 < 1) {
  3061 + return q;
  3062 + }
  3063 + if ( h * 3 < 2 ) {
  3064 + return p + ( q - p ) * ( ( 2 / 3 ) - h ) * 6;
  3065 + }
  3066 + return p;
  3067 +}
  3068 +
  3069 +spaces.hsla.to = function( rgba ) {
  3070 + if ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) {
  3071 + return [ null, null, null, rgba[ 3 ] ];
  3072 + }
  3073 + var r = rgba[ 0 ] / 255,
  3074 + g = rgba[ 1 ] / 255,
  3075 + b = rgba[ 2 ] / 255,
  3076 + a = rgba[ 3 ],
  3077 + max = Math.max( r, g, b ),
  3078 + min = Math.min( r, g, b ),
  3079 + diff = max - min,
  3080 + add = max + min,
  3081 + l = add * 0.5,
  3082 + h, s;
  3083 +
  3084 + if ( min === max ) {
  3085 + h = 0;
  3086 + } else if ( r === max ) {
  3087 + h = ( 60 * ( g - b ) / diff ) + 360;
  3088 + } else if ( g === max ) {
  3089 + h = ( 60 * ( b - r ) / diff ) + 120;
  3090 + } else {
  3091 + h = ( 60 * ( r - g ) / diff ) + 240;
  3092 + }
  3093 +
  3094 + // chroma (diff) == 0 means greyscale which, by definition, saturation = 0%
  3095 + // otherwise, saturation is based on the ratio of chroma (diff) to lightness (add)
  3096 + if ( diff === 0 ) {
  3097 + s = 0;
  3098 + } else if ( l <= 0.5 ) {
  3099 + s = diff / add;
  3100 + } else {
  3101 + s = diff / ( 2 - add );
  3102 + }
  3103 + return [ Math.round(h) % 360, s, l, a == null ? 1 : a ];
  3104 +};
  3105 +
  3106 +spaces.hsla.from = function( hsla ) {
  3107 + if ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) {
  3108 + return [ null, null, null, hsla[ 3 ] ];
  3109 + }
  3110 + var h = hsla[ 0 ] / 360,
  3111 + s = hsla[ 1 ],
  3112 + l = hsla[ 2 ],
  3113 + a = hsla[ 3 ],
  3114 + q = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s,
  3115 + p = 2 * l - q;
  3116 +
  3117 + return [
  3118 + Math.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ),
  3119 + Math.round( hue2rgb( p, q, h ) * 255 ),
  3120 + Math.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ),
  3121 + a
  3122 + ];
  3123 +};
  3124 +
  3125 +each( spaces, function( spaceName, space ) {
  3126 + var props = space.props,
  3127 + cache = space.cache,
  3128 + to = space.to,
  3129 + from = space.from;
  3130 +
  3131 + // makes rgba() and hsla()
  3132 + color.fn[ spaceName ] = function( value ) {
  3133 +
  3134 + // generate a cache for this space if it doesn't exist
  3135 + if ( to && !this[ cache ] ) {
  3136 + this[ cache ] = to( this._rgba );
  3137 + }
  3138 + if ( value === undefined ) {
  3139 + return this[ cache ].slice();
  3140 + }
  3141 +
  3142 + var ret,
  3143 + type = jQuery.type( value ),
  3144 + arr = ( type === "array" || type === "object" ) ? value : arguments,
  3145 + local = this[ cache ].slice();
  3146 +
  3147 + each( props, function( key, prop ) {
  3148 + var val = arr[ type === "object" ? key : prop.idx ];
  3149 + if ( val == null ) {
  3150 + val = local[ prop.idx ];
  3151 + }
  3152 + local[ prop.idx ] = clamp( val, prop );
  3153 + });
  3154 +
  3155 + if ( from ) {
  3156 + ret = color( from( local ) );
  3157 + ret[ cache ] = local;
  3158 + return ret;
  3159 + } else {
  3160 + return color( local );
  3161 + }
  3162 + };
  3163 +
  3164 + // makes red() green() blue() alpha() hue() saturation() lightness()
  3165 + each( props, function( key, prop ) {
  3166 + // alpha is included in more than one space
  3167 + if ( color.fn[ key ] ) {
  3168 + return;
  3169 + }
  3170 + color.fn[ key ] = function( value ) {
  3171 + var vtype = jQuery.type( value ),
  3172 + fn = ( key === "alpha" ? ( this._hsla ? "hsla" : "rgba" ) : spaceName ),
  3173 + local = this[ fn ](),
  3174 + cur = local[ prop.idx ],
  3175 + match;
  3176 +
  3177 + if ( vtype === "undefined" ) {
  3178 + return cur;
  3179 + }
  3180 +
  3181 + if ( vtype === "function" ) {
  3182 + value = value.call( this, cur );
  3183 + vtype = jQuery.type( value );
  3184 + }
  3185 + if ( value == null && prop.empty ) {
  3186 + return this;
  3187 + }
  3188 + if ( vtype === "string" ) {
  3189 + match = rplusequals.exec( value );
  3190 + if ( match ) {
  3191 + value = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === "+" ? 1 : -1 );
  3192 + }
  3193 + }
  3194 + local[ prop.idx ] = value;
  3195 + return this[ fn ]( local );
  3196 + };
  3197 + });
  3198 +});
  3199 +
  3200 +// add cssHook and .fx.step function for each named hook.
  3201 +// accept a space separated string of properties
  3202 +color.hook = function( hook ) {
  3203 + var hooks = hook.split( " " );
  3204 + each( hooks, function( i, hook ) {
  3205 + jQuery.cssHooks[ hook ] = {
  3206 + set: function( elem, value ) {
  3207 + var parsed, curElem,
  3208 + backgroundColor = "";
  3209 +
  3210 + if ( value !== "transparent" && ( jQuery.type( value ) !== "string" || ( parsed = stringParse( value ) ) ) ) {
  3211 + value = color( parsed || value );
  3212 + if ( !support.rgba && value._rgba[ 3 ] !== 1 ) {
  3213 + curElem = hook === "backgroundColor" ? elem.parentNode : elem;
  3214 + while (
  3215 + (backgroundColor === "" || backgroundColor === "transparent") &&
  3216 + curElem && curElem.style
  3217 + ) {
  3218 + try {
  3219 + backgroundColor = jQuery.css( curElem, "backgroundColor" );
  3220 + curElem = curElem.parentNode;
  3221 + } catch ( e ) {
  3222 + }
  3223 + }
  3224 +
  3225 + value = value.blend( backgroundColor && backgroundColor !== "transparent" ?
  3226 + backgroundColor :
  3227 + "_default" );
  3228 + }
  3229 +
  3230 + value = value.toRgbaString();
  3231 + }
  3232 + try {
  3233 + elem.style[ hook ] = value;
  3234 + } catch ( e ) {
  3235 + // wrapped to prevent IE from throwing errors on "invalid" values like 'auto' or 'inherit'
  3236 + }
  3237 + }
  3238 + };
  3239 + jQuery.fx.step[ hook ] = function( fx ) {
  3240 + if ( !fx.colorInit ) {
  3241 + fx.start = color( fx.elem, hook );
  3242 + fx.end = color( fx.end );
  3243 + fx.colorInit = true;
  3244 + }
  3245 + jQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) );
  3246 + };
  3247 + });
  3248 +
  3249 +};
  3250 +
  3251 +color.hook( stepHooks );
  3252 +
  3253 +jQuery.cssHooks.borderColor = {
  3254 + expand: function( value ) {
  3255 + var expanded = {};
  3256 +
  3257 + each( [ "Top", "Right", "Bottom", "Left" ], function( i, part ) {
  3258 + expanded[ "border" + part + "Color" ] = value;
  3259 + });
  3260 + return expanded;
  3261 + }
  3262 +};
  3263 +
  3264 +// Basic color names only.
  3265 +// Usage of any of the other color names requires adding yourself or including
  3266 +// jquery.color.svg-names.js.
  3267 +colors = jQuery.Color.names = {
  3268 + // 4.1. Basic color keywords
  3269 + aqua: "#00ffff",
  3270 + black: "#000000",
  3271 + blue: "#0000ff",
  3272 + fuchsia: "#ff00ff",
  3273 + gray: "#808080",
  3274 + green: "#008000",
  3275 + lime: "#00ff00",
  3276 + maroon: "#800000",
  3277 + navy: "#000080",
  3278 + olive: "#808000",
  3279 + purple: "#800080",
  3280 + red: "#ff0000",
  3281 + silver: "#c0c0c0",
  3282 + teal: "#008080",
  3283 + white: "#ffffff",
  3284 + yellow: "#ffff00",
  3285 +
  3286 + // 4.2.3. "transparent" color keyword
  3287 + transparent: [ null, null, null, 0 ],
  3288 +
  3289 + _default: "#ffffff"
  3290 +};
  3291 +
  3292 +})( jQuery );
  3293 +
  3294 +/******************************************************************************/
  3295 +/****************************** CLASS ANIMATIONS ******************************/
  3296 +/******************************************************************************/
  3297 +(function() {
  3298 +
  3299 +var classAnimationActions = [ "add", "remove", "toggle" ],
  3300 + shorthandStyles = {
  3301 + border: 1,
  3302 + borderBottom: 1,
  3303 + borderColor: 1,
  3304 + borderLeft: 1,
  3305 + borderRight: 1,
  3306 + borderTop: 1,
  3307 + borderWidth: 1,
  3308 + margin: 1,
  3309 + padding: 1
  3310 + };
  3311 +
  3312 +$.each([ "borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle" ], function( _, prop ) {
  3313 + $.fx.step[ prop ] = function( fx ) {
  3314 + if ( fx.end !== "none" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) {
  3315 + jQuery.style( fx.elem, prop, fx.end );
  3316 + fx.setAttr = true;
  3317 + }
  3318 + };
  3319 +});
  3320 +
  3321 +function getElementStyles( elem ) {
  3322 + var key, len,
  3323 + style = elem.ownerDocument.defaultView ?
  3324 + elem.ownerDocument.defaultView.getComputedStyle( elem, null ) :
  3325 + elem.currentStyle,
  3326 + styles = {};
  3327 +
  3328 + if ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) {
  3329 + len = style.length;
  3330 + while ( len-- ) {
  3331 + key = style[ len ];
  3332 + if ( typeof style[ key ] === "string" ) {
  3333 + styles[ $.camelCase( key ) ] = style[ key ];
  3334 + }
  3335 + }
  3336 + // support: Opera, IE <9
  3337 + } else {
  3338 + for ( key in style ) {
  3339 + if ( typeof style[ key ] === "string" ) {
  3340 + styles[ key ] = style[ key ];
  3341 + }
  3342 + }
  3343 + }
  3344 +
  3345 + return styles;
  3346 +}
  3347 +
  3348 +function styleDifference( oldStyle, newStyle ) {
  3349 + var diff = {},
  3350 + name, value;
  3351 +
  3352 + for ( name in newStyle ) {
  3353 + value = newStyle[ name ];
  3354 + if ( oldStyle[ name ] !== value ) {
  3355 + if ( !shorthandStyles[ name ] ) {
  3356 + if ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) {
  3357 + diff[ name ] = value;
  3358 + }
  3359 + }
  3360 + }
  3361 + }
  3362 +
  3363 + return diff;
  3364 +}
  3365 +
  3366 +// support: jQuery <1.8
  3367 +if ( !$.fn.addBack ) {
  3368 + $.fn.addBack = function( selector ) {
  3369 + return this.add( selector == null ?
  3370 + this.prevObject : this.prevObject.filter( selector )
  3371 + );
  3372 + };
  3373 +}
  3374 +
  3375 +$.effects.animateClass = function( value, duration, easing, callback ) {
  3376 + var o = $.speed( duration, easing, callback );
  3377 +
  3378 + return this.queue( function() {
  3379 + var animated = $( this ),
  3380 + baseClass = animated.attr( "class" ) || "",
  3381 + applyClassChange,
  3382 + allAnimations = o.children ? animated.find( "*" ).addBack() : animated;
  3383 +
  3384 + // map the animated objects to store the original styles.
  3385 + allAnimations = allAnimations.map(function() {
  3386 + var el = $( this );
  3387 + return {
  3388 + el: el,
  3389 + start: getElementStyles( this )
  3390 + };
  3391 + });
  3392 +
  3393 + // apply class change
  3394 + applyClassChange = function() {
  3395 + $.each( classAnimationActions, function(i, action) {
  3396 + if ( value[ action ] ) {
  3397 + animated[ action + "Class" ]( value[ action ] );
  3398 + }
  3399 + });
  3400 + };
  3401 + applyClassChange();
  3402 +
  3403 + // map all animated objects again - calculate new styles and diff
  3404 + allAnimations = allAnimations.map(function() {
  3405 + this.end = getElementStyles( this.el[ 0 ] );
  3406 + this.diff = styleDifference( this.start, this.end );
  3407 + return this;
  3408 + });
  3409 +
  3410 + // apply original class
  3411 + animated.attr( "class", baseClass );
  3412 +
  3413 + // map all animated objects again - this time collecting a promise
  3414 + allAnimations = allAnimations.map(function() {
  3415 + var styleInfo = this,
  3416 + dfd = $.Deferred(),
  3417 + opts = $.extend({}, o, {
  3418 + queue: false,
  3419 + complete: function() {
  3420 + dfd.resolve( styleInfo );
  3421 + }
  3422 + });
  3423 +
  3424 + this.el.animate( this.diff, opts );
  3425 + return dfd.promise();
  3426 + });
  3427 +
  3428 + // once all animations have completed:
  3429 + $.when.apply( $, allAnimations.get() ).done(function() {
  3430 +
  3431 + // set the final class
  3432 + applyClassChange();
  3433 +
  3434 + // for each animated element,
  3435 + // clear all css properties that were animated
  3436 + $.each( arguments, function() {
  3437 + var el = this.el;
  3438 + $.each( this.diff, function(key) {
  3439 + el.css( key, "" );
  3440 + });
  3441 + });
  3442 +
  3443 + // this is guarnteed to be there if you use jQuery.speed()
  3444 + // it also handles dequeuing the next anim...
  3445 + o.complete.call( animated[ 0 ] );
  3446 + });
  3447 + });
  3448 +};
  3449 +
  3450 +$.fn.extend({
  3451 + addClass: (function( orig ) {
  3452 + return function( classNames, speed, easing, callback ) {
  3453 + return speed ?
  3454 + $.effects.animateClass.call( this,
  3455 + { add: classNames }, speed, easing, callback ) :
  3456 + orig.apply( this, arguments );
  3457 + };
  3458 + })( $.fn.addClass ),
  3459 +
  3460 + removeClass: (function( orig ) {
  3461 + return function( classNames, speed, easing, callback ) {
  3462 + return arguments.length > 1 ?
  3463 + $.effects.animateClass.call( this,
  3464 + { remove: classNames }, speed, easing, callback ) :
  3465 + orig.apply( this, arguments );
  3466 + };
  3467 + })( $.fn.removeClass ),
  3468 +
  3469 + toggleClass: (function( orig ) {
  3470 + return function( classNames, force, speed, easing, callback ) {
  3471 + if ( typeof force === "boolean" || force === undefined ) {
  3472 + if ( !speed ) {
  3473 + // without speed parameter
  3474 + return orig.apply( this, arguments );
  3475 + } else {
  3476 + return $.effects.animateClass.call( this,
  3477 + (force ? { add: classNames } : { remove: classNames }),
  3478 + speed, easing, callback );
  3479 + }
  3480 + } else {
  3481 + // without force parameter
  3482 + return $.effects.animateClass.call( this,
  3483 + { toggle: classNames }, force, speed, easing );
  3484 + }
  3485 + };
  3486 + })( $.fn.toggleClass ),
  3487 +
  3488 + switchClass: function( remove, add, speed, easing, callback) {
  3489 + return $.effects.animateClass.call( this, {
  3490 + add: add,
  3491 + remove: remove
  3492 + }, speed, easing, callback );
  3493 + }
  3494 +});
  3495 +
  3496 +})();
  3497 +
  3498 +/******************************************************************************/
  3499 +/*********************************** EFFECTS **********************************/
  3500 +/******************************************************************************/
  3501 +
  3502 +(function() {
  3503 +
  3504 +$.extend( $.effects, {
  3505 + version: "1.11.4",
  3506 +
  3507 + // Saves a set of properties in a data storage
  3508 + save: function( element, set ) {
  3509 + for ( var i = 0; i < set.length; i++ ) {
  3510 + if ( set[ i ] !== null ) {
  3511 + element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );
  3512 + }
  3513 + }
  3514 + },
  3515 +
  3516 + // Restores a set of previously saved properties from a data storage
  3517 + restore: function( element, set ) {
  3518 + var val, i;
  3519 + for ( i = 0; i < set.length; i++ ) {
  3520 + if ( set[ i ] !== null ) {
  3521 + val = element.data( dataSpace + set[ i ] );
  3522 + // support: jQuery 1.6.2
  3523 + // http://bugs.jquery.com/ticket/9917
  3524 + // jQuery 1.6.2 incorrectly returns undefined for any falsy value.
  3525 + // We can't differentiate between "" and 0 here, so we just assume
  3526 + // empty string since it's likely to be a more common value...
  3527 + if ( val === undefined ) {
  3528 + val = "";
  3529 + }
  3530 + element.css( set[ i ], val );
  3531 + }
  3532 + }
  3533 + },
  3534 +
  3535 + setMode: function( el, mode ) {
  3536 + if (mode === "toggle") {
  3537 + mode = el.is( ":hidden" ) ? "show" : "hide";
  3538 + }
  3539 + return mode;
  3540 + },
  3541 +
  3542 + // Translates a [top,left] array into a baseline value
  3543 + // this should be a little more flexible in the future to handle a string & hash
  3544 + getBaseline: function( origin, original ) {
  3545 + var y, x;
  3546 + switch ( origin[ 0 ] ) {
  3547 + case "top": y = 0; break;
  3548 + case "middle": y = 0.5; break;
  3549 + case "bottom": y = 1; break;
  3550 + default: y = origin[ 0 ] / original.height;
  3551 + }
  3552 + switch ( origin[ 1 ] ) {
  3553 + case "left": x = 0; break;
  3554 + case "center": x = 0.5; break;
  3555 + case "right": x = 1; break;
  3556 + default: x = origin[ 1 ] / original.width;
  3557 + }
  3558 + return {
  3559 + x: x,
  3560 + y: y
  3561 + };
  3562 + },
  3563 +
  3564 + // Wraps the element around a wrapper that copies position properties
  3565 + createWrapper: function( element ) {
  3566 +
  3567 + // if the element is already wrapped, return it
  3568 + if ( element.parent().is( ".ui-effects-wrapper" )) {
  3569 + return element.parent();
  3570 + }
  3571 +
  3572 + // wrap the element
  3573 + var props = {
  3574 + width: element.outerWidth(true),
  3575 + height: element.outerHeight(true),
  3576 + "float": element.css( "float" )
  3577 + },
  3578 + wrapper = $( "<div></div>" )
  3579 + .addClass( "ui-effects-wrapper" )
  3580 + .css({
  3581 + fontSize: "100%",
  3582 + background: "transparent",
  3583 + border: "none",
  3584 + margin: 0,
  3585 + padding: 0
  3586 + }),
  3587 + // Store the size in case width/height are defined in % - Fixes #5245
  3588 + size = {
  3589 + width: element.width(),
  3590 + height: element.height()
  3591 + },
  3592 + active = document.activeElement;
  3593 +
  3594 + // support: Firefox
  3595 + // Firefox incorrectly exposes anonymous content
  3596 + // https://bugzilla.mozilla.org/show_bug.cgi?id=561664
  3597 + try {
  3598 + active.id;
  3599 + } catch ( e ) {
  3600 + active = document.body;
  3601 + }
  3602 +
  3603 + element.wrap( wrapper );
  3604 +
  3605 + // Fixes #7595 - Elements lose focus when wrapped.
  3606 + if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
  3607 + $( active ).focus();
  3608 + }
  3609 +
  3610 + wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually lose the reference to the wrapped element
  3611 +
  3612 + // transfer positioning properties to the wrapper
  3613 + if ( element.css( "position" ) === "static" ) {
  3614 + wrapper.css({ position: "relative" });
  3615 + element.css({ position: "relative" });
  3616 + } else {
  3617 + $.extend( props, {
  3618 + position: element.css( "position" ),
  3619 + zIndex: element.css( "z-index" )
  3620 + });
  3621 + $.each([ "top", "left", "bottom", "right" ], function(i, pos) {
  3622 + props[ pos ] = element.css( pos );
  3623 + if ( isNaN( parseInt( props[ pos ], 10 ) ) ) {
  3624 + props[ pos ] = "auto";
  3625 + }
  3626 + });
  3627 + element.css({
  3628 + position: "relative",
  3629 + top: 0,
  3630 + left: 0,
  3631 + right: "auto",
  3632 + bottom: "auto"
  3633 + });
  3634 + }
  3635 + element.css(size);
  3636 +
  3637 + return wrapper.css( props ).show();
  3638 + },
  3639 +
  3640 + removeWrapper: function( element ) {
  3641 + var active = document.activeElement;
  3642 +
  3643 + if ( element.parent().is( ".ui-effects-wrapper" ) ) {
  3644 + element.parent().replaceWith( element );
  3645 +
  3646 + // Fixes #7595 - Elements lose focus when wrapped.
  3647 + if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
  3648 + $( active ).focus();
  3649 + }
  3650 + }
  3651 +
  3652 + return element;
  3653 + },
  3654 +
  3655 + setTransition: function( element, list, factor, value ) {
  3656 + value = value || {};
  3657 + $.each( list, function( i, x ) {
  3658 + var unit = element.cssUnit( x );
  3659 + if ( unit[ 0 ] > 0 ) {
  3660 + value[ x ] = unit[ 0 ] * factor + unit[ 1 ];
  3661 + }
  3662 + });
  3663 + return value;
  3664 + }
  3665 +});
  3666 +
  3667 +// return an effect options object for the given parameters:
  3668 +function _normalizeArguments( effect, options, speed, callback ) {
  3669 +
  3670 + // allow passing all options as the first parameter
  3671 + if ( $.isPlainObject( effect ) ) {
  3672 + options = effect;
  3673 + effect = effect.effect;
  3674 + }
  3675 +
  3676 + // convert to an object
  3677 + effect = { effect: effect };
  3678 +
  3679 + // catch (effect, null, ...)
  3680 + if ( options == null ) {
  3681 + options = {};
  3682 + }
  3683 +
  3684 + // catch (effect, callback)
  3685 + if ( $.isFunction( options ) ) {
  3686 + callback = options;
  3687 + speed = null;
  3688 + options = {};
  3689 + }
  3690 +
  3691 + // catch (effect, speed, ?)
  3692 + if ( typeof options === "number" || $.fx.speeds[ options ] ) {
  3693 + callback = speed;
  3694 + speed = options;
  3695 + options = {};
  3696 + }
  3697 +
  3698 + // catch (effect, options, callback)
  3699 + if ( $.isFunction( speed ) ) {
  3700 + callback = speed;
  3701 + speed = null;
  3702 + }
  3703 +
  3704 + // add options to effect
  3705 + if ( options ) {
  3706 + $.extend( effect, options );
  3707 + }
  3708 +
  3709 + speed = speed || options.duration;
  3710 + effect.duration = $.fx.off ? 0 :
  3711 + typeof speed === "number" ? speed :
  3712 + speed in $.fx.speeds ? $.fx.speeds[ speed ] :
  3713 + $.fx.speeds._default;
  3714 +
  3715 + effect.complete = callback || options.complete;
  3716 +
  3717 + return effect;
  3718 +}
  3719 +
  3720 +function standardAnimationOption( option ) {
  3721 + // Valid standard speeds (nothing, number, named speed)
  3722 + if ( !option || typeof option === "number" || $.fx.speeds[ option ] ) {
  3723 + return true;
  3724 + }
  3725 +
  3726 + // Invalid strings - treat as "normal" speed
  3727 + if ( typeof option === "string" && !$.effects.effect[ option ] ) {
  3728 + return true;
  3729 + }
  3730 +
  3731 + // Complete callback
  3732 + if ( $.isFunction( option ) ) {
  3733 + return true;
  3734 + }
  3735 +
  3736 + // Options hash (but not naming an effect)
  3737 + if ( typeof option === "object" && !option.effect ) {
  3738 + return true;
  3739 + }
  3740 +
  3741 + // Didn't match any standard API
  3742 + return false;
  3743 +}
  3744 +
  3745 +$.fn.extend({
  3746 + effect: function( /* effect, options, speed, callback */ ) {
  3747 + var args = _normalizeArguments.apply( this, arguments ),
  3748 + mode = args.mode,
  3749 + queue = args.queue,
  3750 + effectMethod = $.effects.effect[ args.effect ];
  3751 +
  3752 + if ( $.fx.off || !effectMethod ) {
  3753 + // delegate to the original method (e.g., .show()) if possible
  3754 + if ( mode ) {
  3755 + return this[ mode ]( args.duration, args.complete );
  3756 + } else {
  3757 + return this.each( function() {
  3758 + if ( args.complete ) {
  3759 + args.complete.call( this );
  3760 + }
  3761 + });
  3762 + }
  3763 + }
  3764 +
  3765 + function run( next ) {
  3766 + var elem = $( this ),
  3767 + complete = args.complete,
  3768 + mode = args.mode;
  3769 +
  3770 + function done() {
  3771 + if ( $.isFunction( complete ) ) {
  3772 + complete.call( elem[0] );
  3773 + }
  3774 + if ( $.isFunction( next ) ) {
  3775 + next();
  3776 + }
  3777 + }
  3778 +
  3779 + // If the element already has the correct final state, delegate to
  3780 + // the core methods so the internal tracking of "olddisplay" works.
  3781 + if ( elem.is( ":hidden" ) ? mode === "hide" : mode === "show" ) {
  3782 + elem[ mode ]();
  3783 + done();
  3784 + } else {
  3785 + effectMethod.call( elem[0], args, done );
  3786 + }
  3787 + }
  3788 +
  3789 + return queue === false ? this.each( run ) : this.queue( queue || "fx", run );
  3790 + },
  3791 +
  3792 + show: (function( orig ) {
  3793 + return function( option ) {
  3794 + if ( standardAnimationOption( option ) ) {
  3795 + return orig.apply( this, arguments );
  3796 + } else {
  3797 + var args = _normalizeArguments.apply( this, arguments );
  3798 + args.mode = "show";
  3799 + return this.effect.call( this, args );
  3800 + }
  3801 + };
  3802 + })( $.fn.show ),
  3803 +
  3804 + hide: (function( orig ) {
  3805 + return function( option ) {
  3806 + if ( standardAnimationOption( option ) ) {
  3807 + return orig.apply( this, arguments );
  3808 + } else {
  3809 + var args = _normalizeArguments.apply( this, arguments );
  3810 + args.mode = "hide";
  3811 + return this.effect.call( this, args );
  3812 + }
  3813 + };
  3814 + })( $.fn.hide ),
  3815 +
  3816 + toggle: (function( orig ) {
  3817 + return function( option ) {
  3818 + if ( standardAnimationOption( option ) || typeof option === "boolean" ) {
  3819 + return orig.apply( this, arguments );
  3820 + } else {
  3821 + var args = _normalizeArguments.apply( this, arguments );
  3822 + args.mode = "toggle";
  3823 + return this.effect.call( this, args );
  3824 + }
  3825 + };
  3826 + })( $.fn.toggle ),
  3827 +
  3828 + // helper functions
  3829 + cssUnit: function(key) {
  3830 + var style = this.css( key ),
  3831 + val = [];
  3832 +
  3833 + $.each( [ "em", "px", "%", "pt" ], function( i, unit ) {
  3834 + if ( style.indexOf( unit ) > 0 ) {
  3835 + val = [ parseFloat( style ), unit ];
  3836 + }
  3837 + });
  3838 + return val;
  3839 + }
  3840 +});
  3841 +
  3842 +})();
  3843 +
  3844 +/******************************************************************************/
  3845 +/*********************************** EASING ***********************************/
  3846 +/******************************************************************************/
  3847 +
  3848 +(function() {
  3849 +
  3850 +// based on easing equations from Robert Penner (http://www.robertpenner.com/easing)
  3851 +
  3852 +var baseEasings = {};
  3853 +
  3854 +$.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) {
  3855 + baseEasings[ name ] = function( p ) {
  3856 + return Math.pow( p, i + 2 );
  3857 + };
  3858 +});
  3859 +
  3860 +$.extend( baseEasings, {
  3861 + Sine: function( p ) {
  3862 + return 1 - Math.cos( p * Math.PI / 2 );
  3863 + },
  3864 + Circ: function( p ) {
  3865 + return 1 - Math.sqrt( 1 - p * p );
  3866 + },
  3867 + Elastic: function( p ) {
  3868 + return p === 0 || p === 1 ? p :
  3869 + -Math.pow( 2, 8 * (p - 1) ) * Math.sin( ( (p - 1) * 80 - 7.5 ) * Math.PI / 15 );
  3870 + },
  3871 + Back: function( p ) {
  3872 + return p * p * ( 3 * p - 2 );
  3873 + },
  3874 + Bounce: function( p ) {
  3875 + var pow2,
  3876 + bounce = 4;
  3877 +
  3878 + while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}
  3879 + return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );
  3880 + }
  3881 +});
  3882 +
  3883 +$.each( baseEasings, function( name, easeIn ) {
  3884 + $.easing[ "easeIn" + name ] = easeIn;
  3885 + $.easing[ "easeOut" + name ] = function( p ) {
  3886 + return 1 - easeIn( 1 - p );
  3887 + };
  3888 + $.easing[ "easeInOut" + name ] = function( p ) {
  3889 + return p < 0.5 ?
  3890 + easeIn( p * 2 ) / 2 :
  3891 + 1 - easeIn( p * -2 + 2 ) / 2;
  3892 + };
  3893 +});
  3894 +
  3895 +})();
  3896 +
  3897 +var effect = $.effects;
  3898 +
  3899 +
  3900 +/*!
  3901 + * jQuery UI Effects Blind 1.11.4
  3902 + * http://jqueryui.com
  3903 + *
  3904 + * Copyright jQuery Foundation and other contributors
  3905 + * Released under the MIT license.
  3906 + * http://jquery.org/license
  3907 + *
  3908 + * http://api.jqueryui.com/blind-effect/
  3909 + */
  3910 +
  3911 +
  3912 +var effectBlind = $.effects.effect.blind = function( o, done ) {
  3913 + // Create element
  3914 + var el = $( this ),
  3915 + rvertical = /up|down|vertical/,
  3916 + rpositivemotion = /up|left|vertical|horizontal/,
  3917 + props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
  3918 + mode = $.effects.setMode( el, o.mode || "hide" ),
  3919 + direction = o.direction || "up",
  3920 + vertical = rvertical.test( direction ),
  3921 + ref = vertical ? "height" : "width",
  3922 + ref2 = vertical ? "top" : "left",
  3923 + motion = rpositivemotion.test( direction ),
  3924 + animation = {},
  3925 + show = mode === "show",
  3926 + wrapper, distance, margin;
  3927 +
  3928 + // if already wrapped, the wrapper's properties are my property. #6245
  3929 + if ( el.parent().is( ".ui-effects-wrapper" ) ) {
  3930 + $.effects.save( el.parent(), props );
  3931 + } else {
  3932 + $.effects.save( el, props );
  3933 + }
  3934 + el.show();
  3935 + wrapper = $.effects.createWrapper( el ).css({
  3936 + overflow: "hidden"
  3937 + });
  3938 +
  3939 + distance = wrapper[ ref ]();
  3940 + margin = parseFloat( wrapper.css( ref2 ) ) || 0;
  3941 +
  3942 + animation[ ref ] = show ? distance : 0;
  3943 + if ( !motion ) {
  3944 + el
  3945 + .css( vertical ? "bottom" : "right", 0 )
  3946 + .css( vertical ? "top" : "left", "auto" )
  3947 + .css({ position: "absolute" });
  3948 +
  3949 + animation[ ref2 ] = show ? margin : distance + margin;
  3950 + }
  3951 +
  3952 + // start at 0 if we are showing
  3953 + if ( show ) {
  3954 + wrapper.css( ref, 0 );
  3955 + if ( !motion ) {
  3956 + wrapper.css( ref2, margin + distance );
  3957 + }
  3958 + }
  3959 +
  3960 + // Animate
  3961 + wrapper.animate( animation, {
  3962 + duration: o.duration,
  3963 + easing: o.easing,
  3964 + queue: false,
  3965 + complete: function() {
  3966 + if ( mode === "hide" ) {
  3967 + el.hide();
  3968 + }
  3969 + $.effects.restore( el, props );
  3970 + $.effects.removeWrapper( el );
  3971 + done();
  3972 + }
  3973 + });
  3974 +};
  3975 +
  3976 +
  3977 +
  3978 +}));
0 3979 \ No newline at end of file
... ...
js/jquery.equalHeights.js
... ... @@ -1,31 +0,0 @@
1   -$.fn.equalHeights = function(px) {
2   - 'use strict';
3   -
4   - var currentTallest = 0;
5   - $(this).each(function(index, item){
6   - var $item = $(item);
7   - $item.height('auto'); // force a 'recalc' height
8   -
9   - if ($item.height() > currentTallest) { currentTallest = $item.height(); }
10   - if (!px && Number.prototype.pxToEm) { currentTallest = currentTallest.pxToEm(); } //use ems unless px is specified
11   - // for ie6, set height since min-height isn't supported
12   - if (typeof(document.body.style.minHeight) === 'undefined') { $item.css({'height': currentTallest}); }
13   - $item.css({'height': currentTallest});
14   - });
15   - return this;
16   -};
17   -
18   -// just in case you need it...
19   -// $.fn.equalWidths = function(px) {
20   -// $(this).each(function(){
21   -// var currentWidest = 0;
22   -// $(this).children().each(function(i){
23   -// if($(this).width() > currentWidest) { currentWidest = $(this).width(); }
24   -// });
25   -// if(!px && Number.prototype.pxToEm) currentWidest = currentWidest.pxToEm(); //use ems unless px is specified
26   -// // for ie6, set width since min-width isn't supported
27   -// if (typeof(document.body.style.minHeight) === "undefined") { $(this).children().css({'width': currentWidest}); }
28   -// $(this).children().css({'min-width': currentWidest});
29   -// });
30   -// return this;
31   -// };
32 0 \ No newline at end of file
js/jquery.maxlength.min.js
... ... @@ -1,8 +0,0 @@
1   -/*
2   - * jQuery Maxlength
3   - * http://pioul.fr/jquery-maxlength
4   - *
5   - * Copyright 2013, Philippe Masset
6   - * Dual licensed under the MIT or GPL Version 2 licenses
7   - */
8   -(function(a){a.fn.maxlength=function(b){var c=a(this);return c.each(function(){b=a.extend({},{counterContainer:!1,text:"%left characters left"},b);var c=a(this),d={options:b,field:c,counter:a('<div class="maxlength"></div>'),maxLength:parseInt(c.attr("maxlength"),10),lastLength:null,updateCounter:function(){var b=this.field.val().length,c=this.options.text.replace(/\B%(length|maxlength|left)\b/g,a.proxy(function(a,c){return"length"==c?b:"maxlength"==c?this.maxLength:this.maxLength-b},this));this.counter.html(c),b!=this.lastLength&&this.updateLength(b)},updateLength:function(a){this.field.trigger("update.maxlength",[this.field,this.lastLength,a,this.maxLength,this.maxLength-a]),this.lastLength=a}};d.maxLength&&(d.field.data("maxlength",d).bind({"keyup change":function(){a(this).data("maxlength").updateCounter()},"cut paste drop":function(){setTimeout(a.proxy(function(){a(this).data("maxlength").updateCounter()},this),1)}}),b.counterContainer?b.counterContainer.append(d.counter):d.field.after(d.counter),d.updateCounter())}),c}})(jQuery);
9 0 \ No newline at end of file
js/jquery.timeago.pt-br.js
1   -// Brazilian Portuguese
2   -jQuery.timeago.settings.strings = {
3   - prefixAgo: "há",
4   - prefixFromNow: "em",
5   - suffixAgo: null,
6   - suffixFromNow: null,
7   - seconds: "alguns segundos",
8   - minute: "um minuto",
9   - minutes: "%d minutos",
10   - hour: "uma hora",
11   - hours: "%d horas",
12   - day: "um dia",
13   - days: "%d dias",
14   - month: "um mês",
15   - months: "%d meses",
16   - year: "um ano",
17   - years: "%d anos"
18   -};
  1 +define(['jquery'], function(jQuery){
  2 + // Brazilian Portuguese
  3 + jQuery.timeago.settings.strings = {
  4 + prefixAgo: "há",
  5 + prefixFromNow: "em",
  6 + suffixAgo: null,
  7 + suffixFromNow: null,
  8 + seconds: "alguns segundos",
  9 + minute: "um minuto",
  10 + minutes: "%d minutos",
  11 + hour: "uma hora",
  12 + hours: "%d horas",
  13 + day: "um dia",
  14 + days: "%d dias",
  15 + month: "um mês",
  16 + months: "%d meses",
  17 + year: "um ano",
  18 + years: "%d anos"
  19 + };
  20 +
  21 +});
... ...
js/jquery_equalHeights.js 0 → 100644
... ... @@ -0,0 +1,31 @@
  1 +$.fn.equalHeights = function(px) {
  2 + 'use strict';
  3 +
  4 + var currentTallest = 0;
  5 + $(this).each(function(index, item){
  6 + var $item = $(item);
  7 + $item.height('auto'); // force a 'recalc' height
  8 +
  9 + if ($item.height() > currentTallest) { currentTallest = $item.height(); }
  10 + if (!px && Number.prototype.pxToEm) { currentTallest = currentTallest.pxToEm(); } //use ems unless px is specified
  11 + // for ie6, set height since min-height isn't supported
  12 + if (typeof(document.body.style.minHeight) === 'undefined') { $item.css({'height': currentTallest}); }
  13 + $item.css({'height': currentTallest});
  14 + });
  15 + return this;
  16 +};
  17 +
  18 +// just in case you need it...
  19 +// $.fn.equalWidths = function(px) {
  20 +// $(this).each(function(){
  21 +// var currentWidest = 0;
  22 +// $(this).children().each(function(i){
  23 +// if($(this).width() > currentWidest) { currentWidest = $(this).width(); }
  24 +// });
  25 +// if(!px && Number.prototype.pxToEm) currentWidest = currentWidest.pxToEm(); //use ems unless px is specified
  26 +// // for ie6, set width since min-width isn't supported
  27 +// if (typeof(document.body.style.minHeight) === "undefined") { $(this).children().css({'width': currentWidest}); }
  28 +// $(this).children().css({'min-width': currentWidest});
  29 +// });
  30 +// return this;
  31 +// };
0 32 \ No newline at end of file
... ...
js/jquery_maxlength.js 0 → 100644
... ... @@ -0,0 +1,8 @@
  1 +/*
  2 + * jQuery Maxlength
  3 + * http://pioul.fr/jquery-maxlength
  4 + *
  5 + * Copyright 2013, Philippe Masset
  6 + * Dual licensed under the MIT or GPL Version 2 licenses
  7 + */
  8 +(function(a){a.fn.maxlength=function(b){var c=a(this);return c.each(function(){b=a.extend({},{counterContainer:!1,text:"%left characters left"},b);var c=a(this),d={options:b,field:c,counter:a('<div class="maxlength"></div>'),maxLength:parseInt(c.attr("maxlength"),10),lastLength:null,updateCounter:function(){var b=this.field.val().length,c=this.options.text.replace(/\B%(length|maxlength|left)\b/g,a.proxy(function(a,c){return"length"==c?b:"maxlength"==c?this.maxLength:this.maxLength-b},this));this.counter.html(c),b!=this.lastLength&&this.updateLength(b)},updateLength:function(a){this.field.trigger("update.maxlength",[this.field,this.lastLength,a,this.maxLength,this.maxLength-a]),this.lastLength=a}};d.maxLength&&(d.field.data("maxlength",d).bind({"keyup change":function(){a(this).data("maxlength").updateCounter()},"cut paste drop":function(){setTimeout(a.proxy(function(){a(this).data("maxlength").updateCounter()},this),1)}}),b.counterContainer?b.counterContainer.append(d.counter):d.field.after(d.counter),d.updateCounter())}),c}})(jQuery);
0 9 \ No newline at end of file
... ...
js/main.js
1 1 /* global define */
2   -define(['jquery', 'handlebars', 'fastclick', 'proposal_app', 'handlebars_helpers', 'piwik'], function($, Handlebars, FastClick, ProposalApp){
  2 +define(
  3 + [
  4 + 'jquery', 'handlebars', 'fastclick', 'proposal_app',
  5 + 'handlebars_helpers', 'piwik', 'jquery.timeago', 'jquery.timeago.pt-br',
  6 + 'jquery-ui', 'footable', 'jquery.simplePagination'
  7 + ],
  8 +function($, Handlebars, FastClick, ProposalApp){
  9 +
3 10 // 'use strict';
4 11  
5 12 // The template code
... ...
js/requirejs-config.js
... ... @@ -12,20 +12,20 @@ requirejs.config({
12 12 jquery: 'jquery',
13 13 jquery_xdomainrequest: 'jquery.xdomainrequest.min',
14 14 jquery_ui: 'jquery-ui-1.11.4.custom/jquery-ui.min',
15   - jquery_cookie: 'jquery.cookie',
  15 + jquery_cookie: 'jquery_cookie',
16 16 jquery_timeago: 'jquery.timeago',
17 17 jquery_timeago_pt: 'jquery.timeago.pt-br',
18 18 jquery_simplePagination: 'jquery.simplePagination',
19   - jquery_equalHeights: 'jquery.equalHeights',
  19 + jquery_equalHeights: 'jquery_equalHeights',
20 20 jquery_footable: 'footable',
21   - handlebars: 'handlebars-v3.0.1',
22   - handlebars_helpers: 'handlebars-helpers',
23   - jquery_maxlength: 'jquery.maxlength.min',
  21 + handlebars: 'handlebars',
  22 + handlebars_helpers: 'handlebars_helpers',
  23 + jquery_maxlength: 'jquery_maxlength',
24 24 slick: 'slick.min',
25 25 fastclick: 'fastclick.min',
26 26 layout: 'layout',
27 27 main: 'main',
28   - proposal_app: 'proposal-app'
  28 + "proposal-app": 'proposal-app'
29 29 },
30 30 shim: {
31 31 'handlebars': {
... ... @@ -71,7 +71,7 @@ requirejs.config({
71 71 'handlebars_helpers': {
72 72 deps: ['handlebars']
73 73 },
74   - 'proposal_app': {
  74 + 'proposal-app': {
75 75 deps: ['jquery'],
76 76 exports: 'ProposalApp'
77 77 }
... ... @@ -79,7 +79,7 @@ requirejs.config({
79 79 });
80 80  
81 81 requirejs(['piwik']);
82   -requirejs(['jquery', 'proposal_app', 'jquery_ui', 'jquery_xdomainrequest',
  82 +requirejs(['jquery', 'proposal-app', 'jquery-ui', 'jquery_xdomainrequest',
83 83 'jquery_timeago_pt', 'jquery_simplePagination', 'jquery_equalHeights',
84 84 'footable', 'handlebars_helpers'
85 85 ]);
... ...
js/requirejs.json 0 → 100644
... ... @@ -0,0 +1,76 @@
  1 +({
  2 + "baseUrl": "js",
  3 + "waitSeconds": 0,
  4 + "paths": {
  5 + "piwik": "piwik",
  6 + "jquery": "jquery",
  7 + "jquery_xdomainrequest": "jquery.xdomainrequest.min",
  8 + "jquery_ui": "jquery-ui-1.11.4.custom/jquery-ui.min",
  9 + "jquery_cookie": "jquery_cookie",
  10 + "jquery_timeago": "jquery.timeago",
  11 + "jquery_timeago_pt": "jquery.timeago.pt-br",
  12 + "jquery_simplePagination": "jquery.simplePagination",
  13 + "jquery_equalHeights": "jquery_equalHeights",
  14 + "jquery_footable": "footable",
  15 + "handlebars": "handlebars",
  16 + "handlebars_helpers": "handlebars_helpers",
  17 + "jquery_maxlength": "jquery_maxlength",
  18 + "slick": "slick.min",
  19 + "fastclick": "fastclick.min",
  20 + "layout": "layout",
  21 + "main": "main",
  22 + "proposal_app": "proposal-app"
  23 + },
  24 + "shim": {
  25 + "jquery_xdomainrequest": {
  26 + "deps": ["jquery"]
  27 + }
  28 + "handlebars": {
  29 + "deps": ["jquery"],
  30 + "exports": "Handlebars"
  31 + },
  32 + "jquery_xdomainrequest": {
  33 + "deps": ["jquery"]
  34 + },
  35 + "jquery_cookie": {
  36 + "deps": ["jquery"]
  37 + },
  38 + "jquery_timeago": {
  39 + "deps": ["jquery"]
  40 + },
  41 + "jquery_timeago_pt": {
  42 + "deps": ["jquery_timeago"]
  43 + },
  44 + "jquery_simplePagination": {
  45 + "deps": ["jquery"]
  46 + },
  47 + "jquery_equalHeights": {
  48 + "deps": ["jquery"]
  49 + },
  50 + "footable": {
  51 + "deps": ["jquery"]
  52 + },
  53 + "jquery_ui": {
  54 + "deps": ["jquery"]
  55 + },
  56 + "layout": {
  57 + "deps": ["jquery"]
  58 + },
  59 + "jquery_maxlength": {
  60 + "deps": ["jquery"]
  61 + },
  62 + "slick": {
  63 + "deps": ["jquery"]
  64 + },
  65 + "fastclick": {
  66 + "deps": ["jquery"]
  67 + },
  68 + "handlebars_helpers": {
  69 + "deps": ["handlebars"]
  70 + },
  71 + "proposal_app": {
  72 + "deps": ["jquery"],
  73 + "exports": "ProposalApp"
  74 + }
  75 + }
  76 +})
0 77 \ No newline at end of file
... ...
package.json
... ... @@ -23,7 +23,7 @@
23 23 "gulp-if": "^1.2.5",
24 24 "gulp-minify-css": "^1.2.0",
25 25 "gulp-pipemin": "^2.2.3",
26   - "gulp-requirejs-optimize": "^0.1.3",
  26 + "gulp-requirejs-optimize" : "jridgewell/gulp-requirejs-optimize",
27 27 "gulp-rev": "^5.1.0",
28 28 "gulp-rev-replace": "^0.4.2",
29 29 "gulp-ruby-sass": "^1.0.5",
... ...