etcweb 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (115) hide show
  1. checksums.yaml +7 -0
  2. data/.bowerrc +3 -0
  3. data/.gitignore +9 -0
  4. data/.rspec +2 -0
  5. data/.travis.yml +19 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +36 -0
  9. data/Rakefile +1 -0
  10. data/app/bower_components/jquery/.bower.json +37 -0
  11. data/app/bower_components/jquery/MIT-LICENSE.txt +21 -0
  12. data/app/bower_components/jquery/bower.json +27 -0
  13. data/app/bower_components/jquery/dist/jquery.js +9205 -0
  14. data/app/bower_components/jquery/dist/jquery.min.js +5 -0
  15. data/app/bower_components/jquery/dist/jquery.min.map +1 -0
  16. data/app/bower_components/jquery/src/ajax.js +786 -0
  17. data/app/bower_components/jquery/src/ajax/jsonp.js +89 -0
  18. data/app/bower_components/jquery/src/ajax/load.js +75 -0
  19. data/app/bower_components/jquery/src/ajax/parseJSON.js +13 -0
  20. data/app/bower_components/jquery/src/ajax/parseXML.js +28 -0
  21. data/app/bower_components/jquery/src/ajax/script.js +64 -0
  22. data/app/bower_components/jquery/src/ajax/var/nonce.js +5 -0
  23. data/app/bower_components/jquery/src/ajax/var/rquery.js +3 -0
  24. data/app/bower_components/jquery/src/ajax/xhr.js +136 -0
  25. data/app/bower_components/jquery/src/attributes.js +11 -0
  26. data/app/bower_components/jquery/src/attributes/attr.js +141 -0
  27. data/app/bower_components/jquery/src/attributes/classes.js +158 -0
  28. data/app/bower_components/jquery/src/attributes/prop.js +94 -0
  29. data/app/bower_components/jquery/src/attributes/support.js +35 -0
  30. data/app/bower_components/jquery/src/attributes/val.js +161 -0
  31. data/app/bower_components/jquery/src/callbacks.js +205 -0
  32. data/app/bower_components/jquery/src/core.js +497 -0
  33. data/app/bower_components/jquery/src/core/access.js +60 -0
  34. data/app/bower_components/jquery/src/core/init.js +123 -0
  35. data/app/bower_components/jquery/src/core/parseHTML.js +39 -0
  36. data/app/bower_components/jquery/src/core/ready.js +97 -0
  37. data/app/bower_components/jquery/src/core/var/rsingleTag.js +4 -0
  38. data/app/bower_components/jquery/src/css.js +450 -0
  39. data/app/bower_components/jquery/src/css/addGetHookIf.js +22 -0
  40. data/app/bower_components/jquery/src/css/curCSS.js +57 -0
  41. data/app/bower_components/jquery/src/css/defaultDisplay.js +70 -0
  42. data/app/bower_components/jquery/src/css/hiddenVisibleSelectors.js +15 -0
  43. data/app/bower_components/jquery/src/css/support.js +96 -0
  44. data/app/bower_components/jquery/src/css/swap.js +28 -0
  45. data/app/bower_components/jquery/src/css/var/cssExpand.js +3 -0
  46. data/app/bower_components/jquery/src/css/var/getStyles.js +12 -0
  47. data/app/bower_components/jquery/src/css/var/isHidden.js +13 -0
  48. data/app/bower_components/jquery/src/css/var/rmargin.js +3 -0
  49. data/app/bower_components/jquery/src/css/var/rnumnonpx.js +5 -0
  50. data/app/bower_components/jquery/src/data.js +178 -0
  51. data/app/bower_components/jquery/src/data/Data.js +181 -0
  52. data/app/bower_components/jquery/src/data/accepts.js +20 -0
  53. data/app/bower_components/jquery/src/data/var/data_priv.js +5 -0
  54. data/app/bower_components/jquery/src/data/var/data_user.js +5 -0
  55. data/app/bower_components/jquery/src/deferred.js +149 -0
  56. data/app/bower_components/jquery/src/deprecated.js +13 -0
  57. data/app/bower_components/jquery/src/dimensions.js +50 -0
  58. data/app/bower_components/jquery/src/effects.js +648 -0
  59. data/app/bower_components/jquery/src/effects/Tween.js +114 -0
  60. data/app/bower_components/jquery/src/effects/animatedSelector.js +13 -0
  61. data/app/bower_components/jquery/src/event.js +868 -0
  62. data/app/bower_components/jquery/src/event/ajax.js +13 -0
  63. data/app/bower_components/jquery/src/event/alias.js +39 -0
  64. data/app/bower_components/jquery/src/event/support.js +9 -0
  65. data/app/bower_components/jquery/src/exports/amd.js +24 -0
  66. data/app/bower_components/jquery/src/exports/global.js +32 -0
  67. data/app/bower_components/jquery/src/intro.js +44 -0
  68. data/app/bower_components/jquery/src/jquery.js +37 -0
  69. data/app/bower_components/jquery/src/manipulation.js +580 -0
  70. data/app/bower_components/jquery/src/manipulation/_evalUrl.js +18 -0
  71. data/app/bower_components/jquery/src/manipulation/support.js +32 -0
  72. data/app/bower_components/jquery/src/manipulation/var/rcheckableType.js +3 -0
  73. data/app/bower_components/jquery/src/offset.js +207 -0
  74. data/app/bower_components/jquery/src/outro.js +1 -0
  75. data/app/bower_components/jquery/src/queue.js +142 -0
  76. data/app/bower_components/jquery/src/queue/delay.js +22 -0
  77. data/app/bower_components/jquery/src/selector-native.js +172 -0
  78. data/app/bower_components/jquery/src/selector-sizzle.js +14 -0
  79. data/app/bower_components/jquery/src/selector.js +1 -0
  80. data/app/bower_components/jquery/src/serialize.js +111 -0
  81. data/app/bower_components/jquery/src/sizzle/dist/sizzle.js +2067 -0
  82. data/app/bower_components/jquery/src/sizzle/dist/sizzle.min.js +3 -0
  83. data/app/bower_components/jquery/src/sizzle/dist/sizzle.min.map +1 -0
  84. data/app/bower_components/jquery/src/traversing.js +199 -0
  85. data/app/bower_components/jquery/src/traversing/findFilter.js +100 -0
  86. data/app/bower_components/jquery/src/traversing/var/rneedsContext.js +6 -0
  87. data/app/bower_components/jquery/src/var/arr.js +3 -0
  88. data/app/bower_components/jquery/src/var/class2type.js +4 -0
  89. data/app/bower_components/jquery/src/var/concat.js +5 -0
  90. data/app/bower_components/jquery/src/var/hasOwn.js +5 -0
  91. data/app/bower_components/jquery/src/var/indexOf.js +5 -0
  92. data/app/bower_components/jquery/src/var/pnum.js +3 -0
  93. data/app/bower_components/jquery/src/var/push.js +5 -0
  94. data/app/bower_components/jquery/src/var/rnotwhite.js +3 -0
  95. data/app/bower_components/jquery/src/var/slice.js +5 -0
  96. data/app/bower_components/jquery/src/var/strundefined.js +3 -0
  97. data/app/bower_components/jquery/src/var/support.js +4 -0
  98. data/app/bower_components/jquery/src/var/toString.js +5 -0
  99. data/app/bower_components/jquery/src/wrap.js +79 -0
  100. data/app/stylesheets/application.scss +31 -0
  101. data/app/views/dir.haml +95 -0
  102. data/app/views/etcd_error.haml +5 -0
  103. data/app/views/etcvault_keys_select.haml +6 -0
  104. data/app/views/index.haml +1 -0
  105. data/app/views/key.haml +68 -0
  106. data/app/views/keys.haml +30 -0
  107. data/app/views/layout.haml +20 -0
  108. data/bin/console +14 -0
  109. data/bin/setup +7 -0
  110. data/config.ru +19 -0
  111. data/etcweb.gemspec +37 -0
  112. data/lib/etcweb.rb +6 -0
  113. data/lib/etcweb/app.rb +230 -0
  114. data/lib/etcweb/version.rb +3 -0
  115. metadata +331 -0
@@ -0,0 +1,60 @@
1
+ define([
2
+ "../core"
3
+ ], function( jQuery ) {
4
+
5
+ // Multifunctional method to get and set values of a collection
6
+ // The value/s can optionally be executed if it's a function
7
+ var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
8
+ var i = 0,
9
+ len = elems.length,
10
+ bulk = key == null;
11
+
12
+ // Sets many values
13
+ if ( jQuery.type( key ) === "object" ) {
14
+ chainable = true;
15
+ for ( i in key ) {
16
+ jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
17
+ }
18
+
19
+ // Sets one value
20
+ } else if ( value !== undefined ) {
21
+ chainable = true;
22
+
23
+ if ( !jQuery.isFunction( value ) ) {
24
+ raw = true;
25
+ }
26
+
27
+ if ( bulk ) {
28
+ // Bulk operations run against the entire set
29
+ if ( raw ) {
30
+ fn.call( elems, value );
31
+ fn = null;
32
+
33
+ // ...except when executing function values
34
+ } else {
35
+ bulk = fn;
36
+ fn = function( elem, key, value ) {
37
+ return bulk.call( jQuery( elem ), value );
38
+ };
39
+ }
40
+ }
41
+
42
+ if ( fn ) {
43
+ for ( ; i < len; i++ ) {
44
+ fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
45
+ }
46
+ }
47
+ }
48
+
49
+ return chainable ?
50
+ elems :
51
+
52
+ // Gets
53
+ bulk ?
54
+ fn.call( elems ) :
55
+ len ? fn( elems[0], key ) : emptyGet;
56
+ };
57
+
58
+ return access;
59
+
60
+ });
@@ -0,0 +1,123 @@
1
+ // Initialize a jQuery object
2
+ define([
3
+ "../core",
4
+ "./var/rsingleTag",
5
+ "../traversing/findFilter"
6
+ ], function( jQuery, rsingleTag ) {
7
+
8
+ // A central reference to the root jQuery(document)
9
+ var rootjQuery,
10
+
11
+ // A simple way to check for HTML strings
12
+ // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
13
+ // Strict HTML recognition (#11290: must start with <)
14
+ rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
15
+
16
+ init = jQuery.fn.init = function( selector, context ) {
17
+ var match, elem;
18
+
19
+ // HANDLE: $(""), $(null), $(undefined), $(false)
20
+ if ( !selector ) {
21
+ return this;
22
+ }
23
+
24
+ // Handle HTML strings
25
+ if ( typeof selector === "string" ) {
26
+ if ( selector[0] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) {
27
+ // Assume that strings that start and end with <> are HTML and skip the regex check
28
+ match = [ null, selector, null ];
29
+
30
+ } else {
31
+ match = rquickExpr.exec( selector );
32
+ }
33
+
34
+ // Match html or make sure no context is specified for #id
35
+ if ( match && (match[1] || !context) ) {
36
+
37
+ // HANDLE: $(html) -> $(array)
38
+ if ( match[1] ) {
39
+ context = context instanceof jQuery ? context[0] : context;
40
+
41
+ // Option to run scripts is true for back-compat
42
+ // Intentionally let the error be thrown if parseHTML is not present
43
+ jQuery.merge( this, jQuery.parseHTML(
44
+ match[1],
45
+ context && context.nodeType ? context.ownerDocument || context : document,
46
+ true
47
+ ) );
48
+
49
+ // HANDLE: $(html, props)
50
+ if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
51
+ for ( match in context ) {
52
+ // Properties of context are called as methods if possible
53
+ if ( jQuery.isFunction( this[ match ] ) ) {
54
+ this[ match ]( context[ match ] );
55
+
56
+ // ...and otherwise set as attributes
57
+ } else {
58
+ this.attr( match, context[ match ] );
59
+ }
60
+ }
61
+ }
62
+
63
+ return this;
64
+
65
+ // HANDLE: $(#id)
66
+ } else {
67
+ elem = document.getElementById( match[2] );
68
+
69
+ // Support: Blackberry 4.6
70
+ // gEBID returns nodes no longer in the document (#6963)
71
+ if ( elem && elem.parentNode ) {
72
+ // Inject the element directly into the jQuery object
73
+ this.length = 1;
74
+ this[0] = elem;
75
+ }
76
+
77
+ this.context = document;
78
+ this.selector = selector;
79
+ return this;
80
+ }
81
+
82
+ // HANDLE: $(expr, $(...))
83
+ } else if ( !context || context.jquery ) {
84
+ return ( context || rootjQuery ).find( selector );
85
+
86
+ // HANDLE: $(expr, context)
87
+ // (which is just equivalent to: $(context).find(expr)
88
+ } else {
89
+ return this.constructor( context ).find( selector );
90
+ }
91
+
92
+ // HANDLE: $(DOMElement)
93
+ } else if ( selector.nodeType ) {
94
+ this.context = this[0] = selector;
95
+ this.length = 1;
96
+ return this;
97
+
98
+ // HANDLE: $(function)
99
+ // Shortcut for document ready
100
+ } else if ( jQuery.isFunction( selector ) ) {
101
+ return typeof rootjQuery.ready !== "undefined" ?
102
+ rootjQuery.ready( selector ) :
103
+ // Execute immediately if ready is not present
104
+ selector( jQuery );
105
+ }
106
+
107
+ if ( selector.selector !== undefined ) {
108
+ this.selector = selector.selector;
109
+ this.context = selector.context;
110
+ }
111
+
112
+ return jQuery.makeArray( selector, this );
113
+ };
114
+
115
+ // Give the init function the jQuery prototype for later instantiation
116
+ init.prototype = jQuery.fn;
117
+
118
+ // Initialize central reference
119
+ rootjQuery = jQuery( document );
120
+
121
+ return init;
122
+
123
+ });
@@ -0,0 +1,39 @@
1
+ define([
2
+ "../core",
3
+ "./var/rsingleTag",
4
+ "../manipulation" // buildFragment
5
+ ], function( jQuery, rsingleTag ) {
6
+
7
+ // data: string of html
8
+ // context (optional): If specified, the fragment will be created in this context, defaults to document
9
+ // keepScripts (optional): If true, will include scripts passed in the html string
10
+ jQuery.parseHTML = function( data, context, keepScripts ) {
11
+ if ( !data || typeof data !== "string" ) {
12
+ return null;
13
+ }
14
+ if ( typeof context === "boolean" ) {
15
+ keepScripts = context;
16
+ context = false;
17
+ }
18
+ context = context || document;
19
+
20
+ var parsed = rsingleTag.exec( data ),
21
+ scripts = !keepScripts && [];
22
+
23
+ // Single tag
24
+ if ( parsed ) {
25
+ return [ context.createElement( parsed[1] ) ];
26
+ }
27
+
28
+ parsed = jQuery.buildFragment( [ data ], context, scripts );
29
+
30
+ if ( scripts && scripts.length ) {
31
+ jQuery( scripts ).remove();
32
+ }
33
+
34
+ return jQuery.merge( [], parsed.childNodes );
35
+ };
36
+
37
+ return jQuery.parseHTML;
38
+
39
+ });
@@ -0,0 +1,97 @@
1
+ define([
2
+ "../core",
3
+ "../core/init",
4
+ "../deferred"
5
+ ], function( jQuery ) {
6
+
7
+ // The deferred used on DOM ready
8
+ var readyList;
9
+
10
+ jQuery.fn.ready = function( fn ) {
11
+ // Add the callback
12
+ jQuery.ready.promise().done( fn );
13
+
14
+ return this;
15
+ };
16
+
17
+ jQuery.extend({
18
+ // Is the DOM ready to be used? Set to true once it occurs.
19
+ isReady: false,
20
+
21
+ // A counter to track how many items to wait for before
22
+ // the ready event fires. See #6781
23
+ readyWait: 1,
24
+
25
+ // Hold (or release) the ready event
26
+ holdReady: function( hold ) {
27
+ if ( hold ) {
28
+ jQuery.readyWait++;
29
+ } else {
30
+ jQuery.ready( true );
31
+ }
32
+ },
33
+
34
+ // Handle when the DOM is ready
35
+ ready: function( wait ) {
36
+
37
+ // Abort if there are pending holds or we're already ready
38
+ if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
39
+ return;
40
+ }
41
+
42
+ // Remember that the DOM is ready
43
+ jQuery.isReady = true;
44
+
45
+ // If a normal DOM Ready event fired, decrement, and wait if need be
46
+ if ( wait !== true && --jQuery.readyWait > 0 ) {
47
+ return;
48
+ }
49
+
50
+ // If there are functions bound, to execute
51
+ readyList.resolveWith( document, [ jQuery ] );
52
+
53
+ // Trigger any bound ready events
54
+ if ( jQuery.fn.triggerHandler ) {
55
+ jQuery( document ).triggerHandler( "ready" );
56
+ jQuery( document ).off( "ready" );
57
+ }
58
+ }
59
+ });
60
+
61
+ /**
62
+ * The ready event handler and self cleanup method
63
+ */
64
+ function completed() {
65
+ document.removeEventListener( "DOMContentLoaded", completed, false );
66
+ window.removeEventListener( "load", completed, false );
67
+ jQuery.ready();
68
+ }
69
+
70
+ jQuery.ready.promise = function( obj ) {
71
+ if ( !readyList ) {
72
+
73
+ readyList = jQuery.Deferred();
74
+
75
+ // Catch cases where $(document).ready() is called after the browser event has already occurred.
76
+ // We once tried to use readyState "interactive" here, but it caused issues like the one
77
+ // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
78
+ if ( document.readyState === "complete" ) {
79
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
80
+ setTimeout( jQuery.ready );
81
+
82
+ } else {
83
+
84
+ // Use the handy event callback
85
+ document.addEventListener( "DOMContentLoaded", completed, false );
86
+
87
+ // A fallback to window.onload, that will always work
88
+ window.addEventListener( "load", completed, false );
89
+ }
90
+ }
91
+ return readyList.promise( obj );
92
+ };
93
+
94
+ // Kick off the DOM ready check even if the user does not
95
+ jQuery.ready.promise();
96
+
97
+ });
@@ -0,0 +1,4 @@
1
+ define(function() {
2
+ // Match a standalone tag
3
+ return (/^<(\w+)\s*\/?>(?:<\/\1>|)$/);
4
+ });
@@ -0,0 +1,450 @@
1
+ define([
2
+ "./core",
3
+ "./var/pnum",
4
+ "./core/access",
5
+ "./css/var/rmargin",
6
+ "./css/var/rnumnonpx",
7
+ "./css/var/cssExpand",
8
+ "./css/var/isHidden",
9
+ "./css/var/getStyles",
10
+ "./css/curCSS",
11
+ "./css/defaultDisplay",
12
+ "./css/addGetHookIf",
13
+ "./css/support",
14
+ "./data/var/data_priv",
15
+
16
+ "./core/init",
17
+ "./css/swap",
18
+ "./core/ready",
19
+ "./selector" // contains
20
+ ], function( jQuery, pnum, access, rmargin, rnumnonpx, cssExpand, isHidden,
21
+ getStyles, curCSS, defaultDisplay, addGetHookIf, support, data_priv ) {
22
+
23
+ var
24
+ // Swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
25
+ // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
26
+ rdisplayswap = /^(none|table(?!-c[ea]).+)/,
27
+ rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ),
28
+ rrelNum = new RegExp( "^([+-])=(" + pnum + ")", "i" ),
29
+
30
+ cssShow = { position: "absolute", visibility: "hidden", display: "block" },
31
+ cssNormalTransform = {
32
+ letterSpacing: "0",
33
+ fontWeight: "400"
34
+ },
35
+
36
+ cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
37
+
38
+ // Return a css property mapped to a potentially vendor prefixed property
39
+ function vendorPropName( style, name ) {
40
+
41
+ // Shortcut for names that are not vendor prefixed
42
+ if ( name in style ) {
43
+ return name;
44
+ }
45
+
46
+ // Check for vendor prefixed names
47
+ var capName = name[0].toUpperCase() + name.slice(1),
48
+ origName = name,
49
+ i = cssPrefixes.length;
50
+
51
+ while ( i-- ) {
52
+ name = cssPrefixes[ i ] + capName;
53
+ if ( name in style ) {
54
+ return name;
55
+ }
56
+ }
57
+
58
+ return origName;
59
+ }
60
+
61
+ function setPositiveNumber( elem, value, subtract ) {
62
+ var matches = rnumsplit.exec( value );
63
+ return matches ?
64
+ // Guard against undefined "subtract", e.g., when used as in cssHooks
65
+ Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
66
+ value;
67
+ }
68
+
69
+ function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
70
+ var i = extra === ( isBorderBox ? "border" : "content" ) ?
71
+ // If we already have the right measurement, avoid augmentation
72
+ 4 :
73
+ // Otherwise initialize for horizontal or vertical properties
74
+ name === "width" ? 1 : 0,
75
+
76
+ val = 0;
77
+
78
+ for ( ; i < 4; i += 2 ) {
79
+ // Both box models exclude margin, so add it if we want it
80
+ if ( extra === "margin" ) {
81
+ val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
82
+ }
83
+
84
+ if ( isBorderBox ) {
85
+ // border-box includes padding, so remove it if we want content
86
+ if ( extra === "content" ) {
87
+ val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
88
+ }
89
+
90
+ // At this point, extra isn't border nor margin, so remove border
91
+ if ( extra !== "margin" ) {
92
+ val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
93
+ }
94
+ } else {
95
+ // At this point, extra isn't content, so add padding
96
+ val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
97
+
98
+ // At this point, extra isn't content nor padding, so add border
99
+ if ( extra !== "padding" ) {
100
+ val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
101
+ }
102
+ }
103
+ }
104
+
105
+ return val;
106
+ }
107
+
108
+ function getWidthOrHeight( elem, name, extra ) {
109
+
110
+ // Start with offset property, which is equivalent to the border-box value
111
+ var valueIsBorderBox = true,
112
+ val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
113
+ styles = getStyles( elem ),
114
+ isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
115
+
116
+ // Some non-html elements return undefined for offsetWidth, so check for null/undefined
117
+ // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
118
+ // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
119
+ if ( val <= 0 || val == null ) {
120
+ // Fall back to computed then uncomputed css if necessary
121
+ val = curCSS( elem, name, styles );
122
+ if ( val < 0 || val == null ) {
123
+ val = elem.style[ name ];
124
+ }
125
+
126
+ // Computed unit is not pixels. Stop here and return.
127
+ if ( rnumnonpx.test(val) ) {
128
+ return val;
129
+ }
130
+
131
+ // Check for style in case a browser which returns unreliable values
132
+ // for getComputedStyle silently falls back to the reliable elem.style
133
+ valueIsBorderBox = isBorderBox &&
134
+ ( support.boxSizingReliable() || val === elem.style[ name ] );
135
+
136
+ // Normalize "", auto, and prepare for extra
137
+ val = parseFloat( val ) || 0;
138
+ }
139
+
140
+ // Use the active box-sizing model to add/subtract irrelevant styles
141
+ return ( val +
142
+ augmentWidthOrHeight(
143
+ elem,
144
+ name,
145
+ extra || ( isBorderBox ? "border" : "content" ),
146
+ valueIsBorderBox,
147
+ styles
148
+ )
149
+ ) + "px";
150
+ }
151
+
152
+ function showHide( elements, show ) {
153
+ var display, elem, hidden,
154
+ values = [],
155
+ index = 0,
156
+ length = elements.length;
157
+
158
+ for ( ; index < length; index++ ) {
159
+ elem = elements[ index ];
160
+ if ( !elem.style ) {
161
+ continue;
162
+ }
163
+
164
+ values[ index ] = data_priv.get( elem, "olddisplay" );
165
+ display = elem.style.display;
166
+ if ( show ) {
167
+ // Reset the inline display of this element to learn if it is
168
+ // being hidden by cascaded rules or not
169
+ if ( !values[ index ] && display === "none" ) {
170
+ elem.style.display = "";
171
+ }
172
+
173
+ // Set elements which have been overridden with display: none
174
+ // in a stylesheet to whatever the default browser style is
175
+ // for such an element
176
+ if ( elem.style.display === "" && isHidden( elem ) ) {
177
+ values[ index ] = data_priv.access( elem, "olddisplay", defaultDisplay(elem.nodeName) );
178
+ }
179
+ } else {
180
+ hidden = isHidden( elem );
181
+
182
+ if ( display !== "none" || !hidden ) {
183
+ data_priv.set( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
184
+ }
185
+ }
186
+ }
187
+
188
+ // Set the display of most of the elements in a second loop
189
+ // to avoid the constant reflow
190
+ for ( index = 0; index < length; index++ ) {
191
+ elem = elements[ index ];
192
+ if ( !elem.style ) {
193
+ continue;
194
+ }
195
+ if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
196
+ elem.style.display = show ? values[ index ] || "" : "none";
197
+ }
198
+ }
199
+
200
+ return elements;
201
+ }
202
+
203
+ jQuery.extend({
204
+
205
+ // Add in style property hooks for overriding the default
206
+ // behavior of getting and setting a style property
207
+ cssHooks: {
208
+ opacity: {
209
+ get: function( elem, computed ) {
210
+ if ( computed ) {
211
+
212
+ // We should always get a number back from opacity
213
+ var ret = curCSS( elem, "opacity" );
214
+ return ret === "" ? "1" : ret;
215
+ }
216
+ }
217
+ }
218
+ },
219
+
220
+ // Don't automatically add "px" to these possibly-unitless properties
221
+ cssNumber: {
222
+ "columnCount": true,
223
+ "fillOpacity": true,
224
+ "flexGrow": true,
225
+ "flexShrink": true,
226
+ "fontWeight": true,
227
+ "lineHeight": true,
228
+ "opacity": true,
229
+ "order": true,
230
+ "orphans": true,
231
+ "widows": true,
232
+ "zIndex": true,
233
+ "zoom": true
234
+ },
235
+
236
+ // Add in properties whose names you wish to fix before
237
+ // setting or getting the value
238
+ cssProps: {
239
+ "float": "cssFloat"
240
+ },
241
+
242
+ // Get and set the style property on a DOM Node
243
+ style: function( elem, name, value, extra ) {
244
+
245
+ // Don't set styles on text and comment nodes
246
+ if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
247
+ return;
248
+ }
249
+
250
+ // Make sure that we're working with the right name
251
+ var ret, type, hooks,
252
+ origName = jQuery.camelCase( name ),
253
+ style = elem.style;
254
+
255
+ name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
256
+
257
+ // Gets hook for the prefixed version, then unprefixed version
258
+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
259
+
260
+ // Check if we're setting a value
261
+ if ( value !== undefined ) {
262
+ type = typeof value;
263
+
264
+ // Convert "+=" or "-=" to relative numbers (#7345)
265
+ if ( type === "string" && (ret = rrelNum.exec( value )) ) {
266
+ value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
267
+ // Fixes bug #9237
268
+ type = "number";
269
+ }
270
+
271
+ // Make sure that null and NaN values aren't set (#7116)
272
+ if ( value == null || value !== value ) {
273
+ return;
274
+ }
275
+
276
+ // If a number, add 'px' to the (except for certain CSS properties)
277
+ if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
278
+ value += "px";
279
+ }
280
+
281
+ // Support: IE9-11+
282
+ // background-* props affect original clone's values
283
+ if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
284
+ style[ name ] = "inherit";
285
+ }
286
+
287
+ // If a hook was provided, use that value, otherwise just set the specified value
288
+ if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
289
+ style[ name ] = value;
290
+ }
291
+
292
+ } else {
293
+ // If a hook was provided get the non-computed value from there
294
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
295
+ return ret;
296
+ }
297
+
298
+ // Otherwise just get the value from the style object
299
+ return style[ name ];
300
+ }
301
+ },
302
+
303
+ css: function( elem, name, extra, styles ) {
304
+ var val, num, hooks,
305
+ origName = jQuery.camelCase( name );
306
+
307
+ // Make sure that we're working with the right name
308
+ name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
309
+
310
+ // Try prefixed name followed by the unprefixed name
311
+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
312
+
313
+ // If a hook was provided get the computed value from there
314
+ if ( hooks && "get" in hooks ) {
315
+ val = hooks.get( elem, true, extra );
316
+ }
317
+
318
+ // Otherwise, if a way to get the computed value exists, use that
319
+ if ( val === undefined ) {
320
+ val = curCSS( elem, name, styles );
321
+ }
322
+
323
+ // Convert "normal" to computed value
324
+ if ( val === "normal" && name in cssNormalTransform ) {
325
+ val = cssNormalTransform[ name ];
326
+ }
327
+
328
+ // Make numeric if forced or a qualifier was provided and val looks numeric
329
+ if ( extra === "" || extra ) {
330
+ num = parseFloat( val );
331
+ return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
332
+ }
333
+ return val;
334
+ }
335
+ });
336
+
337
+ jQuery.each([ "height", "width" ], function( i, name ) {
338
+ jQuery.cssHooks[ name ] = {
339
+ get: function( elem, computed, extra ) {
340
+ if ( computed ) {
341
+
342
+ // Certain elements can have dimension info if we invisibly show them
343
+ // but it must have a current display style that would benefit
344
+ return rdisplayswap.test( jQuery.css( elem, "display" ) ) && elem.offsetWidth === 0 ?
345
+ jQuery.swap( elem, cssShow, function() {
346
+ return getWidthOrHeight( elem, name, extra );
347
+ }) :
348
+ getWidthOrHeight( elem, name, extra );
349
+ }
350
+ },
351
+
352
+ set: function( elem, value, extra ) {
353
+ var styles = extra && getStyles( elem );
354
+ return setPositiveNumber( elem, value, extra ?
355
+ augmentWidthOrHeight(
356
+ elem,
357
+ name,
358
+ extra,
359
+ jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
360
+ styles
361
+ ) : 0
362
+ );
363
+ }
364
+ };
365
+ });
366
+
367
+ // Support: Android 2.3
368
+ jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
369
+ function( elem, computed ) {
370
+ if ( computed ) {
371
+ return jQuery.swap( elem, { "display": "inline-block" },
372
+ curCSS, [ elem, "marginRight" ] );
373
+ }
374
+ }
375
+ );
376
+
377
+ // These hooks are used by animate to expand properties
378
+ jQuery.each({
379
+ margin: "",
380
+ padding: "",
381
+ border: "Width"
382
+ }, function( prefix, suffix ) {
383
+ jQuery.cssHooks[ prefix + suffix ] = {
384
+ expand: function( value ) {
385
+ var i = 0,
386
+ expanded = {},
387
+
388
+ // Assumes a single number if not a string
389
+ parts = typeof value === "string" ? value.split(" ") : [ value ];
390
+
391
+ for ( ; i < 4; i++ ) {
392
+ expanded[ prefix + cssExpand[ i ] + suffix ] =
393
+ parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
394
+ }
395
+
396
+ return expanded;
397
+ }
398
+ };
399
+
400
+ if ( !rmargin.test( prefix ) ) {
401
+ jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
402
+ }
403
+ });
404
+
405
+ jQuery.fn.extend({
406
+ css: function( name, value ) {
407
+ return access( this, function( elem, name, value ) {
408
+ var styles, len,
409
+ map = {},
410
+ i = 0;
411
+
412
+ if ( jQuery.isArray( name ) ) {
413
+ styles = getStyles( elem );
414
+ len = name.length;
415
+
416
+ for ( ; i < len; i++ ) {
417
+ map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
418
+ }
419
+
420
+ return map;
421
+ }
422
+
423
+ return value !== undefined ?
424
+ jQuery.style( elem, name, value ) :
425
+ jQuery.css( elem, name );
426
+ }, name, value, arguments.length > 1 );
427
+ },
428
+ show: function() {
429
+ return showHide( this, true );
430
+ },
431
+ hide: function() {
432
+ return showHide( this );
433
+ },
434
+ toggle: function( state ) {
435
+ if ( typeof state === "boolean" ) {
436
+ return state ? this.show() : this.hide();
437
+ }
438
+
439
+ return this.each(function() {
440
+ if ( isHidden( this ) ) {
441
+ jQuery( this ).show();
442
+ } else {
443
+ jQuery( this ).hide();
444
+ }
445
+ });
446
+ }
447
+ });
448
+
449
+ return jQuery;
450
+ });