신수용

changed directory name

Showing 455 changed files with 3331 additions and 3331 deletions
1 -var path = require('path');
2 -
3 -module.exports = {
4 - includePaths: [
5 - path.join(__dirname, 'app/assets/stylesheets')
6 - ]
7 -};
1 -// Fixed Width Icons
2 -// -------------------------
3 -.@{fa-css-prefix}-fw {
4 - width: (18em / 14);
5 - text-align: center;
6 -}
1 -// Fixed Width Icons
2 -// -------------------------
3 -.#{$fa-css-prefix}-fw {
4 - width: (18em / 14);
5 - text-align: center;
6 -}
1 -// Mixins
2 -// --------------------------
3 -
4 -@mixin fa-icon() {
5 - display: inline-block;
6 - font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration
7 - font-size: inherit; // can't have font-size inherit on line above, so need to override
8 - text-rendering: auto; // optimizelegibility throws things off #1094
9 - -webkit-font-smoothing: antialiased;
10 - -moz-osx-font-smoothing: grayscale;
11 -
12 -}
13 -
14 -@mixin fa-icon-rotate($degrees, $rotation) {
15 - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation});
16 - -webkit-transform: rotate($degrees);
17 - -ms-transform: rotate($degrees);
18 - transform: rotate($degrees);
19 -}
20 -
21 -@mixin fa-icon-flip($horiz, $vert, $rotation) {
22 - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation});
23 - -webkit-transform: scale($horiz, $vert);
24 - -ms-transform: scale($horiz, $vert);
25 - transform: scale($horiz, $vert);
26 -}
1 -{
2 - "name": "jquery",
3 - "version": "2.1.4",
4 - "main": "dist/jquery.js",
5 - "license": "MIT",
6 - "ignore": [
7 - "**/.*",
8 - "build",
9 - "dist/cdn",
10 - "speed",
11 - "test",
12 - "*.md",
13 - "AUTHORS.txt",
14 - "Gruntfile.js",
15 - "package.json"
16 - ],
17 - "devDependencies": {
18 - "sizzle": "2.1.1-jquery.2.1.2",
19 - "requirejs": "2.1.10",
20 - "qunit": "1.14.0",
21 - "sinon": "1.8.1"
22 - },
23 - "keywords": [
24 - "jquery",
25 - "javascript",
26 - "library"
27 - ],
28 - "homepage": "https://github.com/jquery/jquery",
29 - "_release": "2.1.4",
30 - "_resolution": {
31 - "type": "version",
32 - "tag": "2.1.4",
33 - "commit": "7751e69b615c6eca6f783a81e292a55725af6b85"
34 - },
35 - "_source": "git://github.com/jquery/jquery.git",
36 - "_target": ">= 1.9.1",
37 - "_originalSource": "jquery"
38 -}
...\ No newline at end of file ...\ No newline at end of file
1 -Copyright 2014 jQuery Foundation and other contributors
2 -http://jquery.com/
3 -
4 -Permission is hereby granted, free of charge, to any person obtaining
5 -a copy of this software and associated documentation files (the
6 -"Software"), to deal in the Software without restriction, including
7 -without limitation the rights to use, copy, modify, merge, publish,
8 -distribute, sublicense, and/or sell copies of the Software, and to
9 -permit persons to whom the Software is furnished to do so, subject to
10 -the following conditions:
11 -
12 -The above copyright notice and this permission notice shall be
13 -included in all copies or substantial portions of the Software.
14 -
15 -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18 -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19 -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20 -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21 -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1 -define([
2 - "../core",
3 - "../core/parseHTML",
4 - "../ajax",
5 - "../traversing",
6 - "../manipulation",
7 - "../selector",
8 - // Optional event/alias dependency
9 - "../event/alias"
10 -], function( jQuery ) {
11 -
12 -// Keep a copy of the old load method
13 -var _load = jQuery.fn.load;
14 -
15 -/**
16 - * Load a url into a page
17 - */
18 -jQuery.fn.load = function( url, params, callback ) {
19 - if ( typeof url !== "string" && _load ) {
20 - return _load.apply( this, arguments );
21 - }
22 -
23 - var selector, type, response,
24 - self = this,
25 - off = url.indexOf(" ");
26 -
27 - if ( off >= 0 ) {
28 - selector = jQuery.trim( url.slice( off ) );
29 - url = url.slice( 0, off );
30 - }
31 -
32 - // If it's a function
33 - if ( jQuery.isFunction( params ) ) {
34 -
35 - // We assume that it's the callback
36 - callback = params;
37 - params = undefined;
38 -
39 - // Otherwise, build a param string
40 - } else if ( params && typeof params === "object" ) {
41 - type = "POST";
42 - }
43 -
44 - // If we have elements to modify, make the request
45 - if ( self.length > 0 ) {
46 - jQuery.ajax({
47 - url: url,
48 -
49 - // if "type" variable is undefined, then "GET" method will be used
50 - type: type,
51 - dataType: "html",
52 - data: params
53 - }).done(function( responseText ) {
54 -
55 - // Save response for use in complete callback
56 - response = arguments;
57 -
58 - self.html( selector ?
59 -
60 - // If a selector was specified, locate the right elements in a dummy div
61 - // Exclude scripts to avoid IE 'Permission Denied' errors
62 - jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
63 -
64 - // Otherwise use the full result
65 - responseText );
66 -
67 - }).complete( callback && function( jqXHR, status ) {
68 - self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
69 - });
70 - }
71 -
72 - return this;
73 -};
74 -
75 -});
1 -define([
2 - "../core",
3 - "../ajax"
4 -], function( jQuery ) {
5 -
6 -// Install script dataType
7 -jQuery.ajaxSetup({
8 - accepts: {
9 - script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
10 - },
11 - contents: {
12 - script: /(?:java|ecma)script/
13 - },
14 - converters: {
15 - "text script": function( text ) {
16 - jQuery.globalEval( text );
17 - return text;
18 - }
19 - }
20 -});
21 -
22 -// Handle cache's special case and crossDomain
23 -jQuery.ajaxPrefilter( "script", function( s ) {
24 - if ( s.cache === undefined ) {
25 - s.cache = false;
26 - }
27 - if ( s.crossDomain ) {
28 - s.type = "GET";
29 - }
30 -});
31 -
32 -// Bind script tag hack transport
33 -jQuery.ajaxTransport( "script", function( s ) {
34 - // This transport only deals with cross domain requests
35 - if ( s.crossDomain ) {
36 - var script, callback;
37 - return {
38 - send: function( _, complete ) {
39 - script = jQuery("<script>").prop({
40 - async: true,
41 - charset: s.scriptCharset,
42 - src: s.url
43 - }).on(
44 - "load error",
45 - callback = function( evt ) {
46 - script.remove();
47 - callback = null;
48 - if ( evt ) {
49 - complete( evt.type === "error" ? 404 : 200, evt.type );
50 - }
51 - }
52 - );
53 - document.head.appendChild( script[ 0 ] );
54 - },
55 - abort: function() {
56 - if ( callback ) {
57 - callback();
58 - }
59 - }
60 - };
61 - }
62 -});
63 -
64 -});
1 -define([
2 - "../../core"
3 -], function( jQuery ) {
4 - return jQuery.now();
5 -});
1 -define([
2 - "../core",
3 - "../core/access",
4 - "./support"
5 -], function( jQuery, access, support ) {
6 -
7 -var rfocusable = /^(?:input|select|textarea|button)$/i;
8 -
9 -jQuery.fn.extend({
10 - prop: function( name, value ) {
11 - return access( this, jQuery.prop, name, value, arguments.length > 1 );
12 - },
13 -
14 - removeProp: function( name ) {
15 - return this.each(function() {
16 - delete this[ jQuery.propFix[ name ] || name ];
17 - });
18 - }
19 -});
20 -
21 -jQuery.extend({
22 - propFix: {
23 - "for": "htmlFor",
24 - "class": "className"
25 - },
26 -
27 - prop: function( elem, name, value ) {
28 - var ret, hooks, notxml,
29 - nType = elem.nodeType;
30 -
31 - // Don't get/set properties on text, comment and attribute nodes
32 - if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
33 - return;
34 - }
35 -
36 - notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
37 -
38 - if ( notxml ) {
39 - // Fix name and attach hooks
40 - name = jQuery.propFix[ name ] || name;
41 - hooks = jQuery.propHooks[ name ];
42 - }
43 -
44 - if ( value !== undefined ) {
45 - return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
46 - ret :
47 - ( elem[ name ] = value );
48 -
49 - } else {
50 - return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
51 - ret :
52 - elem[ name ];
53 - }
54 - },
55 -
56 - propHooks: {
57 - tabIndex: {
58 - get: function( elem ) {
59 - return elem.hasAttribute( "tabindex" ) || rfocusable.test( elem.nodeName ) || elem.href ?
60 - elem.tabIndex :
61 - -1;
62 - }
63 - }
64 - }
65 -});
66 -
67 -if ( !support.optSelected ) {
68 - jQuery.propHooks.selected = {
69 - get: function( elem ) {
70 - var parent = elem.parentNode;
71 - if ( parent && parent.parentNode ) {
72 - parent.parentNode.selectedIndex;
73 - }
74 - return null;
75 - }
76 - };
77 -}
78 -
79 -jQuery.each([
80 - "tabIndex",
81 - "readOnly",
82 - "maxLength",
83 - "cellSpacing",
84 - "cellPadding",
85 - "rowSpan",
86 - "colSpan",
87 - "useMap",
88 - "frameBorder",
89 - "contentEditable"
90 -], function() {
91 - jQuery.propFix[ this.toLowerCase() ] = this;
92 -});
93 -
94 -});
1 -define([
2 - "../var/support"
3 -], function( support ) {
4 -
5 -(function() {
6 - var input = document.createElement( "input" ),
7 - select = document.createElement( "select" ),
8 - opt = select.appendChild( document.createElement( "option" ) );
9 -
10 - input.type = "checkbox";
11 -
12 - // Support: iOS<=5.1, Android<=4.2+
13 - // Default value for a checkbox should be "on"
14 - support.checkOn = input.value !== "";
15 -
16 - // Support: IE<=11+
17 - // Must access selectedIndex to make default options select
18 - support.optSelected = opt.selected;
19 -
20 - // Support: Android<=2.3
21 - // Options inside disabled selects are incorrectly marked as disabled
22 - select.disabled = true;
23 - support.optDisabled = !opt.disabled;
24 -
25 - // Support: IE<=11+
26 - // An input loses its value after becoming a radio
27 - input = document.createElement( "input" );
28 - input.value = "t";
29 - input.type = "radio";
30 - support.radioValue = input.value === "t";
31 -})();
32 -
33 -return support;
34 -
35 -});
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 -});
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 -});
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 -});
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 -});
1 -define(function() {
2 - // Match a standalone tag
3 - return (/^<(\w+)\s*\/?>(?:<\/\1>|)$/);
4 -});
1 -define(function() {
2 -
3 -function addGetHookIf( conditionFn, hookFn ) {
4 - // Define the hook, we'll check on the first run if it's really needed.
5 - return {
6 - get: function() {
7 - if ( conditionFn() ) {
8 - // Hook not needed (or it's not possible to use it due
9 - // to missing dependency), remove it.
10 - delete this.get;
11 - return;
12 - }
13 -
14 - // Hook needed; redefine it so that the support test is not executed again.
15 - return (this.get = hookFn).apply( this, arguments );
16 - }
17 - };
18 -}
19 -
20 -return addGetHookIf;
21 -
22 -});
1 -define([
2 - "../core",
3 - "./var/rnumnonpx",
4 - "./var/rmargin",
5 - "./var/getStyles",
6 - "../selector" // contains
7 -], function( jQuery, rnumnonpx, rmargin, getStyles ) {
8 -
9 -function curCSS( elem, name, computed ) {
10 - var width, minWidth, maxWidth, ret,
11 - style = elem.style;
12 -
13 - computed = computed || getStyles( elem );
14 -
15 - // Support: IE9
16 - // getPropertyValue is only needed for .css('filter') (#12537)
17 - if ( computed ) {
18 - ret = computed.getPropertyValue( name ) || computed[ name ];
19 - }
20 -
21 - if ( computed ) {
22 -
23 - if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
24 - ret = jQuery.style( elem, name );
25 - }
26 -
27 - // Support: iOS < 6
28 - // A tribute to the "awesome hack by Dean Edwards"
29 - // iOS < 6 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
30 - // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
31 - if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
32 -
33 - // Remember the original values
34 - width = style.width;
35 - minWidth = style.minWidth;
36 - maxWidth = style.maxWidth;
37 -
38 - // Put in the new values to get a computed value out
39 - style.minWidth = style.maxWidth = style.width = ret;
40 - ret = computed.width;
41 -
42 - // Revert the changed values
43 - style.width = width;
44 - style.minWidth = minWidth;
45 - style.maxWidth = maxWidth;
46 - }
47 - }
48 -
49 - return ret !== undefined ?
50 - // Support: IE
51 - // IE returns zIndex value as an integer.
52 - ret + "" :
53 - ret;
54 -}
55 -
56 -return curCSS;
57 -});
1 -define([
2 - "../core",
3 - "../manipulation" // appendTo
4 -], function( jQuery ) {
5 -
6 -var iframe,
7 - elemdisplay = {};
8 -
9 -/**
10 - * Retrieve the actual display of a element
11 - * @param {String} name nodeName of the element
12 - * @param {Object} doc Document object
13 - */
14 -// Called only from within defaultDisplay
15 -function actualDisplay( name, doc ) {
16 - var style,
17 - elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
18 -
19 - // getDefaultComputedStyle might be reliably used only on attached element
20 - display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ?
21 -
22 - // Use of this method is a temporary fix (more like optimization) until something better comes along,
23 - // since it was removed from specification and supported only in FF
24 - style.display : jQuery.css( elem[ 0 ], "display" );
25 -
26 - // We don't have any data stored on the element,
27 - // so use "detach" method as fast way to get rid of the element
28 - elem.detach();
29 -
30 - return display;
31 -}
32 -
33 -/**
34 - * Try to determine the default display value of an element
35 - * @param {String} nodeName
36 - */
37 -function defaultDisplay( nodeName ) {
38 - var doc = document,
39 - display = elemdisplay[ nodeName ];
40 -
41 - if ( !display ) {
42 - display = actualDisplay( nodeName, doc );
43 -
44 - // If the simple way fails, read from inside an iframe
45 - if ( display === "none" || !display ) {
46 -
47 - // Use the already-created iframe if possible
48 - iframe = (iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" )).appendTo( doc.documentElement );
49 -
50 - // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
51 - doc = iframe[ 0 ].contentDocument;
52 -
53 - // Support: IE
54 - doc.write();
55 - doc.close();
56 -
57 - display = actualDisplay( nodeName, doc );
58 - iframe.detach();
59 - }
60 -
61 - // Store the correct default display
62 - elemdisplay[ nodeName ] = display;
63 - }
64 -
65 - return display;
66 -}
67 -
68 -return defaultDisplay;
69 -
70 -});
1 -define([
2 - "../core",
3 - "../var/support"
4 -], function( jQuery, support ) {
5 -
6 -(function() {
7 - var pixelPositionVal, boxSizingReliableVal,
8 - docElem = document.documentElement,
9 - container = document.createElement( "div" ),
10 - div = document.createElement( "div" );
11 -
12 - if ( !div.style ) {
13 - return;
14 - }
15 -
16 - // Support: IE9-11+
17 - // Style of cloned element affects source element cloned (#8908)
18 - div.style.backgroundClip = "content-box";
19 - div.cloneNode( true ).style.backgroundClip = "";
20 - support.clearCloneStyle = div.style.backgroundClip === "content-box";
21 -
22 - container.style.cssText = "border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;" +
23 - "position:absolute";
24 - container.appendChild( div );
25 -
26 - // Executing both pixelPosition & boxSizingReliable tests require only one layout
27 - // so they're executed at the same time to save the second computation.
28 - function computePixelPositionAndBoxSizingReliable() {
29 - div.style.cssText =
30 - // Support: Firefox<29, Android 2.3
31 - // Vendor-prefix box-sizing
32 - "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;" +
33 - "box-sizing:border-box;display:block;margin-top:1%;top:1%;" +
34 - "border:1px;padding:1px;width:4px;position:absolute";
35 - div.innerHTML = "";
36 - docElem.appendChild( container );
37 -
38 - var divStyle = window.getComputedStyle( div, null );
39 - pixelPositionVal = divStyle.top !== "1%";
40 - boxSizingReliableVal = divStyle.width === "4px";
41 -
42 - docElem.removeChild( container );
43 - }
44 -
45 - // Support: node.js jsdom
46 - // Don't assume that getComputedStyle is a property of the global object
47 - if ( window.getComputedStyle ) {
48 - jQuery.extend( support, {
49 - pixelPosition: function() {
50 -
51 - // This test is executed only once but we still do memoizing
52 - // since we can use the boxSizingReliable pre-computing.
53 - // No need to check if the test was already performed, though.
54 - computePixelPositionAndBoxSizingReliable();
55 - return pixelPositionVal;
56 - },
57 - boxSizingReliable: function() {
58 - if ( boxSizingReliableVal == null ) {
59 - computePixelPositionAndBoxSizingReliable();
60 - }
61 - return boxSizingReliableVal;
62 - },
63 - reliableMarginRight: function() {
64 -
65 - // Support: Android 2.3
66 - // Check if div with explicit width and no margin-right incorrectly
67 - // gets computed margin-right based on width of container. (#3333)
68 - // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
69 - // This support function is only executed once so no memoizing is needed.
70 - var ret,
71 - marginDiv = div.appendChild( document.createElement( "div" ) );
72 -
73 - // Reset CSS: box-sizing; display; margin; border; padding
74 - marginDiv.style.cssText = div.style.cssText =
75 - // Support: Firefox<29, Android 2.3
76 - // Vendor-prefix box-sizing
77 - "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
78 - "box-sizing:content-box;display:block;margin:0;border:0;padding:0";
79 - marginDiv.style.marginRight = marginDiv.style.width = "0";
80 - div.style.width = "1px";
81 - docElem.appendChild( container );
82 -
83 - ret = !parseFloat( window.getComputedStyle( marginDiv, null ).marginRight );
84 -
85 - docElem.removeChild( container );
86 - div.removeChild( marginDiv );
87 -
88 - return ret;
89 - }
90 - });
91 - }
92 -})();
93 -
94 -return support;
95 -
96 -});
1 -define([
2 - "../core"
3 -], function( jQuery ) {
4 -
5 -// A method for quickly swapping in/out CSS properties to get correct calculations.
6 -jQuery.swap = function( elem, options, callback, args ) {
7 - var ret, name,
8 - old = {};
9 -
10 - // Remember the old values, and insert the new ones
11 - for ( name in options ) {
12 - old[ name ] = elem.style[ name ];
13 - elem.style[ name ] = options[ name ];
14 - }
15 -
16 - ret = callback.apply( elem, args || [] );
17 -
18 - // Revert the old values
19 - for ( name in options ) {
20 - elem.style[ name ] = old[ name ];
21 - }
22 -
23 - return ret;
24 -};
25 -
26 -return jQuery.swap;
27 -
28 -});
1 -define(function() {
2 - return [ "Top", "Right", "Bottom", "Left" ];
3 -});
1 -define(function() {
2 - return function( elem ) {
3 - // Support: IE<=11+, Firefox<=30+ (#15098, #14150)
4 - // IE throws on elements created in popups
5 - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
6 - if ( elem.ownerDocument.defaultView.opener ) {
7 - return elem.ownerDocument.defaultView.getComputedStyle( elem, null );
8 - }
9 -
10 - return window.getComputedStyle( elem, null );
11 - };
12 -});
1 -define([
2 - "../../core",
3 - "../../selector"
4 - // css is assumed
5 -], function( jQuery ) {
6 -
7 - return function( elem, el ) {
8 - // isHidden might be called from jQuery#filter function;
9 - // in that case, element will be second argument
10 - elem = el || elem;
11 - return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
12 - };
13 -});
1 -define(function() {
2 - return (/^margin/);
3 -});
1 -define([
2 - "../../var/pnum"
3 -], function( pnum ) {
4 - return new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
5 -});
1 -define([
2 - "../core"
3 -], function( jQuery ) {
4 -
5 -/**
6 - * Determines whether an object can have data
7 - */
8 -jQuery.acceptData = function( owner ) {
9 - // Accepts only:
10 - // - Node
11 - // - Node.ELEMENT_NODE
12 - // - Node.DOCUMENT_NODE
13 - // - Object
14 - // - Any
15 - /* jshint -W018 */
16 - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
17 -};
18 -
19 -return jQuery.acceptData;
20 -});
1 -define([
2 - "../Data"
3 -], function( Data ) {
4 - return new Data();
5 -});
1 -define([
2 - "../Data"
3 -], function( Data ) {
4 - return new Data();
5 -});
1 -define([
2 - "./core",
3 - "./core/access",
4 - "./css"
5 -], function( jQuery, access ) {
6 -
7 -// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
8 -jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
9 - jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
10 - // Margin is only for outerHeight, outerWidth
11 - jQuery.fn[ funcName ] = function( margin, value ) {
12 - var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
13 - extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
14 -
15 - return access( this, function( elem, type, value ) {
16 - var doc;
17 -
18 - if ( jQuery.isWindow( elem ) ) {
19 - // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
20 - // isn't a whole lot we can do. See pull request at this URL for discussion:
21 - // https://github.com/jquery/jquery/pull/764
22 - return elem.document.documentElement[ "client" + name ];
23 - }
24 -
25 - // Get document width or height
26 - if ( elem.nodeType === 9 ) {
27 - doc = elem.documentElement;
28 -
29 - // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
30 - // whichever is greatest
31 - return Math.max(
32 - elem.body[ "scroll" + name ], doc[ "scroll" + name ],
33 - elem.body[ "offset" + name ], doc[ "offset" + name ],
34 - doc[ "client" + name ]
35 - );
36 - }
37 -
38 - return value === undefined ?
39 - // Get width or height on the element, requesting but not forcing parseFloat
40 - jQuery.css( elem, type, extra ) :
41 -
42 - // Set width or height on the element
43 - jQuery.style( elem, type, value, extra );
44 - }, type, chainable ? margin : undefined, chainable, null );
45 - };
46 - });
47 -});
48 -
49 -return jQuery;
50 -});
1 -define([
2 - "../core",
3 - "../css"
4 -], function( jQuery ) {
5 -
6 -function Tween( elem, options, prop, end, easing ) {
7 - return new Tween.prototype.init( elem, options, prop, end, easing );
8 -}
9 -jQuery.Tween = Tween;
10 -
11 -Tween.prototype = {
12 - constructor: Tween,
13 - init: function( elem, options, prop, end, easing, unit ) {
14 - this.elem = elem;
15 - this.prop = prop;
16 - this.easing = easing || "swing";
17 - this.options = options;
18 - this.start = this.now = this.cur();
19 - this.end = end;
20 - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
21 - },
22 - cur: function() {
23 - var hooks = Tween.propHooks[ this.prop ];
24 -
25 - return hooks && hooks.get ?
26 - hooks.get( this ) :
27 - Tween.propHooks._default.get( this );
28 - },
29 - run: function( percent ) {
30 - var eased,
31 - hooks = Tween.propHooks[ this.prop ];
32 -
33 - if ( this.options.duration ) {
34 - this.pos = eased = jQuery.easing[ this.easing ](
35 - percent, this.options.duration * percent, 0, 1, this.options.duration
36 - );
37 - } else {
38 - this.pos = eased = percent;
39 - }
40 - this.now = ( this.end - this.start ) * eased + this.start;
41 -
42 - if ( this.options.step ) {
43 - this.options.step.call( this.elem, this.now, this );
44 - }
45 -
46 - if ( hooks && hooks.set ) {
47 - hooks.set( this );
48 - } else {
49 - Tween.propHooks._default.set( this );
50 - }
51 - return this;
52 - }
53 -};
54 -
55 -Tween.prototype.init.prototype = Tween.prototype;
56 -
57 -Tween.propHooks = {
58 - _default: {
59 - get: function( tween ) {
60 - var result;
61 -
62 - if ( tween.elem[ tween.prop ] != null &&
63 - (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
64 - return tween.elem[ tween.prop ];
65 - }
66 -
67 - // Passing an empty string as a 3rd parameter to .css will automatically
68 - // attempt a parseFloat and fallback to a string if the parse fails.
69 - // Simple values such as "10px" are parsed to Float;
70 - // complex values such as "rotate(1rad)" are returned as-is.
71 - result = jQuery.css( tween.elem, tween.prop, "" );
72 - // Empty strings, null, undefined and "auto" are converted to 0.
73 - return !result || result === "auto" ? 0 : result;
74 - },
75 - set: function( tween ) {
76 - // Use step hook for back compat.
77 - // Use cssHook if its there.
78 - // Use .style if available and use plain properties where available.
79 - if ( jQuery.fx.step[ tween.prop ] ) {
80 - jQuery.fx.step[ tween.prop ]( tween );
81 - } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
82 - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
83 - } else {
84 - tween.elem[ tween.prop ] = tween.now;
85 - }
86 - }
87 - }
88 -};
89 -
90 -// Support: IE9
91 -// Panic based approach to setting things on disconnected nodes
92 -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
93 - set: function( tween ) {
94 - if ( tween.elem.nodeType && tween.elem.parentNode ) {
95 - tween.elem[ tween.prop ] = tween.now;
96 - }
97 - }
98 -};
99 -
100 -jQuery.easing = {
101 - linear: function( p ) {
102 - return p;
103 - },
104 - swing: function( p ) {
105 - return 0.5 - Math.cos( p * Math.PI ) / 2;
106 - }
107 -};
108 -
109 -jQuery.fx = Tween.prototype.init;
110 -
111 -// Back Compat <1.8 extension point
112 -jQuery.fx.step = {};
113 -
114 -});
1 -define([
2 - "../core",
3 - "../event"
4 -], function( jQuery ) {
5 -
6 -// Attach a bunch of functions for handling common AJAX events
7 -jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ) {
8 - jQuery.fn[ type ] = function( fn ) {
9 - return this.on( type, fn );
10 - };
11 -});
12 -
13 -});
1 -define([
2 - "../core",
3 - "../event"
4 -], function( jQuery ) {
5 -
6 -jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
7 - "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
8 - "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
9 -
10 - // Handle event binding
11 - jQuery.fn[ name ] = function( data, fn ) {
12 - return arguments.length > 0 ?
13 - this.on( name, null, data, fn ) :
14 - this.trigger( name );
15 - };
16 -});
17 -
18 -jQuery.fn.extend({
19 - hover: function( fnOver, fnOut ) {
20 - return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
21 - },
22 -
23 - bind: function( types, data, fn ) {
24 - return this.on( types, null, data, fn );
25 - },
26 - unbind: function( types, fn ) {
27 - return this.off( types, null, fn );
28 - },
29 -
30 - delegate: function( selector, types, data, fn ) {
31 - return this.on( types, selector, data, fn );
32 - },
33 - undelegate: function( selector, types, fn ) {
34 - // ( namespace ) or ( selector, types [, fn] )
35 - return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
36 - }
37 -});
38 -
39 -});
1 -define([
2 - "../var/support"
3 -], function( support ) {
4 -
5 -support.focusinBubbles = "onfocusin" in window;
6 -
7 -return support;
8 -
9 -});
1 -define([
2 - "../core"
3 -], function( jQuery ) {
4 -
5 -// Register as a named AMD module, since jQuery can be concatenated with other
6 -// files that may use define, but not via a proper concatenation script that
7 -// understands anonymous AMD modules. A named AMD is safest and most robust
8 -// way to register. Lowercase jquery is used because AMD module names are
9 -// derived from file names, and jQuery is normally delivered in a lowercase
10 -// file name. Do this after creating the global so that if an AMD module wants
11 -// to call noConflict to hide this version of jQuery, it will work.
12 -
13 -// Note that for maximum portability, libraries that are not jQuery should
14 -// declare themselves as anonymous modules, and avoid setting a global if an
15 -// AMD loader is present. jQuery is a special case. For more information, see
16 -// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
17 -
18 -if ( typeof define === "function" && define.amd ) {
19 - define( "jquery", [], function() {
20 - return jQuery;
21 - });
22 -}
23 -
24 -});
1 -define([
2 - "../core",
3 - "../var/strundefined"
4 -], function( jQuery, strundefined ) {
5 -
6 -var
7 - // Map over jQuery in case of overwrite
8 - _jQuery = window.jQuery,
9 -
10 - // Map over the $ in case of overwrite
11 - _$ = window.$;
12 -
13 -jQuery.noConflict = function( deep ) {
14 - if ( window.$ === jQuery ) {
15 - window.$ = _$;
16 - }
17 -
18 - if ( deep && window.jQuery === jQuery ) {
19 - window.jQuery = _jQuery;
20 - }
21 -
22 - return jQuery;
23 -};
24 -
25 -// Expose jQuery and $ identifiers, even in AMD
26 -// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
27 -// and CommonJS for browser emulators (#13566)
28 -if ( typeof noGlobal === strundefined ) {
29 - window.jQuery = window.$ = jQuery;
30 -}
31 -
32 -});
1 -/*!
2 - * jQuery JavaScript Library v@VERSION
3 - * http://jquery.com/
4 - *
5 - * Includes Sizzle.js
6 - * http://sizzlejs.com/
7 - *
8 - * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors
9 - * Released under the MIT license
10 - * http://jquery.org/license
11 - *
12 - * Date: @DATE
13 - */
14 -
15 -(function( global, factory ) {
16 -
17 - if ( typeof module === "object" && typeof module.exports === "object" ) {
18 - // For CommonJS and CommonJS-like environments where a proper `window`
19 - // is present, execute the factory and get jQuery.
20 - // For environments that do not have a `window` with a `document`
21 - // (such as Node.js), expose a factory as module.exports.
22 - // This accentuates the need for the creation of a real `window`.
23 - // e.g. var jQuery = require("jquery")(window);
24 - // See ticket #14549 for more info.
25 - module.exports = global.document ?
26 - factory( global, true ) :
27 - function( w ) {
28 - if ( !w.document ) {
29 - throw new Error( "jQuery requires a window with a document" );
30 - }
31 - return factory( w );
32 - };
33 - } else {
34 - factory( global );
35 - }
36 -
37 -// Pass this if window is not defined yet
38 -}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
39 -
40 -// Support: Firefox 18+
41 -// Can't be in strict mode, several libs including ASP.NET trace
42 -// the stack via arguments.caller.callee and Firefox dies if
43 -// you try to trace through "use strict" call chains. (#13335)
44 -//"use strict";
1 -define([
2 - "./core",
3 - "./selector",
4 - "./traversing",
5 - "./callbacks",
6 - "./deferred",
7 - "./core/ready",
8 - "./data",
9 - "./queue",
10 - "./queue/delay",
11 - "./attributes",
12 - "./event",
13 - "./event/alias",
14 - "./manipulation",
15 - "./manipulation/_evalUrl",
16 - "./wrap",
17 - "./css",
18 - "./css/hiddenVisibleSelectors",
19 - "./serialize",
20 - "./ajax",
21 - "./ajax/xhr",
22 - "./ajax/script",
23 - "./ajax/jsonp",
24 - "./ajax/load",
25 - "./event/ajax",
26 - "./effects",
27 - "./effects/animatedSelector",
28 - "./offset",
29 - "./dimensions",
30 - "./deprecated",
31 - "./exports/amd",
32 - "./exports/global"
33 -], function( jQuery ) {
34 -
35 -return jQuery;
36 -
37 -});
1 -define([
2 - "../ajax"
3 -], function( jQuery ) {
4 -
5 -jQuery._evalUrl = function( url ) {
6 - return jQuery.ajax({
7 - url: url,
8 - type: "GET",
9 - dataType: "script",
10 - async: false,
11 - global: false,
12 - "throws": true
13 - });
14 -};
15 -
16 -return jQuery._evalUrl;
17 -
18 -});
1 -define([
2 - "../var/support"
3 -], function( support ) {
4 -
5 -(function() {
6 - var fragment = document.createDocumentFragment(),
7 - div = fragment.appendChild( document.createElement( "div" ) ),
8 - input = document.createElement( "input" );
9 -
10 - // Support: Safari<=5.1
11 - // Check state lost if the name is set (#11217)
12 - // Support: Windows Web Apps (WWA)
13 - // `name` and `type` must use .setAttribute for WWA (#14901)
14 - input.setAttribute( "type", "radio" );
15 - input.setAttribute( "checked", "checked" );
16 - input.setAttribute( "name", "t" );
17 -
18 - div.appendChild( input );
19 -
20 - // Support: Safari<=5.1, Android<4.2
21 - // Older WebKit doesn't clone checked state correctly in fragments
22 - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
23 -
24 - // Support: IE<=11+
25 - // Make sure textarea (and checkbox) defaultValue is properly cloned
26 - div.innerHTML = "<textarea>x</textarea>";
27 - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
28 -})();
29 -
30 -return support;
31 -
32 -});
1 -define(function() {
2 - return (/^(?:checkbox|radio)$/i);
3 -});
1 -define([
2 - "./core",
3 - "./data/var/data_priv",
4 - "./deferred",
5 - "./callbacks"
6 -], function( jQuery, data_priv ) {
7 -
8 -jQuery.extend({
9 - queue: function( elem, type, data ) {
10 - var queue;
11 -
12 - if ( elem ) {
13 - type = ( type || "fx" ) + "queue";
14 - queue = data_priv.get( elem, type );
15 -
16 - // Speed up dequeue by getting out quickly if this is just a lookup
17 - if ( data ) {
18 - if ( !queue || jQuery.isArray( data ) ) {
19 - queue = data_priv.access( elem, type, jQuery.makeArray(data) );
20 - } else {
21 - queue.push( data );
22 - }
23 - }
24 - return queue || [];
25 - }
26 - },
27 -
28 - dequeue: function( elem, type ) {
29 - type = type || "fx";
30 -
31 - var queue = jQuery.queue( elem, type ),
32 - startLength = queue.length,
33 - fn = queue.shift(),
34 - hooks = jQuery._queueHooks( elem, type ),
35 - next = function() {
36 - jQuery.dequeue( elem, type );
37 - };
38 -
39 - // If the fx queue is dequeued, always remove the progress sentinel
40 - if ( fn === "inprogress" ) {
41 - fn = queue.shift();
42 - startLength--;
43 - }
44 -
45 - if ( fn ) {
46 -
47 - // Add a progress sentinel to prevent the fx queue from being
48 - // automatically dequeued
49 - if ( type === "fx" ) {
50 - queue.unshift( "inprogress" );
51 - }
52 -
53 - // Clear up the last queue stop function
54 - delete hooks.stop;
55 - fn.call( elem, next, hooks );
56 - }
57 -
58 - if ( !startLength && hooks ) {
59 - hooks.empty.fire();
60 - }
61 - },
62 -
63 - // Not public - generate a queueHooks object, or return the current one
64 - _queueHooks: function( elem, type ) {
65 - var key = type + "queueHooks";
66 - return data_priv.get( elem, key ) || data_priv.access( elem, key, {
67 - empty: jQuery.Callbacks("once memory").add(function() {
68 - data_priv.remove( elem, [ type + "queue", key ] );
69 - })
70 - });
71 - }
72 -});
73 -
74 -jQuery.fn.extend({
75 - queue: function( type, data ) {
76 - var setter = 2;
77 -
78 - if ( typeof type !== "string" ) {
79 - data = type;
80 - type = "fx";
81 - setter--;
82 - }
83 -
84 - if ( arguments.length < setter ) {
85 - return jQuery.queue( this[0], type );
86 - }
87 -
88 - return data === undefined ?
89 - this :
90 - this.each(function() {
91 - var queue = jQuery.queue( this, type, data );
92 -
93 - // Ensure a hooks for this queue
94 - jQuery._queueHooks( this, type );
95 -
96 - if ( type === "fx" && queue[0] !== "inprogress" ) {
97 - jQuery.dequeue( this, type );
98 - }
99 - });
100 - },
101 - dequeue: function( type ) {
102 - return this.each(function() {
103 - jQuery.dequeue( this, type );
104 - });
105 - },
106 - clearQueue: function( type ) {
107 - return this.queue( type || "fx", [] );
108 - },
109 - // Get a promise resolved when queues of a certain type
110 - // are emptied (fx is the type by default)
111 - promise: function( type, obj ) {
112 - var tmp,
113 - count = 1,
114 - defer = jQuery.Deferred(),
115 - elements = this,
116 - i = this.length,
117 - resolve = function() {
118 - if ( !( --count ) ) {
119 - defer.resolveWith( elements, [ elements ] );
120 - }
121 - };
122 -
123 - if ( typeof type !== "string" ) {
124 - obj = type;
125 - type = undefined;
126 - }
127 - type = type || "fx";
128 -
129 - while ( i-- ) {
130 - tmp = data_priv.get( elements[ i ], type + "queueHooks" );
131 - if ( tmp && tmp.empty ) {
132 - count++;
133 - tmp.empty.add( resolve );
134 - }
135 - }
136 - resolve();
137 - return defer.promise( obj );
138 - }
139 -});
140 -
141 -return jQuery;
142 -});
1 -define([
2 - "../core",
3 - "../queue",
4 - "../effects" // Delay is optional because of this dependency
5 -], function( jQuery ) {
6 -
7 -// Based off of the plugin by Clint Helfers, with permission.
8 -// http://blindsignals.com/index.php/2009/07/jquery-delay/
9 -jQuery.fn.delay = function( time, type ) {
10 - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
11 - type = type || "fx";
12 -
13 - return this.queue( type, function( next, hooks ) {
14 - var timeout = setTimeout( next, time );
15 - hooks.stop = function() {
16 - clearTimeout( timeout );
17 - };
18 - });
19 -};
20 -
21 -return jQuery.fn.delay;
22 -});
1 -define([
2 - "./core"
3 -], function( jQuery ) {
4 -
5 -/*
6 - * Optional (non-Sizzle) selector module for custom builds.
7 - *
8 - * Note that this DOES NOT SUPPORT many documented jQuery
9 - * features in exchange for its smaller size:
10 - *
11 - * Attribute not equal selector
12 - * Positional selectors (:first; :eq(n); :odd; etc.)
13 - * Type selectors (:input; :checkbox; :button; etc.)
14 - * State-based selectors (:animated; :visible; :hidden; etc.)
15 - * :has(selector)
16 - * :not(complex selector)
17 - * custom selectors via Sizzle extensions
18 - * Leading combinators (e.g., $collection.find("> *"))
19 - * Reliable functionality on XML fragments
20 - * Requiring all parts of a selector to match elements under context
21 - * (e.g., $div.find("div > *") now matches children of $div)
22 - * Matching against non-elements
23 - * Reliable sorting of disconnected nodes
24 - * querySelectorAll bug fixes (e.g., unreliable :focus on WebKit)
25 - *
26 - * If any of these are unacceptable tradeoffs, either use Sizzle or
27 - * customize this stub for the project's specific needs.
28 - */
29 -
30 -var docElem = window.document.documentElement,
31 - selector_hasDuplicate,
32 - matches = docElem.matches ||
33 - docElem.webkitMatchesSelector ||
34 - docElem.mozMatchesSelector ||
35 - docElem.oMatchesSelector ||
36 - docElem.msMatchesSelector,
37 - selector_sortOrder = function( a, b ) {
38 - // Flag for duplicate removal
39 - if ( a === b ) {
40 - selector_hasDuplicate = true;
41 - return 0;
42 - }
43 -
44 - var compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b );
45 -
46 - if ( compare ) {
47 - // Disconnected nodes
48 - if ( compare & 1 ) {
49 -
50 - // Choose the first element that is related to our document
51 - if ( a === document || jQuery.contains(document, a) ) {
52 - return -1;
53 - }
54 - if ( b === document || jQuery.contains(document, b) ) {
55 - return 1;
56 - }
57 -
58 - // Maintain original order
59 - return 0;
60 - }
61 -
62 - return compare & 4 ? -1 : 1;
63 - }
64 -
65 - // Not directly comparable, sort on existence of method
66 - return a.compareDocumentPosition ? -1 : 1;
67 - };
68 -
69 -jQuery.extend({
70 - find: function( selector, context, results, seed ) {
71 - var elem, nodeType,
72 - i = 0;
73 -
74 - results = results || [];
75 - context = context || document;
76 -
77 - // Same basic safeguard as Sizzle
78 - if ( !selector || typeof selector !== "string" ) {
79 - return results;
80 - }
81 -
82 - // Early return if context is not an element or document
83 - if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
84 - return [];
85 - }
86 -
87 - if ( seed ) {
88 - while ( (elem = seed[i++]) ) {
89 - if ( jQuery.find.matchesSelector(elem, selector) ) {
90 - results.push( elem );
91 - }
92 - }
93 - } else {
94 - jQuery.merge( results, context.querySelectorAll(selector) );
95 - }
96 -
97 - return results;
98 - },
99 - unique: function( results ) {
100 - var elem,
101 - duplicates = [],
102 - i = 0,
103 - j = 0;
104 -
105 - selector_hasDuplicate = false;
106 - results.sort( selector_sortOrder );
107 -
108 - if ( selector_hasDuplicate ) {
109 - while ( (elem = results[i++]) ) {
110 - if ( elem === results[ i ] ) {
111 - j = duplicates.push( i );
112 - }
113 - }
114 - while ( j-- ) {
115 - results.splice( duplicates[ j ], 1 );
116 - }
117 - }
118 -
119 - return results;
120 - },
121 - text: function( elem ) {
122 - var node,
123 - ret = "",
124 - i = 0,
125 - nodeType = elem.nodeType;
126 -
127 - if ( !nodeType ) {
128 - // If no nodeType, this is expected to be an array
129 - while ( (node = elem[i++]) ) {
130 - // Do not traverse comment nodes
131 - ret += jQuery.text( node );
132 - }
133 - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
134 - // Use textContent for elements
135 - return elem.textContent;
136 - } else if ( nodeType === 3 || nodeType === 4 ) {
137 - return elem.nodeValue;
138 - }
139 - // Do not include comment or processing instruction nodes
140 -
141 - return ret;
142 - },
143 - contains: function( a, b ) {
144 - var adown = a.nodeType === 9 ? a.documentElement : a,
145 - bup = b && b.parentNode;
146 - return a === bup || !!( bup && bup.nodeType === 1 && adown.contains(bup) );
147 - },
148 - isXMLDoc: function( elem ) {
149 - return (elem.ownerDocument || elem).documentElement.nodeName !== "HTML";
150 - },
151 - expr: {
152 - attrHandle: {},
153 - match: {
154 - bool: /^(?:checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped)$/i,
155 - needsContext: /^[\x20\t\r\n\f]*[>+~]/
156 - }
157 - }
158 -});
159 -
160 -jQuery.extend( jQuery.find, {
161 - matches: function( expr, elements ) {
162 - return jQuery.find( expr, null, null, elements );
163 - },
164 - matchesSelector: function( elem, expr ) {
165 - return matches.call( elem, expr );
166 - },
167 - attr: function( elem, name ) {
168 - return elem.getAttribute( name );
169 - }
170 -});
171 -
172 -});
1 -define([
2 - "./core",
3 - "sizzle"
4 -], function( jQuery, Sizzle ) {
5 -
6 -jQuery.find = Sizzle;
7 -jQuery.expr = Sizzle.selectors;
8 -jQuery.expr[":"] = jQuery.expr.pseudos;
9 -jQuery.unique = Sizzle.uniqueSort;
10 -jQuery.text = Sizzle.getText;
11 -jQuery.isXMLDoc = Sizzle.isXML;
12 -jQuery.contains = Sizzle.contains;
13 -
14 -});
1 -define([
2 - "./core",
3 - "./manipulation/var/rcheckableType",
4 - "./core/init",
5 - "./traversing", // filter
6 - "./attributes/prop"
7 -], function( jQuery, rcheckableType ) {
8 -
9 -var r20 = /%20/g,
10 - rbracket = /\[\]$/,
11 - rCRLF = /\r?\n/g,
12 - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
13 - rsubmittable = /^(?:input|select|textarea|keygen)/i;
14 -
15 -function buildParams( prefix, obj, traditional, add ) {
16 - var name;
17 -
18 - if ( jQuery.isArray( obj ) ) {
19 - // Serialize array item.
20 - jQuery.each( obj, function( i, v ) {
21 - if ( traditional || rbracket.test( prefix ) ) {
22 - // Treat each array item as a scalar.
23 - add( prefix, v );
24 -
25 - } else {
26 - // Item is non-scalar (array or object), encode its numeric index.
27 - buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
28 - }
29 - });
30 -
31 - } else if ( !traditional && jQuery.type( obj ) === "object" ) {
32 - // Serialize object item.
33 - for ( name in obj ) {
34 - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
35 - }
36 -
37 - } else {
38 - // Serialize scalar item.
39 - add( prefix, obj );
40 - }
41 -}
42 -
43 -// Serialize an array of form elements or a set of
44 -// key/values into a query string
45 -jQuery.param = function( a, traditional ) {
46 - var prefix,
47 - s = [],
48 - add = function( key, value ) {
49 - // If value is a function, invoke it and return its value
50 - value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
51 - s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
52 - };
53 -
54 - // Set traditional to true for jQuery <= 1.3.2 behavior.
55 - if ( traditional === undefined ) {
56 - traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
57 - }
58 -
59 - // If an array was passed in, assume that it is an array of form elements.
60 - if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
61 - // Serialize the form elements
62 - jQuery.each( a, function() {
63 - add( this.name, this.value );
64 - });
65 -
66 - } else {
67 - // If traditional, encode the "old" way (the way 1.3.2 or older
68 - // did it), otherwise encode params recursively.
69 - for ( prefix in a ) {
70 - buildParams( prefix, a[ prefix ], traditional, add );
71 - }
72 - }
73 -
74 - // Return the resulting serialization
75 - return s.join( "&" ).replace( r20, "+" );
76 -};
77 -
78 -jQuery.fn.extend({
79 - serialize: function() {
80 - return jQuery.param( this.serializeArray() );
81 - },
82 - serializeArray: function() {
83 - return this.map(function() {
84 - // Can add propHook for "elements" to filter or add form elements
85 - var elements = jQuery.prop( this, "elements" );
86 - return elements ? jQuery.makeArray( elements ) : this;
87 - })
88 - .filter(function() {
89 - var type = this.type;
90 -
91 - // Use .is( ":disabled" ) so that fieldset[disabled] works
92 - return this.name && !jQuery( this ).is( ":disabled" ) &&
93 - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
94 - ( this.checked || !rcheckableType.test( type ) );
95 - })
96 - .map(function( i, elem ) {
97 - var val = jQuery( this ).val();
98 -
99 - return val == null ?
100 - null :
101 - jQuery.isArray( val ) ?
102 - jQuery.map( val, function( val ) {
103 - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
104 - }) :
105 - { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
106 - }).get();
107 - }
108 -});
109 -
110 -return jQuery;
111 -});
1 -define([
2 - "./core",
3 - "./var/indexOf",
4 - "./traversing/var/rneedsContext",
5 - "./core/init",
6 - "./traversing/findFilter",
7 - "./selector"
8 -], function( jQuery, indexOf, rneedsContext ) {
9 -
10 -var rparentsprev = /^(?:parents|prev(?:Until|All))/,
11 - // Methods guaranteed to produce a unique set when starting from a unique set
12 - guaranteedUnique = {
13 - children: true,
14 - contents: true,
15 - next: true,
16 - prev: true
17 - };
18 -
19 -jQuery.extend({
20 - dir: function( elem, dir, until ) {
21 - var matched = [],
22 - truncate = until !== undefined;
23 -
24 - while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) {
25 - if ( elem.nodeType === 1 ) {
26 - if ( truncate && jQuery( elem ).is( until ) ) {
27 - break;
28 - }
29 - matched.push( elem );
30 - }
31 - }
32 - return matched;
33 - },
34 -
35 - sibling: function( n, elem ) {
36 - var matched = [];
37 -
38 - for ( ; n; n = n.nextSibling ) {
39 - if ( n.nodeType === 1 && n !== elem ) {
40 - matched.push( n );
41 - }
42 - }
43 -
44 - return matched;
45 - }
46 -});
47 -
48 -jQuery.fn.extend({
49 - has: function( target ) {
50 - var targets = jQuery( target, this ),
51 - l = targets.length;
52 -
53 - return this.filter(function() {
54 - var i = 0;
55 - for ( ; i < l; i++ ) {
56 - if ( jQuery.contains( this, targets[i] ) ) {
57 - return true;
58 - }
59 - }
60 - });
61 - },
62 -
63 - closest: function( selectors, context ) {
64 - var cur,
65 - i = 0,
66 - l = this.length,
67 - matched = [],
68 - pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
69 - jQuery( selectors, context || this.context ) :
70 - 0;
71 -
72 - for ( ; i < l; i++ ) {
73 - for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
74 - // Always skip document fragments
75 - if ( cur.nodeType < 11 && (pos ?
76 - pos.index(cur) > -1 :
77 -
78 - // Don't pass non-elements to Sizzle
79 - cur.nodeType === 1 &&
80 - jQuery.find.matchesSelector(cur, selectors)) ) {
81 -
82 - matched.push( cur );
83 - break;
84 - }
85 - }
86 - }
87 -
88 - return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );
89 - },
90 -
91 - // Determine the position of an element within the set
92 - index: function( elem ) {
93 -
94 - // No argument, return index in parent
95 - if ( !elem ) {
96 - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
97 - }
98 -
99 - // Index in selector
100 - if ( typeof elem === "string" ) {
101 - return indexOf.call( jQuery( elem ), this[ 0 ] );
102 - }
103 -
104 - // Locate the position of the desired element
105 - return indexOf.call( this,
106 -
107 - // If it receives a jQuery object, the first element is used
108 - elem.jquery ? elem[ 0 ] : elem
109 - );
110 - },
111 -
112 - add: function( selector, context ) {
113 - return this.pushStack(
114 - jQuery.unique(
115 - jQuery.merge( this.get(), jQuery( selector, context ) )
116 - )
117 - );
118 - },
119 -
120 - addBack: function( selector ) {
121 - return this.add( selector == null ?
122 - this.prevObject : this.prevObject.filter(selector)
123 - );
124 - }
125 -});
126 -
127 -function sibling( cur, dir ) {
128 - while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {}
129 - return cur;
130 -}
131 -
132 -jQuery.each({
133 - parent: function( elem ) {
134 - var parent = elem.parentNode;
135 - return parent && parent.nodeType !== 11 ? parent : null;
136 - },
137 - parents: function( elem ) {
138 - return jQuery.dir( elem, "parentNode" );
139 - },
140 - parentsUntil: function( elem, i, until ) {
141 - return jQuery.dir( elem, "parentNode", until );
142 - },
143 - next: function( elem ) {
144 - return sibling( elem, "nextSibling" );
145 - },
146 - prev: function( elem ) {
147 - return sibling( elem, "previousSibling" );
148 - },
149 - nextAll: function( elem ) {
150 - return jQuery.dir( elem, "nextSibling" );
151 - },
152 - prevAll: function( elem ) {
153 - return jQuery.dir( elem, "previousSibling" );
154 - },
155 - nextUntil: function( elem, i, until ) {
156 - return jQuery.dir( elem, "nextSibling", until );
157 - },
158 - prevUntil: function( elem, i, until ) {
159 - return jQuery.dir( elem, "previousSibling", until );
160 - },
161 - siblings: function( elem ) {
162 - return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
163 - },
164 - children: function( elem ) {
165 - return jQuery.sibling( elem.firstChild );
166 - },
167 - contents: function( elem ) {
168 - return elem.contentDocument || jQuery.merge( [], elem.childNodes );
169 - }
170 -}, function( name, fn ) {
171 - jQuery.fn[ name ] = function( until, selector ) {
172 - var matched = jQuery.map( this, fn, until );
173 -
174 - if ( name.slice( -5 ) !== "Until" ) {
175 - selector = until;
176 - }
177 -
178 - if ( selector && typeof selector === "string" ) {
179 - matched = jQuery.filter( selector, matched );
180 - }
181 -
182 - if ( this.length > 1 ) {
183 - // Remove duplicates
184 - if ( !guaranteedUnique[ name ] ) {
185 - jQuery.unique( matched );
186 - }
187 -
188 - // Reverse order for parents* and prev-derivatives
189 - if ( rparentsprev.test( name ) ) {
190 - matched.reverse();
191 - }
192 - }
193 -
194 - return this.pushStack( matched );
195 - };
196 -});
197 -
198 -return jQuery;
199 -});
1 -define([
2 - "../core",
3 - "../var/indexOf",
4 - "./var/rneedsContext",
5 - "../selector"
6 -], function( jQuery, indexOf, rneedsContext ) {
7 -
8 -var risSimple = /^.[^:#\[\.,]*$/;
9 -
10 -// Implement the identical functionality for filter and not
11 -function winnow( elements, qualifier, not ) {
12 - if ( jQuery.isFunction( qualifier ) ) {
13 - return jQuery.grep( elements, function( elem, i ) {
14 - /* jshint -W018 */
15 - return !!qualifier.call( elem, i, elem ) !== not;
16 - });
17 -
18 - }
19 -
20 - if ( qualifier.nodeType ) {
21 - return jQuery.grep( elements, function( elem ) {
22 - return ( elem === qualifier ) !== not;
23 - });
24 -
25 - }
26 -
27 - if ( typeof qualifier === "string" ) {
28 - if ( risSimple.test( qualifier ) ) {
29 - return jQuery.filter( qualifier, elements, not );
30 - }
31 -
32 - qualifier = jQuery.filter( qualifier, elements );
33 - }
34 -
35 - return jQuery.grep( elements, function( elem ) {
36 - return ( indexOf.call( qualifier, elem ) >= 0 ) !== not;
37 - });
38 -}
39 -
40 -jQuery.filter = function( expr, elems, not ) {
41 - var elem = elems[ 0 ];
42 -
43 - if ( not ) {
44 - expr = ":not(" + expr + ")";
45 - }
46 -
47 - return elems.length === 1 && elem.nodeType === 1 ?
48 - jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
49 - jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
50 - return elem.nodeType === 1;
51 - }));
52 -};
53 -
54 -jQuery.fn.extend({
55 - find: function( selector ) {
56 - var i,
57 - len = this.length,
58 - ret = [],
59 - self = this;
60 -
61 - if ( typeof selector !== "string" ) {
62 - return this.pushStack( jQuery( selector ).filter(function() {
63 - for ( i = 0; i < len; i++ ) {
64 - if ( jQuery.contains( self[ i ], this ) ) {
65 - return true;
66 - }
67 - }
68 - }) );
69 - }
70 -
71 - for ( i = 0; i < len; i++ ) {
72 - jQuery.find( selector, self[ i ], ret );
73 - }
74 -
75 - // Needed because $( selector, context ) becomes $( context ).find( selector )
76 - ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
77 - ret.selector = this.selector ? this.selector + " " + selector : selector;
78 - return ret;
79 - },
80 - filter: function( selector ) {
81 - return this.pushStack( winnow(this, selector || [], false) );
82 - },
83 - not: function( selector ) {
84 - return this.pushStack( winnow(this, selector || [], true) );
85 - },
86 - is: function( selector ) {
87 - return !!winnow(
88 - this,
89 -
90 - // If this is a positional/relative selector, check membership in the returned set
91 - // so $("p:first").is("p:last") won't return true for a doc with two "p".
92 - typeof selector === "string" && rneedsContext.test( selector ) ?
93 - jQuery( selector ) :
94 - selector || [],
95 - false
96 - ).length;
97 - }
98 -});
99 -
100 -});
1 -define([
2 - "../../core",
3 - "../../selector"
4 -], function( jQuery ) {
5 - return jQuery.expr.match.needsContext;
6 -});
1 -define(function() {
2 - return [];
3 -});
1 -define(function() {
2 - // [[Class]] -> type pairs
3 - return {};
4 -});
1 -define([
2 - "./arr"
3 -], function( arr ) {
4 - return arr.concat;
5 -});
1 -define([
2 - "./class2type"
3 -], function( class2type ) {
4 - return class2type.hasOwnProperty;
5 -});
1 -define([
2 - "./arr"
3 -], function( arr ) {
4 - return arr.indexOf;
5 -});
1 -define(function() {
2 - return (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;
3 -});
1 -define([
2 - "./arr"
3 -], function( arr ) {
4 - return arr.push;
5 -});
1 -define(function() {
2 - return (/\S+/g);
3 -});
1 -define([
2 - "./arr"
3 -], function( arr ) {
4 - return arr.slice;
5 -});
1 -define(function() {
2 - return typeof undefined;
3 -});
1 -define(function() {
2 - // All support tests are defined in their respective modules.
3 - return {};
4 -});
1 -define([
2 - "./class2type"
3 -], function( class2type ) {
4 - return class2type.toString;
5 -});
1 -define([
2 - "./core",
3 - "./core/init",
4 - "./manipulation", // clone
5 - "./traversing" // parent, contents
6 -], function( jQuery ) {
7 -
8 -jQuery.fn.extend({
9 - wrapAll: function( html ) {
10 - var wrap;
11 -
12 - if ( jQuery.isFunction( html ) ) {
13 - return this.each(function( i ) {
14 - jQuery( this ).wrapAll( html.call(this, i) );
15 - });
16 - }
17 -
18 - if ( this[ 0 ] ) {
19 -
20 - // The elements to wrap the target around
21 - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
22 -
23 - if ( this[ 0 ].parentNode ) {
24 - wrap.insertBefore( this[ 0 ] );
25 - }
26 -
27 - wrap.map(function() {
28 - var elem = this;
29 -
30 - while ( elem.firstElementChild ) {
31 - elem = elem.firstElementChild;
32 - }
33 -
34 - return elem;
35 - }).append( this );
36 - }
37 -
38 - return this;
39 - },
40 -
41 - wrapInner: function( html ) {
42 - if ( jQuery.isFunction( html ) ) {
43 - return this.each(function( i ) {
44 - jQuery( this ).wrapInner( html.call(this, i) );
45 - });
46 - }
47 -
48 - return this.each(function() {
49 - var self = jQuery( this ),
50 - contents = self.contents();
51 -
52 - if ( contents.length ) {
53 - contents.wrapAll( html );
54 -
55 - } else {
56 - self.append( html );
57 - }
58 - });
59 - },
60 -
61 - wrap: function( html ) {
62 - var isFunction = jQuery.isFunction( html );
63 -
64 - return this.each(function( i ) {
65 - jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
66 - });
67 - },
68 -
69 - unwrap: function() {
70 - return this.parent().each(function() {
71 - if ( !jQuery.nodeName( this, "body" ) ) {
72 - jQuery( this ).replaceWith( this.childNodes );
73 - }
74 - }).end();
75 - }
76 -});
77 -
78 -return jQuery;
79 -});
1 -// Include gulp
2 -var gulp = require('gulp');
3 -
4 -// Include Our Plugins
5 -var jshint = require('gulp-jshint');
6 -var sass = require('gulp-sass');
7 -var nodemon = require('gulp-nodemon');
8 -var concat = require('gulp-concat');
9 -
10 -// Lint Task
11 -gulp.task('lint', function() {
12 - return gulp.src(['app.js', 'routes/**/*.js', 'models/**/*.js', 'config/**/*.js', 'public/javascripts/**/*.js'])
13 - .pipe(jshint())
14 - .pipe(jshint.reporter('default'));
15 -});
16 -
17 -// Compile Our Sass
18 -gulp.task('sass', function() {
19 - return gulp.src(['scss/*.scss'])
20 - .pipe(sass())
21 - .pipe(concat('style.css'))
22 - .pipe(gulp.dest('public/stylesheets'));
23 -});
24 -
25 -// Watch Files For Changes
26 -gulp.task('watch', function() {
27 - gulp.watch('scss/**/*.scss', ['sass']);
28 -});
29 -
30 -gulp.task('nodemon', function (cb) {
31 - var started = false;
32 - return nodemon({
33 - script: 'bin/www'
34 - }).on('start', function () {
35 - // to avoid nodemon being started multiple times
36 - // thanks @matthisk
37 - if (!started) {
38 - cb();
39 - started = true;
40 - }
41 - });
42 -});
43 -
44 -// Default Task
45 -gulp.task('default', ['lint', 'sass', 'watch', 'nodemon']);
1 -var mongoose = require('mongoose'),
2 - Schema = mongoose.Schema;
3 -
4 -var schema = new Schema({
5 - name: {type: String, required: true, trim: true},
6 - email: {type: String, required: true, index: true, unique: true, trim: true},
7 - password: {type: String},
8 - createdAt: {type: Date, default: Date.now}
9 -}, {
10 - toJSON: { virtuals: true},
11 - toObject: {virtuals: true}
12 -});
13 -
14 -var User = mongoose.model('User', schema);
15 -
16 -module.exports = User;
1 -// 전체 삭제
2 -db.users.drop()
3 -
4 -// Insert (Create)
5 -db.users.insert({name: 'Kim', age: 30, tel: '555-6666', gender: 'm'})
6 -db.users.insert({name: 'Lee', age: 22, tel: '444-6666', gender: 'm'})
7 -db.users.insert({name: 'Cho', age: 23, tel: '222-2222', gender: 'm'})
8 -db.users.insert({name: 'Park', age: 43, gender: 'f', scores: [100, 200, 600]})
9 -db.users.insert({name: 'Choi', age: 26, gender: 'f', department: {name: 'CS', loc: 'Yongin'}})
10 -
11 -// Query (Read)
12 -db.users.find()
13 -db.users.find({gender: 'm'})
14 -db.users.find({name: { $in: ['Park', 'Choi']}})
15 -db.users.find({gender: 'm', age: { $gt: 25}})
16 -db.users.find({$or: [{age: {$lte: 23}}, {gender: 'f'}]})
17 -
18 -db.users.find({scores: 200})
19 -db.users.find({'department.name': 'CS'})
20 -
21 -// Modify (Update)
22 -db.users.update({name: 'Lee'}, {$set: {age: 23}})
23 -db.users.update({name: 'Cho'}, {name: 'Choo', age: 40, scores: [100, 200]})
24 -db.users.update({name: 'Jay'}, {name: 'Jay', gender: 'm', age: 50}, {upsert: true})
25 -db.users.update({name: 'Jay'}, {name: 'Jay', gender: 'f', age: 25}, {upsert: true})
26 -db.users.update({name: 'Choo'}, {$set: {gender: 'f'}})
27 -db.users.update({name: 'Lee'}, {$unset: {tel: 1}})
28 -
29 -// Remove (Delete)
30 -db.users.count()
31 -db.users.remove({name: 'Choi'})
32 -db.users.count()
33 -
34 -// Aggregate
35 -db.users.find()
36 -db.users.aggregate([
37 - {$match: {age: {$gt: 23}}},
38 - {$group: {_id: "$gender", cnt: {$sum: 1} }},
39 - {$sort: {cnt: -1}}
40 -])
1 -{
2 - "name": "ex01",
3 - "version": "0.0.0",
4 - "private": true,
5 - "scripts": {
6 - "start": "node ./bin/www"
7 - },
8 - "dependencies": {
9 - "body-parser": "~1.13.1",
10 - "connect-flash": "^0.1.1",
11 - "cookie-parser": "~1.3.5",
12 - "debug": "~2.2.0",
13 - "express": "~4.13.0",
14 - "express-session": "^1.11.3",
15 - "jade": "~1.11.0",
16 - "method-override": "^2.3.5",
17 - "moment": "^2.10.6",
18 - "mongoose": "^4.1.11",
19 - "morgan": "~1.6.1",
20 - "node-sass-middleware": "0.8.0",
21 - "serve-favicon": "~2.3.0"
22 - },
23 - "devDependencies": {
24 - "gulp": "^3.9.0",
25 - "gulp-concat": "^2.6.0",
26 - "gulp-jshint": "^1.11.2",
27 - "gulp-nodemon": "^2.0.4",
28 - "gulp-sass": "^2.0.4"
29 - }
30 -}
1 -form.todos {
2 - width: 100%;
3 - margin: 0 0 1em 0;
4 - padding: 1em;
5 - background: #acddf2; }
6 - form.todos .main input[type='text'] {
7 - font-size: 1.4em;
8 - border: 1px solid #2c9cd2;
9 - padding: 0.5em 1em;
10 - margin-bottom: 1em;
11 - width: 100%;
12 - box-sizing: border-box; }
13 - form.todos .actions button {
14 - margin-top: 1em; }
15 -
16 -.tasks {
17 - width: 100%;
18 - list-style: none;
19 - padding: 0;
20 - margin: 0; }
21 - .tasks li.task {
22 - border-bottom: 1px solid #eaeaea;
23 - padding: 1em 0; }
24 - .tasks li.task span {
25 - display: inline-block;
26 - margin-right: 1em; }
27 - .tasks li.task .check {
28 - width: 2em;
29 - height: 2em;
30 - border-radius: 1em;
31 - border: 1px solid #2c9cd2;
32 - vertical-align: bottom; }
33 - .tasks li.task .content {
34 - font-size: 1.1em;
35 - font-weight: bold;
36 - line-height: 2em; }
37 - .tasks li.task .category {
38 - float: right;
39 - min-width: 5em;
40 - font-size: 0.9em; }
41 - .tasks li.task .priority {
42 - font-size: 0.8em;
43 - border-radius: 0.8em;
44 - background-color: #888;
45 - color: #fff;
46 - height: 200%;
47 - line-height: 1.6em;
48 - text-align: center;
49 - padding: 0 1em; }
50 - .tasks li.task .priority.p2 {
51 - background-color: #b0b33c; }
52 - .tasks li.task .priority.p3 {
53 - background-color: #a51e23; }
54 - .tasks li.task .deadline {
55 - color: #ccc;
56 - font-size: 0.9em; }
57 -
58 -.side .section {
59 - background: #888;
60 - width: 100%;
61 - color: #fff; }
62 - .side .section a {
63 - color: #fff;
64 - display: inline-block;
65 - text-decoration: none;
66 - width: 100%;
67 - box-sizing: border-box;
68 - padding: 0.5em 1em 0.5em 3em;
69 - border-bottom: 1px solid #fff; }
70 - .side .section a:last-child {
71 - border-bottom: 0; }
72 - .side .section a.all {
73 - background: #444; }
74 - .side .section a.selected {
75 - padding-left: 1em;
76 - background-color: #009eec; }
77 - .side .section a.selected:before {
78 - font-family: FontAwesome;
79 - content: "\f00c";
80 - display: inline-block;
81 - vertical-align: middle;
82 - padding-right: 1em; }
83 - .side .section a:hover, .side .section a.selected:hover {
84 - background-color: #337AB7; }
85 -
86 -.form-signin {
87 - width: 320px;
88 - height: 300px;
89 - padding: 0;
90 - top: 10em;
91 - left: 50%;
92 - position: absolute;
93 - margin: 0 0 0 -160px; }
94 - .form-signin .checkbox {
95 - margin-bottom: 10px;
96 - font-weight: normal; }
97 - .form-signin .form-control {
98 - position: relative;
99 - height: auto;
100 - box-sizing: border-box;
101 - padding: 10px;
102 - font-size: 16px; }
103 - .form-signin .form-control:focus {
104 - z-index: 2; }
105 - .form-signin input[type="email"] {
106 - margin-bottom: -1px;
107 - border-bottom-right-radius: 0;
108 - border-bottom-left-radius: 0; }
109 - .form-signin input[type="password"] {
110 - margin-bottom: 10px;
111 - border-top-left-radius: 0;
112 - border-top-right-radius: 0; }
113 -
114 -body {
115 - font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
116 - margin-top: 50px;
117 - padding-top: 1em; }
118 -
119 -a {
120 - color: #00B7FF; }
121 -
122 -.jumbotron {
123 - margin-top: -1em;
124 - background: url("/images/bg.jpg") no-repeat left top;
125 - -webkit-background-size: 100%;
126 - -moz-background-size: 100%;
127 - -o-background-size: 100%;
128 - background-size: 100%;
129 - min-height: 20em;
130 - color: #fff;
131 - text-shadow: 2px 2px 10px rgba(0, 0, 0, 0.3); }
132 -
133 -.form-actions {
134 - padding: 19px 20px 20px;
135 - margin-top: 20px;
136 - margin-bottom: 20px;
137 - background-color: #f5f5f5;
138 - border-top: 1px solid #e5e5e5; }
139 -
140 -.footer {
141 - position: absolute;
142 - bottom: 0;
143 - width: 100%;
144 - height: 60px;
145 - background-color: #f5f5f5; }
146 - .footer .container {
147 - padding-right: 1em;
148 - padding-left: 1em; }
149 - .footer .container .text-muted {
150 - margin: 20px 0;
151 - color: #bbb; }
1 -var express = require('express'),
2 - todos = require('./todos'),
3 - User = require('../models/User');
4 -var router = express.Router();
5 -
6 -/* GET home page. */
7 -router.get('/', function(req, res, next) {
8 - res.render('index');
9 -});
10 -
11 -router.get('/signin', function(req, res, next) {
12 - res.render('signin');
13 -});
14 -
15 -router.post('/signin', function(req, res, next) {
16 - User.findOne({email: req.body.email}, function(err, user) {
17 - if (err) {
18 - res.render('error', {message: "Error", error: err});
19 - } else if (!user) {
20 - req.flash('danger', '존재하지 않는 사용자 입니다.');
21 - res.redirect('back');
22 - } else if (user.password !== req.body.password) {
23 - req.flash('danger', '비밀번호가 일치하지 않습니다.');
24 - res.redirect('back');
25 - } else {
26 - req.session.user = user;
27 - req.flash('success', '로그인 되었습니다.');
28 - res.redirect('/todos');
29 - }
30 - });
31 -});
32 -
33 -router.get('/signout', function(req, res, next) {
34 - delete req.session.user;
35 - req.flash('success', '로그아웃 되었습니다.');
36 - res.redirect('/');
37 -});
38 -router.use('/todos', todos);
39 -
40 -module.exports = router;
1 -var express = require('express');
2 -var router = express.Router();
3 -
4 -router.get('/', function(req, res, next) {
5 - res.render('todos', {
6 - tasks: [
7 - {_id: 1, content: '이런저런일1', category: '학교', priority: 3, deadline: null},
8 - {_id: 2, content: '이런저런일2', category: null, priority: 2, deadline: null},
9 - {_id: 3, content: '이런저런일3', category: '집', priority: 3, deadline: new Date("2015-12-25")},
10 - {_id: 4, content: '이런저런일4', category: '학교', priority: 1, deadline: new Date("2015-11-21")},
11 - {_id: 5, content: '이런저런일5', category: '집', priority: 2, deadline: null},
12 - ],
13 - categories: [
14 - '학교',
15 - '집',
16 - ]
17 - });
18 -});
19 -
20 -router.post('/', function(req, res, next) {
21 - req.flash('success', '새로운 할 일이 저장되었습니다.');
22 - res.redirect('/todos');
23 -});
24 -
25 -router.put('/:id', function(req, res, next) {
26 - req.flash('success', '할 일이 변경되었습니다.');
27 - res.redirect('/todos');
28 -});
29 -
30 -router.delete('/:id', function(req, res, next) {
31 - req.flash('success', '할 일이 삭제되었습니다.');
32 - res.redirect('/todos');
33 -});
34 -
35 -module.exports = router;
1 -var express = require('express'),
2 - User = require('../models/User');
3 -var router = express.Router();
4 -
5 -function needAuth(req, res, next) {
6 - if (req.session.user) {
7 - next();
8 - } else {
9 - req.flash('danger', '로그인이 필요합니다.');
10 - res.redirect('/signin');
11 - }
12 -}
13 -
14 -function validateForm(form, options) {
15 - var name = form.name || "";
16 - var email = form.email || "";
17 - name = name.trim();
18 - email = email.trim();
19 -
20 - if (!name) {
21 - return '이름을 입력해주세요.';
22 - }
23 -
24 - if (!email) {
25 - return '이메일을 입력해주세요.';
26 - }
27 -
28 - if (!form.password && options.needPassword) {
29 - return '비밀번호를 입력해주세요.';
30 - }
31 -
32 - if (form.password !== form.password_confirmation) {
33 - return '비밀번호가 일치하지 않습니다.';
34 - }
35 -
36 - if (form.password.length < 6) {
37 - return '비밀번호는 6글자 이상이어야 합니다.';
38 - }
39 -
40 - return null;
41 -}
42 -
43 -/* GET users listing. */
44 -router.get('/', needAuth, function(req, res, next) {
45 - User.find({}, function(err, users) {
46 - if (err) {
47 - return next(err);
48 - }
49 - res.render('users/index', {users: users});
50 - });
51 -});
52 -
53 -router.get('/new', function(req, res, next) {
54 - res.render('users/new', {messages: req.flash()});
55 -});
56 -
57 -router.get('/:id/edit', function(req, res, next) {
58 - User.findById(req.params.id, function(err, user) {
59 - if (err) {
60 - return next(err);
61 - }
62 - res.render('users/edit', {user: user});
63 - });
64 -});
65 -
66 -router.put('/:id', function(req, res, next) {
67 - var err = validateForm(req.body);
68 - if (err) {
69 - req.flash('danger', err);
70 - return res.redirect('back');
71 - }
72 -
73 - User.findById({_id: req.params.id}, function(err, user) {
74 - if (err) {
75 - return next(err);
76 - }
77 - if (!user) {
78 - req.flash('danger', '존재하지 않는 사용자입니다.');
79 - return res.redirect('back');
80 - }
81 -
82 - if (user.password !== req.body.current_password) {
83 - req.flash('danger', '현재 비밀번호가 일치하지 않습니다.');
84 - return res.redirect('back');
85 - }
86 -
87 - user.name = req.body.name;
88 - user.email = req.body.email;
89 - if (req.body.password) {
90 - user.password = req.body.password;
91 - }
92 -
93 - user.save(function(err) {
94 - if (err) {
95 - return next(err);
96 - }
97 - req.flash('success', '사용자 정보가 변경되었습니다.');
98 - res.redirect('/users');
99 - });
100 - });
101 -});
102 -
103 -router.delete('/:id', function(req, res, next) {
104 - User.findOneAndRemove({_id: req.params.id}, function(err) {
105 - if (err) {
106 - return next(err);
107 - }
108 - req.flash('success', '사용자 계정이 삭제되었습니다.');
109 - res.redirect('/users');
110 - });
111 -});
112 -
113 -router.get('/:id', function(req, res, next) {
114 - User.findById(req.params.id, function(err, user) {
115 - if (err) {
116 - return next(err);
117 - }
118 - res.render('users/show', {user: user});
119 - });
120 -});
121 -
122 -router.post('/', function(req, res, next) {
123 - var err = validateForm(req.body, {needPassword: true});
124 - if (err) {
125 - req.flash('danger', err);
126 - return res.redirect('back');
127 - }
128 - User.findOne({email: req.body.email}, function(err, user) {
129 - if (err) {
130 - return next(err);
131 - }
132 - if (user) {
133 - req.flash('danger', '동일한 이메일 주소가 이미 존재합니다.');
134 - res.redirect('back');
135 - }
136 - var newUser = new User({
137 - name: req.body.name,
138 - email: req.body.email,
139 - });
140 - newUser.password = req.body.password;
141 -
142 - newUser.save(function(err) {
143 - if (err) {
144 - return next(err);
145 - } else {
146 - req.flash('success', '가입이 완료되었습니다. 로그인 해주세요.');
147 - res.redirect('/');
148 - }
149 - });
150 - });
151 -});
152 -
153 -
154 -module.exports = router;
1 -.form-signin {
2 - width: 320px;
3 - height: 300px;
4 - padding: 0;
5 - top: 10em;
6 - left: 50%;
7 - position: absolute;
8 - margin: 0 0 0 -160px;
9 -
10 - .checkbox {
11 - margin-bottom: 10px;
12 - font-weight: normal;
13 - }
14 - .form-control {
15 - position: relative;
16 - height: auto;
17 - box-sizing: border-box;
18 - padding: 10px;
19 - font-size: 16px;
20 - }
21 - .form-control:focus {
22 - z-index: 2;
23 - }
24 - input[type="email"] {
25 - margin-bottom: -1px;
26 - border-bottom-right-radius: 0;
27 - border-bottom-left-radius: 0;
28 - }
29 - input[type="password"] {
30 - margin-bottom: 10px;
31 - border-top-left-radius: 0;
32 - border-top-right-radius: 0;
33 - }
34 -}
1 -body {
2 - font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
3 - margin-top: 50px;
4 - padding-top: 1em;
5 - & > .main-content {
6 - min-height: 400px;
7 - }
8 -}
9 -a {
10 - color: #00B7FF
11 -}
12 -
13 -.jumbotron {
14 - margin-top: -1em;
15 - background: url('/images/bg.jpg') no-repeat left top;
16 - -webkit-background-size: 100%;
17 - -moz-background-size: 100%;
18 - -o-background-size: 100%;
19 - background-size: 100%;
20 - min-height: 20em;
21 - color: #fff;
22 - text-shadow: 2px 2px 10px rgba(0, 0, 0, 0.3);
23 -}
24 -
25 -.form-actions {
26 - padding: 19px 20px 20px;
27 - margin-top: 20px;
28 - margin-bottom: 20px;
29 - background-color: #f5f5f5;
30 - border-top: 1px solid #e5e5e5;
31 -}
32 -
33 -.footer {
34 - margin-top: 1em;
35 - width: 100%;
36 - height: 60px;
37 - background-color: #f5f5f5;
38 -
39 - .container {
40 - padding-right: 1em;
41 - padding-left: 1em;
42 -
43 - .text-muted {
44 - margin: 20px 0;
45 - color: #bbb;
46 - }
47 - }
48 -}
1 -form.todos {
2 - width: 100%;
3 - margin: 0 0 1em 0;
4 - padding: 1em;
5 - background: #acddf2;
6 - .main {
7 - input[type='text'] {
8 - font-size: 1.4em;
9 - border: 1px solid #2c9cd2;
10 - padding: 0.5em 1em;
11 - margin-bottom: 1em;
12 - width: 100%;
13 - box-sizing: border-box;
14 - }
15 - }
16 - .actions button {
17 - margin-top: 1em;
18 - }
19 -}
20 -
21 -.tasks {
22 - width: 100%;
23 - list-style: none;
24 - padding: 0;
25 - margin: 0;
26 - li.task {
27 - border-bottom: 1px solid #eaeaea;
28 - padding: 1em 0;
29 - span {
30 - display: inline-block;
31 - margin-right: 1em;
32 - }
33 - .check {
34 - width: 2em;
35 - height: 2em;
36 - border-radius: 1em;
37 - border: 1px solid #2c9cd2;
38 - vertical-align: bottom;
39 - }
40 - .content {
41 - font-size: 1.1em;
42 - font-weight: bold;
43 - line-height: 2em;
44 - }
45 - .category {
46 - float: right;
47 - min-width: 5em;
48 - font-size: 0.9em;
49 - }
50 - .priority {
51 - font-size: 0.8em;
52 - border-radius: 0.8em;
53 - background-color: #888;
54 - color: #fff;
55 - height: 200%;
56 - line-height: 1.6em;
57 - text-align: center;
58 - padding: 0 1em;
59 -
60 - &.p2 {
61 - background-color: #b0b33c;
62 - }
63 - &.p3 {
64 - background-color: #a51e23;
65 - }
66 - }
67 - .deadline {
68 - color: #ccc;
69 - font-size: 0.9em;
70 - }
71 - }
72 -}
73 -.side {
74 - .section {
75 - background: #888;
76 - width: 100%;
77 - color: #fff;
78 - a {
79 - color: #fff;
80 - display: inline-block;
81 - text-decoration: none;
82 - width: 100%;
83 - box-sizing: border-box;
84 - padding: 0.5em 1em 0.5em 3em;
85 - border-bottom: 1px solid #fff;
86 -
87 - &:last-child {
88 - border-bottom: 0;
89 - }
90 -
91 - &.all {
92 - background: #444;
93 - }
94 - }
95 -
96 - a.selected {
97 - padding-left: 1em;
98 - background-color: #009eec;
99 - &:before {
100 - font-family: FontAwesome;
101 - content: "\f00c";
102 - display: inline-block;
103 - vertical-align: middle;
104 - padding-right: 1em;
105 - }
106 - }
107 -
108 - a:hover, a.selected:hover {
109 - background-color: #337AB7;
110 - }
111 - }
112 -}
1 -extends layout
2 -
3 -block content
4 - .container
5 - .panel.panel-danger(style='margin-top:2em')
6 - .panel-heading
7 - h3.panel-title= message
8 - .panel-body
9 - p= error.status
10 - pre #{error.stack}
1 -.footer
2 - .container
3 - p.text-muted
4 - | All rights reserved. &copy; 2015 Myongji University.
1 -form.form-inline(action='/todos', method='POST', class='todos')
2 - .form
3 - .main
4 - input(type='text', id='task', name='task', placeholder='해야할 일이 무엇인가요?')
5 - .sub
6 - .form-group
7 - input.form-control(type='text', id='category', name='category', placeholder='분류')
8 - .form-group
9 - select.form-control(name='priority')
10 - option(value='1') 중요
11 - option(value='2', selected) 보통
12 - option(value='3') 사소
13 - .form-group
14 - input.form-control(type='date', id='deadline', name='deadline')
15 - .actions
16 - button.btn.btn-primary.btn-lg.btn-block(type='submit') 저장
17 -
18 -ul.tasks
19 - each task in tasks
20 - li.task(data-id='#{task._id}')
21 - span.check
22 - span.content= task.content
23 - if task.category
24 - span.label.label-default.category= task.category
25 - span.priority(class='p#{task.priority}')
26 - case task.priority
27 - when 1
28 - | 사소
29 - when 2
30 - | 보통
31 - when 3
32 - | 중요
33 - if task.deadline
34 - span.deadline= moment(task.deadline).format('YYYY-MM-DD')
35 -
1 -h3 완료여부
2 -.section.priority
3 - a(data-value='completed').selected 완료
4 - a(data-value='uncompleted').selected 미완료
5 - a(data-value='all').all 전체
6 -
7 -h3 마감
8 -.section.deadline
9 - a(data-value='past') 과거
10 - a(data-value='today').selected 오늘
11 - a(data-value='week') 이번주
12 - a(data-value='month') 이번달
13 - a(data-value='all').all 전체
14 -
15 -h3 중요도
16 -.section.priority
17 - a(data-value='3').selected 중요
18 - a(data-value='2') 보통
19 - a(data-value='1') 사소
20 - a(data-value='all').all 전체
21 -
22 -
23 -h3 분류
24 -.section.categories
25 - each category in categories
26 - a(data-value='text').selected= category
27 - a(data-value='none').selected <분류없음>
28 - a(data-value='all').all 전체
1 -.navbar.navbar-inverse.navbar-fixed-top
2 - .container
3 - .navbar-header
4 - button.navbar-toggle.collapsed(type='button', data-toggle='collapse', data-target='#navbar', aria-expanded='false', aria-controls='navbar')
5 - span.sr-only Toggle navigation
6 - span.icon-bar
7 - span.icon-bar
8 - span.icon-bar
9 - a.navbar-brand(href='/')
10 - i.fa.fa-home
11 - #navbar.collapse.navbar-collapse
12 - ul.nav.navbar-nav
13 - li
14 - a(href='/todos') Todo List
15 - li
16 - a(href='/users') Users
17 - ul.nav.navbar-nav.navbar-right
18 - if (!currentUser)
19 - li
20 - a(href='/signin') Signin
21 - li
22 - a(href='/users/new') Signup
23 - else
24 - li
25 - a(href='/users/#{currentUser._id}') Profile
26 - li
27 - a(href='/signout') Signout
28 -
1 -extends layout
2 -
3 -block hero-unit
4 - .jumbotron
5 - .container
6 - h1 BIGBANG-TODO
7 -
8 -block content
9 - .container
10 - .row
11 - .col-md-6
12 - h3 서비스 목적
13 - p 본 서비스는 웹프로그래밍 수업을 위해서 sample로 만들어보는 것입니다.
14 - .col-md-6
15 - h3 주요 기능
16 - ul
17 - li 사용자 관리
18 - li 할 일 기록
19 - li 기록 내용: 분류, 내용, 중요도, deadline
20 - li 완료된 일 체크
21 -
1 -doctype html
2 -html(lang='ko')
3 - head
4 - block title
5 - title BBDO
6 - meta(charset='UTF-8')
7 - link(rel='stylesheet', href='/bower_components/bootstrap/dist/css/bootstrap-theme.css')
8 - link(rel='stylesheet', href='/bower_components/bootstrap/dist/css/bootstrap.css')
9 - link(rel='stylesheet', href='/bower_components/font-awesome/css/font-awesome.min.css')
10 - link(rel='stylesheet', href='/stylesheets/style.css')
11 - script(type='text/javascript', src='/bower_components/jquery/dist/jquery.js')
12 - script(type='text/javascript', src='/bower_components/bootstrap/dist/js/bootstrap.js')
13 - body
14 - block top-nav
15 - include ./includes/topnav
16 - block hero-unit
17 - if flashMessages
18 - each texts, type in flashMessages
19 - .container
20 - .alert(class='alert-#{type}')
21 - each msg in texts
22 - p= msg
23 - block content
24 -
25 - block footer
26 - include ./includes/footer
1 -extends layout
2 -
3 -block content
4 - .container
5 - form.form-signin(action='/signin', method='POST')
6 - label(for='email', class='sr-only') Email address
7 - input(
8 - type='email', id='email', name='email', class='form-control',
9 - placeholder='Email address', required, autofocus
10 - )
11 - label(for='password', class='sr-only') Password
12 - input(
13 - type='password', id='password', name='password', class='form-control',
14 - placeholder='Password', required, autofocus
15 - )
16 - button.btn.btn-lg.btn-primary.btn-block(type='submit') 로그인
17 - hr
18 - a.btn.btn-default.btn-mini(href='/users/new') 회원가입
19 - |
20 - a.btn.btn-default.btn-mini(href='/reset-password') 비밀번호 재설정
21 -
1 -extends layout
2 -
3 -block content
4 - .container
5 - .row
6 - .col-md-8
7 - include ./includes/todo-main
8 - .col-md-4.side
9 - include ./includes/todo-side
1 -extends ../layout
2 -
3 -block content
4 - .container
5 - h1.page-header 회원정보 수정
6 - form(action='/users/#{user._id}?_method=PUT', method='POST')
7 - .form-group
8 - label(for='name') Name
9 - input.form-control(type='text', id='name', name='name', placeholder='Your name', value=user.name)
10 - .form-group
11 - label(for='email') Email address
12 - input.form-control(type='email', id='email', name='email', placeholder='Email', value=user.email)
13 - .form-group
14 - label(for='current_password') 현재 Password
15 - input.form-control(type='password', id='current_password', name='current_password', placeholder='현재 Password')
16 - .form-group
17 - label(for='password') 변경할 Password
18 - input.form-control(type='password', id='password', name='password', placeholder='변경할 Password')
19 - .form-group
20 - label(for='password_confirmation') Password 확인
21 - input.form-control(type='password', id='password_confirmation', name='password_confirmation', placeholder='변경할 Password 확인')
22 - div.form-actions
23 - a.btn.btn-default(href='javascript:window.history.back();') 뒤로
24 - |
25 - button.btn.btn-primary(type='submit') 수정
1 -extends ../layout
2 -
3 -block content
4 - .container
5 - h1.page-header 회원 목록
6 -
7 - table.table.table-striped.table-bordered
8 - thead
9 - tr
10 - th 이름
11 - th 이메일
12 - th 가입일시
13 - th
14 - tbody
15 - each user in users
16 - tr
17 - td
18 - a(href='/users/#{user._id}')= user.name
19 - td= user.email
20 - td= moment(user.createdAt).format('YYYY-MM-DD HH:mm:ss')
21 - td
22 - a.btn.btn-xs.btn-default(href='/users/#{user._id}/edit') 수정
23 - |
24 - a.btn.btn-xs.btn-default(href='/users/#{user._id}?_method=DELETE') 삭제
25 - a.btn.btn-primary(href='/users/new') 사용자추가
1 -extends ../layout
2 -
3 -block content
4 - .container
5 - h1.page-header 회원가입
6 - form(action='/users', method='POST')
7 - .form-group
8 - label(for='name') Name
9 - input.form-control(type='text', id='name', name='name', placeholder='Your name')
10 - .form-group
11 - label(for='email') Email address
12 - input.form-control(type='email', id='email', name='email', placeholder='Email')
13 - .form-group
14 - label(for='password') Password
15 - input.form-control(type='password', id='password', name='password', placeholder='Password')
16 - .form-group
17 - label(for='password_confirmation') Password 확인
18 - input.form-control(type='password', id='password_confirmation', name='password_confirmation', placeholder='Password')
19 - div.form-actions
20 - a.btn.btn-default(href='javascript:window.history.back();') 뒤로
21 - |
22 - button.btn.btn-primary(type='submit') 회원가입
1 -extends ../layout
2 -
3 -block content
4 - .container
5 - h1.page-header 회원 정보
6 -
7 - ul
8 - li 이름: #{user.name}
9 - li 이메일: #{user.email}
10 -
11 - hr
12 - p
13 - a.btn.btn-default(href='/users/') 목록
14 - |
15 - a.btn.btn-default(href='/users/#{user._id}/edit') 수정
16 - |
17 - a.btn.btn-default(href='/users/#{user._id}?_method=DELETE') 삭제
1 +var path = require('path');
2 +
3 +module.exports = {
4 + includePaths: [
5 + path.join(__dirname, 'app/assets/stylesheets')
6 + ]
7 +};
1 +// Fixed Width Icons
2 +// -------------------------
3 +.@{fa-css-prefix}-fw {
4 + width: (18em / 14);
5 + text-align: center;
6 +}
1 +// Fixed Width Icons
2 +// -------------------------
3 +.#{$fa-css-prefix}-fw {
4 + width: (18em / 14);
5 + text-align: center;
6 +}
1 +// Mixins
2 +// --------------------------
3 +
4 +@mixin fa-icon() {
5 + display: inline-block;
6 + font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration
7 + font-size: inherit; // can't have font-size inherit on line above, so need to override
8 + text-rendering: auto; // optimizelegibility throws things off #1094
9 + -webkit-font-smoothing: antialiased;
10 + -moz-osx-font-smoothing: grayscale;
11 +
12 +}
13 +
14 +@mixin fa-icon-rotate($degrees, $rotation) {
15 + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation});
16 + -webkit-transform: rotate($degrees);
17 + -ms-transform: rotate($degrees);
18 + transform: rotate($degrees);
19 +}
20 +
21 +@mixin fa-icon-flip($horiz, $vert, $rotation) {
22 + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation});
23 + -webkit-transform: scale($horiz, $vert);
24 + -ms-transform: scale($horiz, $vert);
25 + transform: scale($horiz, $vert);
26 +}
1 +{
2 + "name": "jquery",
3 + "version": "2.1.4",
4 + "main": "dist/jquery.js",
5 + "license": "MIT",
6 + "ignore": [
7 + "**/.*",
8 + "build",
9 + "dist/cdn",
10 + "speed",
11 + "test",
12 + "*.md",
13 + "AUTHORS.txt",
14 + "Gruntfile.js",
15 + "package.json"
16 + ],
17 + "devDependencies": {
18 + "sizzle": "2.1.1-jquery.2.1.2",
19 + "requirejs": "2.1.10",
20 + "qunit": "1.14.0",
21 + "sinon": "1.8.1"
22 + },
23 + "keywords": [
24 + "jquery",
25 + "javascript",
26 + "library"
27 + ],
28 + "homepage": "https://github.com/jquery/jquery",
29 + "_release": "2.1.4",
30 + "_resolution": {
31 + "type": "version",
32 + "tag": "2.1.4",
33 + "commit": "7751e69b615c6eca6f783a81e292a55725af6b85"
34 + },
35 + "_source": "git://github.com/jquery/jquery.git",
36 + "_target": ">= 1.9.1",
37 + "_originalSource": "jquery"
38 +}
...\ No newline at end of file ...\ No newline at end of file
1 +Copyright 2014 jQuery Foundation and other contributors
2 +http://jquery.com/
3 +
4 +Permission is hereby granted, free of charge, to any person obtaining
5 +a copy of this software and associated documentation files (the
6 +"Software"), to deal in the Software without restriction, including
7 +without limitation the rights to use, copy, modify, merge, publish,
8 +distribute, sublicense, and/or sell copies of the Software, and to
9 +permit persons to whom the Software is furnished to do so, subject to
10 +the following conditions:
11 +
12 +The above copyright notice and this permission notice shall be
13 +included in all copies or substantial portions of the Software.
14 +
15 +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18 +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19 +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20 +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21 +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1 +define([
2 + "../core",
3 + "../core/parseHTML",
4 + "../ajax",
5 + "../traversing",
6 + "../manipulation",
7 + "../selector",
8 + // Optional event/alias dependency
9 + "../event/alias"
10 +], function( jQuery ) {
11 +
12 +// Keep a copy of the old load method
13 +var _load = jQuery.fn.load;
14 +
15 +/**
16 + * Load a url into a page
17 + */
18 +jQuery.fn.load = function( url, params, callback ) {
19 + if ( typeof url !== "string" && _load ) {
20 + return _load.apply( this, arguments );
21 + }
22 +
23 + var selector, type, response,
24 + self = this,
25 + off = url.indexOf(" ");
26 +
27 + if ( off >= 0 ) {
28 + selector = jQuery.trim( url.slice( off ) );
29 + url = url.slice( 0, off );
30 + }
31 +
32 + // If it's a function
33 + if ( jQuery.isFunction( params ) ) {
34 +
35 + // We assume that it's the callback
36 + callback = params;
37 + params = undefined;
38 +
39 + // Otherwise, build a param string
40 + } else if ( params && typeof params === "object" ) {
41 + type = "POST";
42 + }
43 +
44 + // If we have elements to modify, make the request
45 + if ( self.length > 0 ) {
46 + jQuery.ajax({
47 + url: url,
48 +
49 + // if "type" variable is undefined, then "GET" method will be used
50 + type: type,
51 + dataType: "html",
52 + data: params
53 + }).done(function( responseText ) {
54 +
55 + // Save response for use in complete callback
56 + response = arguments;
57 +
58 + self.html( selector ?
59 +
60 + // If a selector was specified, locate the right elements in a dummy div
61 + // Exclude scripts to avoid IE 'Permission Denied' errors
62 + jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
63 +
64 + // Otherwise use the full result
65 + responseText );
66 +
67 + }).complete( callback && function( jqXHR, status ) {
68 + self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
69 + });
70 + }
71 +
72 + return this;
73 +};
74 +
75 +});
1 +define([
2 + "../core",
3 + "../ajax"
4 +], function( jQuery ) {
5 +
6 +// Install script dataType
7 +jQuery.ajaxSetup({
8 + accepts: {
9 + script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
10 + },
11 + contents: {
12 + script: /(?:java|ecma)script/
13 + },
14 + converters: {
15 + "text script": function( text ) {
16 + jQuery.globalEval( text );
17 + return text;
18 + }
19 + }
20 +});
21 +
22 +// Handle cache's special case and crossDomain
23 +jQuery.ajaxPrefilter( "script", function( s ) {
24 + if ( s.cache === undefined ) {
25 + s.cache = false;
26 + }
27 + if ( s.crossDomain ) {
28 + s.type = "GET";
29 + }
30 +});
31 +
32 +// Bind script tag hack transport
33 +jQuery.ajaxTransport( "script", function( s ) {
34 + // This transport only deals with cross domain requests
35 + if ( s.crossDomain ) {
36 + var script, callback;
37 + return {
38 + send: function( _, complete ) {
39 + script = jQuery("<script>").prop({
40 + async: true,
41 + charset: s.scriptCharset,
42 + src: s.url
43 + }).on(
44 + "load error",
45 + callback = function( evt ) {
46 + script.remove();
47 + callback = null;
48 + if ( evt ) {
49 + complete( evt.type === "error" ? 404 : 200, evt.type );
50 + }
51 + }
52 + );
53 + document.head.appendChild( script[ 0 ] );
54 + },
55 + abort: function() {
56 + if ( callback ) {
57 + callback();
58 + }
59 + }
60 + };
61 + }
62 +});
63 +
64 +});
1 +define([
2 + "../../core"
3 +], function( jQuery ) {
4 + return jQuery.now();
5 +});
1 +define(function() {
2 + return (/\?/);
3 +});
1 +define([
2 + "../core",
3 + "../core/access",
4 + "./support"
5 +], function( jQuery, access, support ) {
6 +
7 +var rfocusable = /^(?:input|select|textarea|button)$/i;
8 +
9 +jQuery.fn.extend({
10 + prop: function( name, value ) {
11 + return access( this, jQuery.prop, name, value, arguments.length > 1 );
12 + },
13 +
14 + removeProp: function( name ) {
15 + return this.each(function() {
16 + delete this[ jQuery.propFix[ name ] || name ];
17 + });
18 + }
19 +});
20 +
21 +jQuery.extend({
22 + propFix: {
23 + "for": "htmlFor",
24 + "class": "className"
25 + },
26 +
27 + prop: function( elem, name, value ) {
28 + var ret, hooks, notxml,
29 + nType = elem.nodeType;
30 +
31 + // Don't get/set properties on text, comment and attribute nodes
32 + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
33 + return;
34 + }
35 +
36 + notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
37 +
38 + if ( notxml ) {
39 + // Fix name and attach hooks
40 + name = jQuery.propFix[ name ] || name;
41 + hooks = jQuery.propHooks[ name ];
42 + }
43 +
44 + if ( value !== undefined ) {
45 + return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
46 + ret :
47 + ( elem[ name ] = value );
48 +
49 + } else {
50 + return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
51 + ret :
52 + elem[ name ];
53 + }
54 + },
55 +
56 + propHooks: {
57 + tabIndex: {
58 + get: function( elem ) {
59 + return elem.hasAttribute( "tabindex" ) || rfocusable.test( elem.nodeName ) || elem.href ?
60 + elem.tabIndex :
61 + -1;
62 + }
63 + }
64 + }
65 +});
66 +
67 +if ( !support.optSelected ) {
68 + jQuery.propHooks.selected = {
69 + get: function( elem ) {
70 + var parent = elem.parentNode;
71 + if ( parent && parent.parentNode ) {
72 + parent.parentNode.selectedIndex;
73 + }
74 + return null;
75 + }
76 + };
77 +}
78 +
79 +jQuery.each([
80 + "tabIndex",
81 + "readOnly",
82 + "maxLength",
83 + "cellSpacing",
84 + "cellPadding",
85 + "rowSpan",
86 + "colSpan",
87 + "useMap",
88 + "frameBorder",
89 + "contentEditable"
90 +], function() {
91 + jQuery.propFix[ this.toLowerCase() ] = this;
92 +});
93 +
94 +});
1 +define([
2 + "../var/support"
3 +], function( support ) {
4 +
5 +(function() {
6 + var input = document.createElement( "input" ),
7 + select = document.createElement( "select" ),
8 + opt = select.appendChild( document.createElement( "option" ) );
9 +
10 + input.type = "checkbox";
11 +
12 + // Support: iOS<=5.1, Android<=4.2+
13 + // Default value for a checkbox should be "on"
14 + support.checkOn = input.value !== "";
15 +
16 + // Support: IE<=11+
17 + // Must access selectedIndex to make default options select
18 + support.optSelected = opt.selected;
19 +
20 + // Support: Android<=2.3
21 + // Options inside disabled selects are incorrectly marked as disabled
22 + select.disabled = true;
23 + support.optDisabled = !opt.disabled;
24 +
25 + // Support: IE<=11+
26 + // An input loses its value after becoming a radio
27 + input = document.createElement( "input" );
28 + input.value = "t";
29 + input.type = "radio";
30 + support.radioValue = input.value === "t";
31 +})();
32 +
33 +return support;
34 +
35 +});
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 +});
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 +});
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 +});
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 +});
1 +define(function() {
2 + // Match a standalone tag
3 + return (/^<(\w+)\s*\/?>(?:<\/\1>|)$/);
4 +});
1 +define(function() {
2 +
3 +function addGetHookIf( conditionFn, hookFn ) {
4 + // Define the hook, we'll check on the first run if it's really needed.
5 + return {
6 + get: function() {
7 + if ( conditionFn() ) {
8 + // Hook not needed (or it's not possible to use it due
9 + // to missing dependency), remove it.
10 + delete this.get;
11 + return;
12 + }
13 +
14 + // Hook needed; redefine it so that the support test is not executed again.
15 + return (this.get = hookFn).apply( this, arguments );
16 + }
17 + };
18 +}
19 +
20 +return addGetHookIf;
21 +
22 +});
1 +define([
2 + "../core",
3 + "./var/rnumnonpx",
4 + "./var/rmargin",
5 + "./var/getStyles",
6 + "../selector" // contains
7 +], function( jQuery, rnumnonpx, rmargin, getStyles ) {
8 +
9 +function curCSS( elem, name, computed ) {
10 + var width, minWidth, maxWidth, ret,
11 + style = elem.style;
12 +
13 + computed = computed || getStyles( elem );
14 +
15 + // Support: IE9
16 + // getPropertyValue is only needed for .css('filter') (#12537)
17 + if ( computed ) {
18 + ret = computed.getPropertyValue( name ) || computed[ name ];
19 + }
20 +
21 + if ( computed ) {
22 +
23 + if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
24 + ret = jQuery.style( elem, name );
25 + }
26 +
27 + // Support: iOS < 6
28 + // A tribute to the "awesome hack by Dean Edwards"
29 + // iOS < 6 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
30 + // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
31 + if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
32 +
33 + // Remember the original values
34 + width = style.width;
35 + minWidth = style.minWidth;
36 + maxWidth = style.maxWidth;
37 +
38 + // Put in the new values to get a computed value out
39 + style.minWidth = style.maxWidth = style.width = ret;
40 + ret = computed.width;
41 +
42 + // Revert the changed values
43 + style.width = width;
44 + style.minWidth = minWidth;
45 + style.maxWidth = maxWidth;
46 + }
47 + }
48 +
49 + return ret !== undefined ?
50 + // Support: IE
51 + // IE returns zIndex value as an integer.
52 + ret + "" :
53 + ret;
54 +}
55 +
56 +return curCSS;
57 +});
1 +define([
2 + "../core",
3 + "../manipulation" // appendTo
4 +], function( jQuery ) {
5 +
6 +var iframe,
7 + elemdisplay = {};
8 +
9 +/**
10 + * Retrieve the actual display of a element
11 + * @param {String} name nodeName of the element
12 + * @param {Object} doc Document object
13 + */
14 +// Called only from within defaultDisplay
15 +function actualDisplay( name, doc ) {
16 + var style,
17 + elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
18 +
19 + // getDefaultComputedStyle might be reliably used only on attached element
20 + display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ?
21 +
22 + // Use of this method is a temporary fix (more like optimization) until something better comes along,
23 + // since it was removed from specification and supported only in FF
24 + style.display : jQuery.css( elem[ 0 ], "display" );
25 +
26 + // We don't have any data stored on the element,
27 + // so use "detach" method as fast way to get rid of the element
28 + elem.detach();
29 +
30 + return display;
31 +}
32 +
33 +/**
34 + * Try to determine the default display value of an element
35 + * @param {String} nodeName
36 + */
37 +function defaultDisplay( nodeName ) {
38 + var doc = document,
39 + display = elemdisplay[ nodeName ];
40 +
41 + if ( !display ) {
42 + display = actualDisplay( nodeName, doc );
43 +
44 + // If the simple way fails, read from inside an iframe
45 + if ( display === "none" || !display ) {
46 +
47 + // Use the already-created iframe if possible
48 + iframe = (iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" )).appendTo( doc.documentElement );
49 +
50 + // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
51 + doc = iframe[ 0 ].contentDocument;
52 +
53 + // Support: IE
54 + doc.write();
55 + doc.close();
56 +
57 + display = actualDisplay( nodeName, doc );
58 + iframe.detach();
59 + }
60 +
61 + // Store the correct default display
62 + elemdisplay[ nodeName ] = display;
63 + }
64 +
65 + return display;
66 +}
67 +
68 +return defaultDisplay;
69 +
70 +});
1 +define([
2 + "../core",
3 + "../var/support"
4 +], function( jQuery, support ) {
5 +
6 +(function() {
7 + var pixelPositionVal, boxSizingReliableVal,
8 + docElem = document.documentElement,
9 + container = document.createElement( "div" ),
10 + div = document.createElement( "div" );
11 +
12 + if ( !div.style ) {
13 + return;
14 + }
15 +
16 + // Support: IE9-11+
17 + // Style of cloned element affects source element cloned (#8908)
18 + div.style.backgroundClip = "content-box";
19 + div.cloneNode( true ).style.backgroundClip = "";
20 + support.clearCloneStyle = div.style.backgroundClip === "content-box";
21 +
22 + container.style.cssText = "border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;" +
23 + "position:absolute";
24 + container.appendChild( div );
25 +
26 + // Executing both pixelPosition & boxSizingReliable tests require only one layout
27 + // so they're executed at the same time to save the second computation.
28 + function computePixelPositionAndBoxSizingReliable() {
29 + div.style.cssText =
30 + // Support: Firefox<29, Android 2.3
31 + // Vendor-prefix box-sizing
32 + "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;" +
33 + "box-sizing:border-box;display:block;margin-top:1%;top:1%;" +
34 + "border:1px;padding:1px;width:4px;position:absolute";
35 + div.innerHTML = "";
36 + docElem.appendChild( container );
37 +
38 + var divStyle = window.getComputedStyle( div, null );
39 + pixelPositionVal = divStyle.top !== "1%";
40 + boxSizingReliableVal = divStyle.width === "4px";
41 +
42 + docElem.removeChild( container );
43 + }
44 +
45 + // Support: node.js jsdom
46 + // Don't assume that getComputedStyle is a property of the global object
47 + if ( window.getComputedStyle ) {
48 + jQuery.extend( support, {
49 + pixelPosition: function() {
50 +
51 + // This test is executed only once but we still do memoizing
52 + // since we can use the boxSizingReliable pre-computing.
53 + // No need to check if the test was already performed, though.
54 + computePixelPositionAndBoxSizingReliable();
55 + return pixelPositionVal;
56 + },
57 + boxSizingReliable: function() {
58 + if ( boxSizingReliableVal == null ) {
59 + computePixelPositionAndBoxSizingReliable();
60 + }
61 + return boxSizingReliableVal;
62 + },
63 + reliableMarginRight: function() {
64 +
65 + // Support: Android 2.3
66 + // Check if div with explicit width and no margin-right incorrectly
67 + // gets computed margin-right based on width of container. (#3333)
68 + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
69 + // This support function is only executed once so no memoizing is needed.
70 + var ret,
71 + marginDiv = div.appendChild( document.createElement( "div" ) );
72 +
73 + // Reset CSS: box-sizing; display; margin; border; padding
74 + marginDiv.style.cssText = div.style.cssText =
75 + // Support: Firefox<29, Android 2.3
76 + // Vendor-prefix box-sizing
77 + "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
78 + "box-sizing:content-box;display:block;margin:0;border:0;padding:0";
79 + marginDiv.style.marginRight = marginDiv.style.width = "0";
80 + div.style.width = "1px";
81 + docElem.appendChild( container );
82 +
83 + ret = !parseFloat( window.getComputedStyle( marginDiv, null ).marginRight );
84 +
85 + docElem.removeChild( container );
86 + div.removeChild( marginDiv );
87 +
88 + return ret;
89 + }
90 + });
91 + }
92 +})();
93 +
94 +return support;
95 +
96 +});
1 +define([
2 + "../core"
3 +], function( jQuery ) {
4 +
5 +// A method for quickly swapping in/out CSS properties to get correct calculations.
6 +jQuery.swap = function( elem, options, callback, args ) {
7 + var ret, name,
8 + old = {};
9 +
10 + // Remember the old values, and insert the new ones
11 + for ( name in options ) {
12 + old[ name ] = elem.style[ name ];
13 + elem.style[ name ] = options[ name ];
14 + }
15 +
16 + ret = callback.apply( elem, args || [] );
17 +
18 + // Revert the old values
19 + for ( name in options ) {
20 + elem.style[ name ] = old[ name ];
21 + }
22 +
23 + return ret;
24 +};
25 +
26 +return jQuery.swap;
27 +
28 +});
1 +define(function() {
2 + return [ "Top", "Right", "Bottom", "Left" ];
3 +});
1 +define(function() {
2 + return function( elem ) {
3 + // Support: IE<=11+, Firefox<=30+ (#15098, #14150)
4 + // IE throws on elements created in popups
5 + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
6 + if ( elem.ownerDocument.defaultView.opener ) {
7 + return elem.ownerDocument.defaultView.getComputedStyle( elem, null );
8 + }
9 +
10 + return window.getComputedStyle( elem, null );
11 + };
12 +});
1 +define([
2 + "../../core",
3 + "../../selector"
4 + // css is assumed
5 +], function( jQuery ) {
6 +
7 + return function( elem, el ) {
8 + // isHidden might be called from jQuery#filter function;
9 + // in that case, element will be second argument
10 + elem = el || elem;
11 + return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
12 + };
13 +});
1 +define(function() {
2 + return (/^margin/);
3 +});
1 +define([
2 + "../../var/pnum"
3 +], function( pnum ) {
4 + return new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
5 +});
1 +define([
2 + "../core"
3 +], function( jQuery ) {
4 +
5 +/**
6 + * Determines whether an object can have data
7 + */
8 +jQuery.acceptData = function( owner ) {
9 + // Accepts only:
10 + // - Node
11 + // - Node.ELEMENT_NODE
12 + // - Node.DOCUMENT_NODE
13 + // - Object
14 + // - Any
15 + /* jshint -W018 */
16 + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
17 +};
18 +
19 +return jQuery.acceptData;
20 +});
1 +define([
2 + "../Data"
3 +], function( Data ) {
4 + return new Data();
5 +});
1 +define([
2 + "../Data"
3 +], function( Data ) {
4 + return new Data();
5 +});
1 +define([
2 + "./core",
3 + "./core/access",
4 + "./css"
5 +], function( jQuery, access ) {
6 +
7 +// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
8 +jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
9 + jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
10 + // Margin is only for outerHeight, outerWidth
11 + jQuery.fn[ funcName ] = function( margin, value ) {
12 + var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
13 + extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
14 +
15 + return access( this, function( elem, type, value ) {
16 + var doc;
17 +
18 + if ( jQuery.isWindow( elem ) ) {
19 + // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
20 + // isn't a whole lot we can do. See pull request at this URL for discussion:
21 + // https://github.com/jquery/jquery/pull/764
22 + return elem.document.documentElement[ "client" + name ];
23 + }
24 +
25 + // Get document width or height
26 + if ( elem.nodeType === 9 ) {
27 + doc = elem.documentElement;
28 +
29 + // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
30 + // whichever is greatest
31 + return Math.max(
32 + elem.body[ "scroll" + name ], doc[ "scroll" + name ],
33 + elem.body[ "offset" + name ], doc[ "offset" + name ],
34 + doc[ "client" + name ]
35 + );
36 + }
37 +
38 + return value === undefined ?
39 + // Get width or height on the element, requesting but not forcing parseFloat
40 + jQuery.css( elem, type, extra ) :
41 +
42 + // Set width or height on the element
43 + jQuery.style( elem, type, value, extra );
44 + }, type, chainable ? margin : undefined, chainable, null );
45 + };
46 + });
47 +});
48 +
49 +return jQuery;
50 +});
1 +define([
2 + "../core",
3 + "../css"
4 +], function( jQuery ) {
5 +
6 +function Tween( elem, options, prop, end, easing ) {
7 + return new Tween.prototype.init( elem, options, prop, end, easing );
8 +}
9 +jQuery.Tween = Tween;
10 +
11 +Tween.prototype = {
12 + constructor: Tween,
13 + init: function( elem, options, prop, end, easing, unit ) {
14 + this.elem = elem;
15 + this.prop = prop;
16 + this.easing = easing || "swing";
17 + this.options = options;
18 + this.start = this.now = this.cur();
19 + this.end = end;
20 + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
21 + },
22 + cur: function() {
23 + var hooks = Tween.propHooks[ this.prop ];
24 +
25 + return hooks && hooks.get ?
26 + hooks.get( this ) :
27 + Tween.propHooks._default.get( this );
28 + },
29 + run: function( percent ) {
30 + var eased,
31 + hooks = Tween.propHooks[ this.prop ];
32 +
33 + if ( this.options.duration ) {
34 + this.pos = eased = jQuery.easing[ this.easing ](
35 + percent, this.options.duration * percent, 0, 1, this.options.duration
36 + );
37 + } else {
38 + this.pos = eased = percent;
39 + }
40 + this.now = ( this.end - this.start ) * eased + this.start;
41 +
42 + if ( this.options.step ) {
43 + this.options.step.call( this.elem, this.now, this );
44 + }
45 +
46 + if ( hooks && hooks.set ) {
47 + hooks.set( this );
48 + } else {
49 + Tween.propHooks._default.set( this );
50 + }
51 + return this;
52 + }
53 +};
54 +
55 +Tween.prototype.init.prototype = Tween.prototype;
56 +
57 +Tween.propHooks = {
58 + _default: {
59 + get: function( tween ) {
60 + var result;
61 +
62 + if ( tween.elem[ tween.prop ] != null &&
63 + (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
64 + return tween.elem[ tween.prop ];
65 + }
66 +
67 + // Passing an empty string as a 3rd parameter to .css will automatically
68 + // attempt a parseFloat and fallback to a string if the parse fails.
69 + // Simple values such as "10px" are parsed to Float;
70 + // complex values such as "rotate(1rad)" are returned as-is.
71 + result = jQuery.css( tween.elem, tween.prop, "" );
72 + // Empty strings, null, undefined and "auto" are converted to 0.
73 + return !result || result === "auto" ? 0 : result;
74 + },
75 + set: function( tween ) {
76 + // Use step hook for back compat.
77 + // Use cssHook if its there.
78 + // Use .style if available and use plain properties where available.
79 + if ( jQuery.fx.step[ tween.prop ] ) {
80 + jQuery.fx.step[ tween.prop ]( tween );
81 + } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
82 + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
83 + } else {
84 + tween.elem[ tween.prop ] = tween.now;
85 + }
86 + }
87 + }
88 +};
89 +
90 +// Support: IE9
91 +// Panic based approach to setting things on disconnected nodes
92 +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
93 + set: function( tween ) {
94 + if ( tween.elem.nodeType && tween.elem.parentNode ) {
95 + tween.elem[ tween.prop ] = tween.now;
96 + }
97 + }
98 +};
99 +
100 +jQuery.easing = {
101 + linear: function( p ) {
102 + return p;
103 + },
104 + swing: function( p ) {
105 + return 0.5 - Math.cos( p * Math.PI ) / 2;
106 + }
107 +};
108 +
109 +jQuery.fx = Tween.prototype.init;
110 +
111 +// Back Compat <1.8 extension point
112 +jQuery.fx.step = {};
113 +
114 +});
1 +define([
2 + "../core",
3 + "../event"
4 +], function( jQuery ) {
5 +
6 +// Attach a bunch of functions for handling common AJAX events
7 +jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ) {
8 + jQuery.fn[ type ] = function( fn ) {
9 + return this.on( type, fn );
10 + };
11 +});
12 +
13 +});
1 +define([
2 + "../core",
3 + "../event"
4 +], function( jQuery ) {
5 +
6 +jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
7 + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
8 + "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
9 +
10 + // Handle event binding
11 + jQuery.fn[ name ] = function( data, fn ) {
12 + return arguments.length > 0 ?
13 + this.on( name, null, data, fn ) :
14 + this.trigger( name );
15 + };
16 +});
17 +
18 +jQuery.fn.extend({
19 + hover: function( fnOver, fnOut ) {
20 + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
21 + },
22 +
23 + bind: function( types, data, fn ) {
24 + return this.on( types, null, data, fn );
25 + },
26 + unbind: function( types, fn ) {
27 + return this.off( types, null, fn );
28 + },
29 +
30 + delegate: function( selector, types, data, fn ) {
31 + return this.on( types, selector, data, fn );
32 + },
33 + undelegate: function( selector, types, fn ) {
34 + // ( namespace ) or ( selector, types [, fn] )
35 + return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
36 + }
37 +});
38 +
39 +});
1 +define([
2 + "../var/support"
3 +], function( support ) {
4 +
5 +support.focusinBubbles = "onfocusin" in window;
6 +
7 +return support;
8 +
9 +});
1 +define([
2 + "../core"
3 +], function( jQuery ) {
4 +
5 +// Register as a named AMD module, since jQuery can be concatenated with other
6 +// files that may use define, but not via a proper concatenation script that
7 +// understands anonymous AMD modules. A named AMD is safest and most robust
8 +// way to register. Lowercase jquery is used because AMD module names are
9 +// derived from file names, and jQuery is normally delivered in a lowercase
10 +// file name. Do this after creating the global so that if an AMD module wants
11 +// to call noConflict to hide this version of jQuery, it will work.
12 +
13 +// Note that for maximum portability, libraries that are not jQuery should
14 +// declare themselves as anonymous modules, and avoid setting a global if an
15 +// AMD loader is present. jQuery is a special case. For more information, see
16 +// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
17 +
18 +if ( typeof define === "function" && define.amd ) {
19 + define( "jquery", [], function() {
20 + return jQuery;
21 + });
22 +}
23 +
24 +});
1 +define([
2 + "../core",
3 + "../var/strundefined"
4 +], function( jQuery, strundefined ) {
5 +
6 +var
7 + // Map over jQuery in case of overwrite
8 + _jQuery = window.jQuery,
9 +
10 + // Map over the $ in case of overwrite
11 + _$ = window.$;
12 +
13 +jQuery.noConflict = function( deep ) {
14 + if ( window.$ === jQuery ) {
15 + window.$ = _$;
16 + }
17 +
18 + if ( deep && window.jQuery === jQuery ) {
19 + window.jQuery = _jQuery;
20 + }
21 +
22 + return jQuery;
23 +};
24 +
25 +// Expose jQuery and $ identifiers, even in AMD
26 +// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
27 +// and CommonJS for browser emulators (#13566)
28 +if ( typeof noGlobal === strundefined ) {
29 + window.jQuery = window.$ = jQuery;
30 +}
31 +
32 +});
1 +/*!
2 + * jQuery JavaScript Library v@VERSION
3 + * http://jquery.com/
4 + *
5 + * Includes Sizzle.js
6 + * http://sizzlejs.com/
7 + *
8 + * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors
9 + * Released under the MIT license
10 + * http://jquery.org/license
11 + *
12 + * Date: @DATE
13 + */
14 +
15 +(function( global, factory ) {
16 +
17 + if ( typeof module === "object" && typeof module.exports === "object" ) {
18 + // For CommonJS and CommonJS-like environments where a proper `window`
19 + // is present, execute the factory and get jQuery.
20 + // For environments that do not have a `window` with a `document`
21 + // (such as Node.js), expose a factory as module.exports.
22 + // This accentuates the need for the creation of a real `window`.
23 + // e.g. var jQuery = require("jquery")(window);
24 + // See ticket #14549 for more info.
25 + module.exports = global.document ?
26 + factory( global, true ) :
27 + function( w ) {
28 + if ( !w.document ) {
29 + throw new Error( "jQuery requires a window with a document" );
30 + }
31 + return factory( w );
32 + };
33 + } else {
34 + factory( global );
35 + }
36 +
37 +// Pass this if window is not defined yet
38 +}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
39 +
40 +// Support: Firefox 18+
41 +// Can't be in strict mode, several libs including ASP.NET trace
42 +// the stack via arguments.caller.callee and Firefox dies if
43 +// you try to trace through "use strict" call chains. (#13335)
44 +//"use strict";
1 +define([
2 + "./core",
3 + "./selector",
4 + "./traversing",
5 + "./callbacks",
6 + "./deferred",
7 + "./core/ready",
8 + "./data",
9 + "./queue",
10 + "./queue/delay",
11 + "./attributes",
12 + "./event",
13 + "./event/alias",
14 + "./manipulation",
15 + "./manipulation/_evalUrl",
16 + "./wrap",
17 + "./css",
18 + "./css/hiddenVisibleSelectors",
19 + "./serialize",
20 + "./ajax",
21 + "./ajax/xhr",
22 + "./ajax/script",
23 + "./ajax/jsonp",
24 + "./ajax/load",
25 + "./event/ajax",
26 + "./effects",
27 + "./effects/animatedSelector",
28 + "./offset",
29 + "./dimensions",
30 + "./deprecated",
31 + "./exports/amd",
32 + "./exports/global"
33 +], function( jQuery ) {
34 +
35 +return jQuery;
36 +
37 +});
1 +define([
2 + "../ajax"
3 +], function( jQuery ) {
4 +
5 +jQuery._evalUrl = function( url ) {
6 + return jQuery.ajax({
7 + url: url,
8 + type: "GET",
9 + dataType: "script",
10 + async: false,
11 + global: false,
12 + "throws": true
13 + });
14 +};
15 +
16 +return jQuery._evalUrl;
17 +
18 +});
1 +define([
2 + "../var/support"
3 +], function( support ) {
4 +
5 +(function() {
6 + var fragment = document.createDocumentFragment(),
7 + div = fragment.appendChild( document.createElement( "div" ) ),
8 + input = document.createElement( "input" );
9 +
10 + // Support: Safari<=5.1
11 + // Check state lost if the name is set (#11217)
12 + // Support: Windows Web Apps (WWA)
13 + // `name` and `type` must use .setAttribute for WWA (#14901)
14 + input.setAttribute( "type", "radio" );
15 + input.setAttribute( "checked", "checked" );
16 + input.setAttribute( "name", "t" );
17 +
18 + div.appendChild( input );
19 +
20 + // Support: Safari<=5.1, Android<4.2
21 + // Older WebKit doesn't clone checked state correctly in fragments
22 + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
23 +
24 + // Support: IE<=11+
25 + // Make sure textarea (and checkbox) defaultValue is properly cloned
26 + div.innerHTML = "<textarea>x</textarea>";
27 + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
28 +})();
29 +
30 +return support;
31 +
32 +});
1 +define(function() {
2 + return (/^(?:checkbox|radio)$/i);
3 +});
1 +define([
2 + "./core",
3 + "./data/var/data_priv",
4 + "./deferred",
5 + "./callbacks"
6 +], function( jQuery, data_priv ) {
7 +
8 +jQuery.extend({
9 + queue: function( elem, type, data ) {
10 + var queue;
11 +
12 + if ( elem ) {
13 + type = ( type || "fx" ) + "queue";
14 + queue = data_priv.get( elem, type );
15 +
16 + // Speed up dequeue by getting out quickly if this is just a lookup
17 + if ( data ) {
18 + if ( !queue || jQuery.isArray( data ) ) {
19 + queue = data_priv.access( elem, type, jQuery.makeArray(data) );
20 + } else {
21 + queue.push( data );
22 + }
23 + }
24 + return queue || [];
25 + }
26 + },
27 +
28 + dequeue: function( elem, type ) {
29 + type = type || "fx";
30 +
31 + var queue = jQuery.queue( elem, type ),
32 + startLength = queue.length,
33 + fn = queue.shift(),
34 + hooks = jQuery._queueHooks( elem, type ),
35 + next = function() {
36 + jQuery.dequeue( elem, type );
37 + };
38 +
39 + // If the fx queue is dequeued, always remove the progress sentinel
40 + if ( fn === "inprogress" ) {
41 + fn = queue.shift();
42 + startLength--;
43 + }
44 +
45 + if ( fn ) {
46 +
47 + // Add a progress sentinel to prevent the fx queue from being
48 + // automatically dequeued
49 + if ( type === "fx" ) {
50 + queue.unshift( "inprogress" );
51 + }
52 +
53 + // Clear up the last queue stop function
54 + delete hooks.stop;
55 + fn.call( elem, next, hooks );
56 + }
57 +
58 + if ( !startLength && hooks ) {
59 + hooks.empty.fire();
60 + }
61 + },
62 +
63 + // Not public - generate a queueHooks object, or return the current one
64 + _queueHooks: function( elem, type ) {
65 + var key = type + "queueHooks";
66 + return data_priv.get( elem, key ) || data_priv.access( elem, key, {
67 + empty: jQuery.Callbacks("once memory").add(function() {
68 + data_priv.remove( elem, [ type + "queue", key ] );
69 + })
70 + });
71 + }
72 +});
73 +
74 +jQuery.fn.extend({
75 + queue: function( type, data ) {
76 + var setter = 2;
77 +
78 + if ( typeof type !== "string" ) {
79 + data = type;
80 + type = "fx";
81 + setter--;
82 + }
83 +
84 + if ( arguments.length < setter ) {
85 + return jQuery.queue( this[0], type );
86 + }
87 +
88 + return data === undefined ?
89 + this :
90 + this.each(function() {
91 + var queue = jQuery.queue( this, type, data );
92 +
93 + // Ensure a hooks for this queue
94 + jQuery._queueHooks( this, type );
95 +
96 + if ( type === "fx" && queue[0] !== "inprogress" ) {
97 + jQuery.dequeue( this, type );
98 + }
99 + });
100 + },
101 + dequeue: function( type ) {
102 + return this.each(function() {
103 + jQuery.dequeue( this, type );
104 + });
105 + },
106 + clearQueue: function( type ) {
107 + return this.queue( type || "fx", [] );
108 + },
109 + // Get a promise resolved when queues of a certain type
110 + // are emptied (fx is the type by default)
111 + promise: function( type, obj ) {
112 + var tmp,
113 + count = 1,
114 + defer = jQuery.Deferred(),
115 + elements = this,
116 + i = this.length,
117 + resolve = function() {
118 + if ( !( --count ) ) {
119 + defer.resolveWith( elements, [ elements ] );
120 + }
121 + };
122 +
123 + if ( typeof type !== "string" ) {
124 + obj = type;
125 + type = undefined;
126 + }
127 + type = type || "fx";
128 +
129 + while ( i-- ) {
130 + tmp = data_priv.get( elements[ i ], type + "queueHooks" );
131 + if ( tmp && tmp.empty ) {
132 + count++;
133 + tmp.empty.add( resolve );
134 + }
135 + }
136 + resolve();
137 + return defer.promise( obj );
138 + }
139 +});
140 +
141 +return jQuery;
142 +});
1 +define([
2 + "../core",
3 + "../queue",
4 + "../effects" // Delay is optional because of this dependency
5 +], function( jQuery ) {
6 +
7 +// Based off of the plugin by Clint Helfers, with permission.
8 +// http://blindsignals.com/index.php/2009/07/jquery-delay/
9 +jQuery.fn.delay = function( time, type ) {
10 + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
11 + type = type || "fx";
12 +
13 + return this.queue( type, function( next, hooks ) {
14 + var timeout = setTimeout( next, time );
15 + hooks.stop = function() {
16 + clearTimeout( timeout );
17 + };
18 + });
19 +};
20 +
21 +return jQuery.fn.delay;
22 +});
1 +define([
2 + "./core"
3 +], function( jQuery ) {
4 +
5 +/*
6 + * Optional (non-Sizzle) selector module for custom builds.
7 + *
8 + * Note that this DOES NOT SUPPORT many documented jQuery
9 + * features in exchange for its smaller size:
10 + *
11 + * Attribute not equal selector
12 + * Positional selectors (:first; :eq(n); :odd; etc.)
13 + * Type selectors (:input; :checkbox; :button; etc.)
14 + * State-based selectors (:animated; :visible; :hidden; etc.)
15 + * :has(selector)
16 + * :not(complex selector)
17 + * custom selectors via Sizzle extensions
18 + * Leading combinators (e.g., $collection.find("> *"))
19 + * Reliable functionality on XML fragments
20 + * Requiring all parts of a selector to match elements under context
21 + * (e.g., $div.find("div > *") now matches children of $div)
22 + * Matching against non-elements
23 + * Reliable sorting of disconnected nodes
24 + * querySelectorAll bug fixes (e.g., unreliable :focus on WebKit)
25 + *
26 + * If any of these are unacceptable tradeoffs, either use Sizzle or
27 + * customize this stub for the project's specific needs.
28 + */
29 +
30 +var docElem = window.document.documentElement,
31 + selector_hasDuplicate,
32 + matches = docElem.matches ||
33 + docElem.webkitMatchesSelector ||
34 + docElem.mozMatchesSelector ||
35 + docElem.oMatchesSelector ||
36 + docElem.msMatchesSelector,
37 + selector_sortOrder = function( a, b ) {
38 + // Flag for duplicate removal
39 + if ( a === b ) {
40 + selector_hasDuplicate = true;
41 + return 0;
42 + }
43 +
44 + var compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b );
45 +
46 + if ( compare ) {
47 + // Disconnected nodes
48 + if ( compare & 1 ) {
49 +
50 + // Choose the first element that is related to our document
51 + if ( a === document || jQuery.contains(document, a) ) {
52 + return -1;
53 + }
54 + if ( b === document || jQuery.contains(document, b) ) {
55 + return 1;
56 + }
57 +
58 + // Maintain original order
59 + return 0;
60 + }
61 +
62 + return compare & 4 ? -1 : 1;
63 + }
64 +
65 + // Not directly comparable, sort on existence of method
66 + return a.compareDocumentPosition ? -1 : 1;
67 + };
68 +
69 +jQuery.extend({
70 + find: function( selector, context, results, seed ) {
71 + var elem, nodeType,
72 + i = 0;
73 +
74 + results = results || [];
75 + context = context || document;
76 +
77 + // Same basic safeguard as Sizzle
78 + if ( !selector || typeof selector !== "string" ) {
79 + return results;
80 + }
81 +
82 + // Early return if context is not an element or document
83 + if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
84 + return [];
85 + }
86 +
87 + if ( seed ) {
88 + while ( (elem = seed[i++]) ) {
89 + if ( jQuery.find.matchesSelector(elem, selector) ) {
90 + results.push( elem );
91 + }
92 + }
93 + } else {
94 + jQuery.merge( results, context.querySelectorAll(selector) );
95 + }
96 +
97 + return results;
98 + },
99 + unique: function( results ) {
100 + var elem,
101 + duplicates = [],
102 + i = 0,
103 + j = 0;
104 +
105 + selector_hasDuplicate = false;
106 + results.sort( selector_sortOrder );
107 +
108 + if ( selector_hasDuplicate ) {
109 + while ( (elem = results[i++]) ) {
110 + if ( elem === results[ i ] ) {
111 + j = duplicates.push( i );
112 + }
113 + }
114 + while ( j-- ) {
115 + results.splice( duplicates[ j ], 1 );
116 + }
117 + }
118 +
119 + return results;
120 + },
121 + text: function( elem ) {
122 + var node,
123 + ret = "",
124 + i = 0,
125 + nodeType = elem.nodeType;
126 +
127 + if ( !nodeType ) {
128 + // If no nodeType, this is expected to be an array
129 + while ( (node = elem[i++]) ) {
130 + // Do not traverse comment nodes
131 + ret += jQuery.text( node );
132 + }
133 + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
134 + // Use textContent for elements
135 + return elem.textContent;
136 + } else if ( nodeType === 3 || nodeType === 4 ) {
137 + return elem.nodeValue;
138 + }
139 + // Do not include comment or processing instruction nodes
140 +
141 + return ret;
142 + },
143 + contains: function( a, b ) {
144 + var adown = a.nodeType === 9 ? a.documentElement : a,
145 + bup = b && b.parentNode;
146 + return a === bup || !!( bup && bup.nodeType === 1 && adown.contains(bup) );
147 + },
148 + isXMLDoc: function( elem ) {
149 + return (elem.ownerDocument || elem).documentElement.nodeName !== "HTML";
150 + },
151 + expr: {
152 + attrHandle: {},
153 + match: {
154 + bool: /^(?:checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped)$/i,
155 + needsContext: /^[\x20\t\r\n\f]*[>+~]/
156 + }
157 + }
158 +});
159 +
160 +jQuery.extend( jQuery.find, {
161 + matches: function( expr, elements ) {
162 + return jQuery.find( expr, null, null, elements );
163 + },
164 + matchesSelector: function( elem, expr ) {
165 + return matches.call( elem, expr );
166 + },
167 + attr: function( elem, name ) {
168 + return elem.getAttribute( name );
169 + }
170 +});
171 +
172 +});
1 +define([
2 + "./core",
3 + "sizzle"
4 +], function( jQuery, Sizzle ) {
5 +
6 +jQuery.find = Sizzle;
7 +jQuery.expr = Sizzle.selectors;
8 +jQuery.expr[":"] = jQuery.expr.pseudos;
9 +jQuery.unique = Sizzle.uniqueSort;
10 +jQuery.text = Sizzle.getText;
11 +jQuery.isXMLDoc = Sizzle.isXML;
12 +jQuery.contains = Sizzle.contains;
13 +
14 +});
1 +define([ "./selector-sizzle" ]);
1 +define([
2 + "./core",
3 + "./manipulation/var/rcheckableType",
4 + "./core/init",
5 + "./traversing", // filter
6 + "./attributes/prop"
7 +], function( jQuery, rcheckableType ) {
8 +
9 +var r20 = /%20/g,
10 + rbracket = /\[\]$/,
11 + rCRLF = /\r?\n/g,
12 + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
13 + rsubmittable = /^(?:input|select|textarea|keygen)/i;
14 +
15 +function buildParams( prefix, obj, traditional, add ) {
16 + var name;
17 +
18 + if ( jQuery.isArray( obj ) ) {
19 + // Serialize array item.
20 + jQuery.each( obj, function( i, v ) {
21 + if ( traditional || rbracket.test( prefix ) ) {
22 + // Treat each array item as a scalar.
23 + add( prefix, v );
24 +
25 + } else {
26 + // Item is non-scalar (array or object), encode its numeric index.
27 + buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
28 + }
29 + });
30 +
31 + } else if ( !traditional && jQuery.type( obj ) === "object" ) {
32 + // Serialize object item.
33 + for ( name in obj ) {
34 + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
35 + }
36 +
37 + } else {
38 + // Serialize scalar item.
39 + add( prefix, obj );
40 + }
41 +}
42 +
43 +// Serialize an array of form elements or a set of
44 +// key/values into a query string
45 +jQuery.param = function( a, traditional ) {
46 + var prefix,
47 + s = [],
48 + add = function( key, value ) {
49 + // If value is a function, invoke it and return its value
50 + value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
51 + s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
52 + };
53 +
54 + // Set traditional to true for jQuery <= 1.3.2 behavior.
55 + if ( traditional === undefined ) {
56 + traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
57 + }
58 +
59 + // If an array was passed in, assume that it is an array of form elements.
60 + if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
61 + // Serialize the form elements
62 + jQuery.each( a, function() {
63 + add( this.name, this.value );
64 + });
65 +
66 + } else {
67 + // If traditional, encode the "old" way (the way 1.3.2 or older
68 + // did it), otherwise encode params recursively.
69 + for ( prefix in a ) {
70 + buildParams( prefix, a[ prefix ], traditional, add );
71 + }
72 + }
73 +
74 + // Return the resulting serialization
75 + return s.join( "&" ).replace( r20, "+" );
76 +};
77 +
78 +jQuery.fn.extend({
79 + serialize: function() {
80 + return jQuery.param( this.serializeArray() );
81 + },
82 + serializeArray: function() {
83 + return this.map(function() {
84 + // Can add propHook for "elements" to filter or add form elements
85 + var elements = jQuery.prop( this, "elements" );
86 + return elements ? jQuery.makeArray( elements ) : this;
87 + })
88 + .filter(function() {
89 + var type = this.type;
90 +
91 + // Use .is( ":disabled" ) so that fieldset[disabled] works
92 + return this.name && !jQuery( this ).is( ":disabled" ) &&
93 + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
94 + ( this.checked || !rcheckableType.test( type ) );
95 + })
96 + .map(function( i, elem ) {
97 + var val = jQuery( this ).val();
98 +
99 + return val == null ?
100 + null :
101 + jQuery.isArray( val ) ?
102 + jQuery.map( val, function( val ) {
103 + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
104 + }) :
105 + { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
106 + }).get();
107 + }
108 +});
109 +
110 +return jQuery;
111 +});
1 +define([
2 + "./core",
3 + "./var/indexOf",
4 + "./traversing/var/rneedsContext",
5 + "./core/init",
6 + "./traversing/findFilter",
7 + "./selector"
8 +], function( jQuery, indexOf, rneedsContext ) {
9 +
10 +var rparentsprev = /^(?:parents|prev(?:Until|All))/,
11 + // Methods guaranteed to produce a unique set when starting from a unique set
12 + guaranteedUnique = {
13 + children: true,
14 + contents: true,
15 + next: true,
16 + prev: true
17 + };
18 +
19 +jQuery.extend({
20 + dir: function( elem, dir, until ) {
21 + var matched = [],
22 + truncate = until !== undefined;
23 +
24 + while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) {
25 + if ( elem.nodeType === 1 ) {
26 + if ( truncate && jQuery( elem ).is( until ) ) {
27 + break;
28 + }
29 + matched.push( elem );
30 + }
31 + }
32 + return matched;
33 + },
34 +
35 + sibling: function( n, elem ) {
36 + var matched = [];
37 +
38 + for ( ; n; n = n.nextSibling ) {
39 + if ( n.nodeType === 1 && n !== elem ) {
40 + matched.push( n );
41 + }
42 + }
43 +
44 + return matched;
45 + }
46 +});
47 +
48 +jQuery.fn.extend({
49 + has: function( target ) {
50 + var targets = jQuery( target, this ),
51 + l = targets.length;
52 +
53 + return this.filter(function() {
54 + var i = 0;
55 + for ( ; i < l; i++ ) {
56 + if ( jQuery.contains( this, targets[i] ) ) {
57 + return true;
58 + }
59 + }
60 + });
61 + },
62 +
63 + closest: function( selectors, context ) {
64 + var cur,
65 + i = 0,
66 + l = this.length,
67 + matched = [],
68 + pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
69 + jQuery( selectors, context || this.context ) :
70 + 0;
71 +
72 + for ( ; i < l; i++ ) {
73 + for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
74 + // Always skip document fragments
75 + if ( cur.nodeType < 11 && (pos ?
76 + pos.index(cur) > -1 :
77 +
78 + // Don't pass non-elements to Sizzle
79 + cur.nodeType === 1 &&
80 + jQuery.find.matchesSelector(cur, selectors)) ) {
81 +
82 + matched.push( cur );
83 + break;
84 + }
85 + }
86 + }
87 +
88 + return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );
89 + },
90 +
91 + // Determine the position of an element within the set
92 + index: function( elem ) {
93 +
94 + // No argument, return index in parent
95 + if ( !elem ) {
96 + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
97 + }
98 +
99 + // Index in selector
100 + if ( typeof elem === "string" ) {
101 + return indexOf.call( jQuery( elem ), this[ 0 ] );
102 + }
103 +
104 + // Locate the position of the desired element
105 + return indexOf.call( this,
106 +
107 + // If it receives a jQuery object, the first element is used
108 + elem.jquery ? elem[ 0 ] : elem
109 + );
110 + },
111 +
112 + add: function( selector, context ) {
113 + return this.pushStack(
114 + jQuery.unique(
115 + jQuery.merge( this.get(), jQuery( selector, context ) )
116 + )
117 + );
118 + },
119 +
120 + addBack: function( selector ) {
121 + return this.add( selector == null ?
122 + this.prevObject : this.prevObject.filter(selector)
123 + );
124 + }
125 +});
126 +
127 +function sibling( cur, dir ) {
128 + while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {}
129 + return cur;
130 +}
131 +
132 +jQuery.each({
133 + parent: function( elem ) {
134 + var parent = elem.parentNode;
135 + return parent && parent.nodeType !== 11 ? parent : null;
136 + },
137 + parents: function( elem ) {
138 + return jQuery.dir( elem, "parentNode" );
139 + },
140 + parentsUntil: function( elem, i, until ) {
141 + return jQuery.dir( elem, "parentNode", until );
142 + },
143 + next: function( elem ) {
144 + return sibling( elem, "nextSibling" );
145 + },
146 + prev: function( elem ) {
147 + return sibling( elem, "previousSibling" );
148 + },
149 + nextAll: function( elem ) {
150 + return jQuery.dir( elem, "nextSibling" );
151 + },
152 + prevAll: function( elem ) {
153 + return jQuery.dir( elem, "previousSibling" );
154 + },
155 + nextUntil: function( elem, i, until ) {
156 + return jQuery.dir( elem, "nextSibling", until );
157 + },
158 + prevUntil: function( elem, i, until ) {
159 + return jQuery.dir( elem, "previousSibling", until );
160 + },
161 + siblings: function( elem ) {
162 + return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
163 + },
164 + children: function( elem ) {
165 + return jQuery.sibling( elem.firstChild );
166 + },
167 + contents: function( elem ) {
168 + return elem.contentDocument || jQuery.merge( [], elem.childNodes );
169 + }
170 +}, function( name, fn ) {
171 + jQuery.fn[ name ] = function( until, selector ) {
172 + var matched = jQuery.map( this, fn, until );
173 +
174 + if ( name.slice( -5 ) !== "Until" ) {
175 + selector = until;
176 + }
177 +
178 + if ( selector && typeof selector === "string" ) {
179 + matched = jQuery.filter( selector, matched );
180 + }
181 +
182 + if ( this.length > 1 ) {
183 + // Remove duplicates
184 + if ( !guaranteedUnique[ name ] ) {
185 + jQuery.unique( matched );
186 + }
187 +
188 + // Reverse order for parents* and prev-derivatives
189 + if ( rparentsprev.test( name ) ) {
190 + matched.reverse();
191 + }
192 + }
193 +
194 + return this.pushStack( matched );
195 + };
196 +});
197 +
198 +return jQuery;
199 +});
1 +define([
2 + "../core",
3 + "../var/indexOf",
4 + "./var/rneedsContext",
5 + "../selector"
6 +], function( jQuery, indexOf, rneedsContext ) {
7 +
8 +var risSimple = /^.[^:#\[\.,]*$/;
9 +
10 +// Implement the identical functionality for filter and not
11 +function winnow( elements, qualifier, not ) {
12 + if ( jQuery.isFunction( qualifier ) ) {
13 + return jQuery.grep( elements, function( elem, i ) {
14 + /* jshint -W018 */
15 + return !!qualifier.call( elem, i, elem ) !== not;
16 + });
17 +
18 + }
19 +
20 + if ( qualifier.nodeType ) {
21 + return jQuery.grep( elements, function( elem ) {
22 + return ( elem === qualifier ) !== not;
23 + });
24 +
25 + }
26 +
27 + if ( typeof qualifier === "string" ) {
28 + if ( risSimple.test( qualifier ) ) {
29 + return jQuery.filter( qualifier, elements, not );
30 + }
31 +
32 + qualifier = jQuery.filter( qualifier, elements );
33 + }
34 +
35 + return jQuery.grep( elements, function( elem ) {
36 + return ( indexOf.call( qualifier, elem ) >= 0 ) !== not;
37 + });
38 +}
39 +
40 +jQuery.filter = function( expr, elems, not ) {
41 + var elem = elems[ 0 ];
42 +
43 + if ( not ) {
44 + expr = ":not(" + expr + ")";
45 + }
46 +
47 + return elems.length === 1 && elem.nodeType === 1 ?
48 + jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
49 + jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
50 + return elem.nodeType === 1;
51 + }));
52 +};
53 +
54 +jQuery.fn.extend({
55 + find: function( selector ) {
56 + var i,
57 + len = this.length,
58 + ret = [],
59 + self = this;
60 +
61 + if ( typeof selector !== "string" ) {
62 + return this.pushStack( jQuery( selector ).filter(function() {
63 + for ( i = 0; i < len; i++ ) {
64 + if ( jQuery.contains( self[ i ], this ) ) {
65 + return true;
66 + }
67 + }
68 + }) );
69 + }
70 +
71 + for ( i = 0; i < len; i++ ) {
72 + jQuery.find( selector, self[ i ], ret );
73 + }
74 +
75 + // Needed because $( selector, context ) becomes $( context ).find( selector )
76 + ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
77 + ret.selector = this.selector ? this.selector + " " + selector : selector;
78 + return ret;
79 + },
80 + filter: function( selector ) {
81 + return this.pushStack( winnow(this, selector || [], false) );
82 + },
83 + not: function( selector ) {
84 + return this.pushStack( winnow(this, selector || [], true) );
85 + },
86 + is: function( selector ) {
87 + return !!winnow(
88 + this,
89 +
90 + // If this is a positional/relative selector, check membership in the returned set
91 + // so $("p:first").is("p:last") won't return true for a doc with two "p".
92 + typeof selector === "string" && rneedsContext.test( selector ) ?
93 + jQuery( selector ) :
94 + selector || [],
95 + false
96 + ).length;
97 + }
98 +});
99 +
100 +});
1 +define([
2 + "../../core",
3 + "../../selector"
4 +], function( jQuery ) {
5 + return jQuery.expr.match.needsContext;
6 +});
1 +define(function() {
2 + return [];
3 +});
1 +define(function() {
2 + // [[Class]] -> type pairs
3 + return {};
4 +});
1 +define([
2 + "./arr"
3 +], function( arr ) {
4 + return arr.concat;
5 +});
1 +define([
2 + "./class2type"
3 +], function( class2type ) {
4 + return class2type.hasOwnProperty;
5 +});
1 +define([
2 + "./arr"
3 +], function( arr ) {
4 + return arr.indexOf;
5 +});
1 +define(function() {
2 + return (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;
3 +});
1 +define([
2 + "./arr"
3 +], function( arr ) {
4 + return arr.push;
5 +});
1 +define(function() {
2 + return (/\S+/g);
3 +});
1 +define([
2 + "./arr"
3 +], function( arr ) {
4 + return arr.slice;
5 +});
1 +define(function() {
2 + return typeof undefined;
3 +});
1 +define(function() {
2 + // All support tests are defined in their respective modules.
3 + return {};
4 +});
1 +define([
2 + "./class2type"
3 +], function( class2type ) {
4 + return class2type.toString;
5 +});
1 +define([
2 + "./core",
3 + "./core/init",
4 + "./manipulation", // clone
5 + "./traversing" // parent, contents
6 +], function( jQuery ) {
7 +
8 +jQuery.fn.extend({
9 + wrapAll: function( html ) {
10 + var wrap;
11 +
12 + if ( jQuery.isFunction( html ) ) {
13 + return this.each(function( i ) {
14 + jQuery( this ).wrapAll( html.call(this, i) );
15 + });
16 + }
17 +
18 + if ( this[ 0 ] ) {
19 +
20 + // The elements to wrap the target around
21 + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
22 +
23 + if ( this[ 0 ].parentNode ) {
24 + wrap.insertBefore( this[ 0 ] );
25 + }
26 +
27 + wrap.map(function() {
28 + var elem = this;
29 +
30 + while ( elem.firstElementChild ) {
31 + elem = elem.firstElementChild;
32 + }
33 +
34 + return elem;
35 + }).append( this );
36 + }
37 +
38 + return this;
39 + },
40 +
41 + wrapInner: function( html ) {
42 + if ( jQuery.isFunction( html ) ) {
43 + return this.each(function( i ) {
44 + jQuery( this ).wrapInner( html.call(this, i) );
45 + });
46 + }
47 +
48 + return this.each(function() {
49 + var self = jQuery( this ),
50 + contents = self.contents();
51 +
52 + if ( contents.length ) {
53 + contents.wrapAll( html );
54 +
55 + } else {
56 + self.append( html );
57 + }
58 + });
59 + },
60 +
61 + wrap: function( html ) {
62 + var isFunction = jQuery.isFunction( html );
63 +
64 + return this.each(function( i ) {
65 + jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
66 + });
67 + },
68 +
69 + unwrap: function() {
70 + return this.parent().each(function() {
71 + if ( !jQuery.nodeName( this, "body" ) ) {
72 + jQuery( this ).replaceWith( this.childNodes );
73 + }
74 + }).end();
75 + }
76 +});
77 +
78 +return jQuery;
79 +});
1 +// Include gulp
2 +var gulp = require('gulp');
3 +
4 +// Include Our Plugins
5 +var jshint = require('gulp-jshint');
6 +var sass = require('gulp-sass');
7 +var nodemon = require('gulp-nodemon');
8 +var concat = require('gulp-concat');
9 +
10 +// Lint Task
11 +gulp.task('lint', function() {
12 + return gulp.src(['app.js', 'routes/**/*.js', 'models/**/*.js', 'config/**/*.js', 'public/javascripts/**/*.js'])
13 + .pipe(jshint())
14 + .pipe(jshint.reporter('default'));
15 +});
16 +
17 +// Compile Our Sass
18 +gulp.task('sass', function() {
19 + return gulp.src(['scss/*.scss'])
20 + .pipe(sass())
21 + .pipe(concat('style.css'))
22 + .pipe(gulp.dest('public/stylesheets'));
23 +});
24 +
25 +// Watch Files For Changes
26 +gulp.task('watch', function() {
27 + gulp.watch('scss/**/*.scss', ['sass']);
28 +});
29 +
30 +gulp.task('nodemon', function (cb) {
31 + var started = false;
32 + return nodemon({
33 + script: 'bin/www'
34 + }).on('start', function () {
35 + // to avoid nodemon being started multiple times
36 + // thanks @matthisk
37 + if (!started) {
38 + cb();
39 + started = true;
40 + }
41 + });
42 +});
43 +
44 +// Default Task
45 +gulp.task('default', ['lint', 'sass', 'watch', 'nodemon']);
1 +var mongoose = require('mongoose'),
2 + Schema = mongoose.Schema;
3 +
4 +var schema = new Schema({
5 + name: {type: String, required: true, trim: true},
6 + email: {type: String, required: true, index: true, unique: true, trim: true},
7 + password: {type: String},
8 + createdAt: {type: Date, default: Date.now}
9 +}, {
10 + toJSON: { virtuals: true},
11 + toObject: {virtuals: true}
12 +});
13 +
14 +var User = mongoose.model('User', schema);
15 +
16 +module.exports = User;
1 +// 전체 삭제
2 +db.users.drop()
3 +
4 +// Insert (Create)
5 +db.users.insert({name: 'Kim', age: 30, tel: '555-6666', gender: 'm'})
6 +db.users.insert({name: 'Lee', age: 22, tel: '444-6666', gender: 'm'})
7 +db.users.insert({name: 'Cho', age: 23, tel: '222-2222', gender: 'm'})
8 +db.users.insert({name: 'Park', age: 43, gender: 'f', scores: [100, 200, 600]})
9 +db.users.insert({name: 'Choi', age: 26, gender: 'f', department: {name: 'CS', loc: 'Yongin'}})
10 +
11 +// Query (Read)
12 +db.users.find()
13 +db.users.find({gender: 'm'})
14 +db.users.find({name: { $in: ['Park', 'Choi']}})
15 +db.users.find({gender: 'm', age: { $gt: 25}})
16 +db.users.find({$or: [{age: {$lte: 23}}, {gender: 'f'}]})
17 +
18 +db.users.find({scores: 200})
19 +db.users.find({'department.name': 'CS'})
20 +
21 +// Modify (Update)
22 +db.users.update({name: 'Lee'}, {$set: {age: 23}})
23 +db.users.update({name: 'Cho'}, {name: 'Choo', age: 40, scores: [100, 200]})
24 +db.users.update({name: 'Jay'}, {name: 'Jay', gender: 'm', age: 50}, {upsert: true})
25 +db.users.update({name: 'Jay'}, {name: 'Jay', gender: 'f', age: 25}, {upsert: true})
26 +db.users.update({name: 'Choo'}, {$set: {gender: 'f'}})
27 +db.users.update({name: 'Lee'}, {$unset: {tel: 1}})
28 +
29 +// Remove (Delete)
30 +db.users.count()
31 +db.users.remove({name: 'Choi'})
32 +db.users.count()
33 +
34 +// Aggregate
35 +db.users.find()
36 +db.users.aggregate([
37 + {$match: {age: {$gt: 23}}},
38 + {$group: {_id: "$gender", cnt: {$sum: 1} }},
39 + {$sort: {cnt: -1}}
40 +])
1 +{
2 + "name": "ex01",
3 + "version": "0.0.0",
4 + "private": true,
5 + "scripts": {
6 + "start": "node ./bin/www"
7 + },
8 + "dependencies": {
9 + "body-parser": "~1.13.1",
10 + "connect-flash": "^0.1.1",
11 + "cookie-parser": "~1.3.5",
12 + "debug": "~2.2.0",
13 + "express": "~4.13.0",
14 + "express-session": "^1.11.3",
15 + "jade": "~1.11.0",
16 + "method-override": "^2.3.5",
17 + "moment": "^2.10.6",
18 + "mongoose": "^4.1.11",
19 + "morgan": "~1.6.1",
20 + "node-sass-middleware": "0.8.0",
21 + "serve-favicon": "~2.3.0"
22 + },
23 + "devDependencies": {
24 + "gulp": "^3.9.0",
25 + "gulp-concat": "^2.6.0",
26 + "gulp-jshint": "^1.11.2",
27 + "gulp-nodemon": "^2.0.4",
28 + "gulp-sass": "^2.0.4"
29 + }
30 +}
1 +form.todos {
2 + width: 100%;
3 + margin: 0 0 1em 0;
4 + padding: 1em;
5 + background: #acddf2; }
6 + form.todos .main input[type='text'] {
7 + font-size: 1.4em;
8 + border: 1px solid #2c9cd2;
9 + padding: 0.5em 1em;
10 + margin-bottom: 1em;
11 + width: 100%;
12 + box-sizing: border-box; }
13 + form.todos .actions button {
14 + margin-top: 1em; }
15 +
16 +.tasks {
17 + width: 100%;
18 + list-style: none;
19 + padding: 0;
20 + margin: 0; }
21 + .tasks li.task {
22 + border-bottom: 1px solid #eaeaea;
23 + padding: 1em 0; }
24 + .tasks li.task span {
25 + display: inline-block;
26 + margin-right: 1em; }
27 + .tasks li.task .check {
28 + width: 2em;
29 + height: 2em;
30 + border-radius: 1em;
31 + border: 1px solid #2c9cd2;
32 + vertical-align: bottom; }
33 + .tasks li.task .content {
34 + font-size: 1.1em;
35 + font-weight: bold;
36 + line-height: 2em; }
37 + .tasks li.task .category {
38 + float: right;
39 + min-width: 5em;
40 + font-size: 0.9em; }
41 + .tasks li.task .priority {
42 + font-size: 0.8em;
43 + border-radius: 0.8em;
44 + background-color: #888;
45 + color: #fff;
46 + height: 200%;
47 + line-height: 1.6em;
48 + text-align: center;
49 + padding: 0 1em; }
50 + .tasks li.task .priority.p2 {
51 + background-color: #b0b33c; }
52 + .tasks li.task .priority.p3 {
53 + background-color: #a51e23; }
54 + .tasks li.task .deadline {
55 + color: #ccc;
56 + font-size: 0.9em; }
57 +
58 +.side .section {
59 + background: #888;
60 + width: 100%;
61 + color: #fff; }
62 + .side .section a {
63 + color: #fff;
64 + display: inline-block;
65 + text-decoration: none;
66 + width: 100%;
67 + box-sizing: border-box;
68 + padding: 0.5em 1em 0.5em 3em;
69 + border-bottom: 1px solid #fff; }
70 + .side .section a:last-child {
71 + border-bottom: 0; }
72 + .side .section a.all {
73 + background: #444; }
74 + .side .section a.selected {
75 + padding-left: 1em;
76 + background-color: #009eec; }
77 + .side .section a.selected:before {
78 + font-family: FontAwesome;
79 + content: "\f00c";
80 + display: inline-block;
81 + vertical-align: middle;
82 + padding-right: 1em; }
83 + .side .section a:hover, .side .section a.selected:hover {
84 + background-color: #337AB7; }
85 +
86 +.form-signin {
87 + width: 320px;
88 + height: 300px;
89 + padding: 0;
90 + top: 10em;
91 + left: 50%;
92 + position: absolute;
93 + margin: 0 0 0 -160px; }
94 + .form-signin .checkbox {
95 + margin-bottom: 10px;
96 + font-weight: normal; }
97 + .form-signin .form-control {
98 + position: relative;
99 + height: auto;
100 + box-sizing: border-box;
101 + padding: 10px;
102 + font-size: 16px; }
103 + .form-signin .form-control:focus {
104 + z-index: 2; }
105 + .form-signin input[type="email"] {
106 + margin-bottom: -1px;
107 + border-bottom-right-radius: 0;
108 + border-bottom-left-radius: 0; }
109 + .form-signin input[type="password"] {
110 + margin-bottom: 10px;
111 + border-top-left-radius: 0;
112 + border-top-right-radius: 0; }
113 +
114 +body {
115 + font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
116 + margin-top: 50px;
117 + padding-top: 1em; }
118 +
119 +a {
120 + color: #00B7FF; }
121 +
122 +.jumbotron {
123 + margin-top: -1em;
124 + background: url("/images/bg.jpg") no-repeat left top;
125 + -webkit-background-size: 100%;
126 + -moz-background-size: 100%;
127 + -o-background-size: 100%;
128 + background-size: 100%;
129 + min-height: 20em;
130 + color: #fff;
131 + text-shadow: 2px 2px 10px rgba(0, 0, 0, 0.3); }
132 +
133 +.form-actions {
134 + padding: 19px 20px 20px;
135 + margin-top: 20px;
136 + margin-bottom: 20px;
137 + background-color: #f5f5f5;
138 + border-top: 1px solid #e5e5e5; }
139 +
140 +.footer {
141 + position: absolute;
142 + bottom: 0;
143 + width: 100%;
144 + height: 60px;
145 + background-color: #f5f5f5; }
146 + .footer .container {
147 + padding-right: 1em;
148 + padding-left: 1em; }
149 + .footer .container .text-muted {
150 + margin: 20px 0;
151 + color: #bbb; }
1 +var express = require('express'),
2 + todos = require('./todos'),
3 + User = require('../models/User');
4 +var router = express.Router();
5 +
6 +/* GET home page. */
7 +router.get('/', function(req, res, next) {
8 + res.render('index');
9 +});
10 +
11 +router.get('/signin', function(req, res, next) {
12 + res.render('signin');
13 +});
14 +
15 +router.post('/signin', function(req, res, next) {
16 + User.findOne({email: req.body.email}, function(err, user) {
17 + if (err) {
18 + res.render('error', {message: "Error", error: err});
19 + } else if (!user) {
20 + req.flash('danger', '존재하지 않는 사용자 입니다.');
21 + res.redirect('back');
22 + } else if (user.password !== req.body.password) {
23 + req.flash('danger', '비밀번호가 일치하지 않습니다.');
24 + res.redirect('back');
25 + } else {
26 + req.session.user = user;
27 + req.flash('success', '로그인 되었습니다.');
28 + res.redirect('/todos');
29 + }
30 + });
31 +});
32 +
33 +router.get('/signout', function(req, res, next) {
34 + delete req.session.user;
35 + req.flash('success', '로그아웃 되었습니다.');
36 + res.redirect('/');
37 +});
38 +router.use('/todos', todos);
39 +
40 +module.exports = router;
1 +var express = require('express');
2 +var router = express.Router();
3 +
4 +router.get('/', function(req, res, next) {
5 + res.render('todos', {
6 + tasks: [
7 + {_id: 1, content: '이런저런일1', category: '학교', priority: 3, deadline: null},
8 + {_id: 2, content: '이런저런일2', category: null, priority: 2, deadline: null},
9 + {_id: 3, content: '이런저런일3', category: '집', priority: 3, deadline: new Date("2015-12-25")},
10 + {_id: 4, content: '이런저런일4', category: '학교', priority: 1, deadline: new Date("2015-11-21")},
11 + {_id: 5, content: '이런저런일5', category: '집', priority: 2, deadline: null},
12 + ],
13 + categories: [
14 + '학교',
15 + '집',
16 + ]
17 + });
18 +});
19 +
20 +router.post('/', function(req, res, next) {
21 + req.flash('success', '새로운 할 일이 저장되었습니다.');
22 + res.redirect('/todos');
23 +});
24 +
25 +router.put('/:id', function(req, res, next) {
26 + req.flash('success', '할 일이 변경되었습니다.');
27 + res.redirect('/todos');
28 +});
29 +
30 +router.delete('/:id', function(req, res, next) {
31 + req.flash('success', '할 일이 삭제되었습니다.');
32 + res.redirect('/todos');
33 +});
34 +
35 +module.exports = router;
1 +var express = require('express'),
2 + User = require('../models/User');
3 +var router = express.Router();
4 +
5 +function needAuth(req, res, next) {
6 + if (req.session.user) {
7 + next();
8 + } else {
9 + req.flash('danger', '로그인이 필요합니다.');
10 + res.redirect('/signin');
11 + }
12 +}
13 +
14 +function validateForm(form, options) {
15 + var name = form.name || "";
16 + var email = form.email || "";
17 + name = name.trim();
18 + email = email.trim();
19 +
20 + if (!name) {
21 + return '이름을 입력해주세요.';
22 + }
23 +
24 + if (!email) {
25 + return '이메일을 입력해주세요.';
26 + }
27 +
28 + if (!form.password && options.needPassword) {
29 + return '비밀번호를 입력해주세요.';
30 + }
31 +
32 + if (form.password !== form.password_confirmation) {
33 + return '비밀번호가 일치하지 않습니다.';
34 + }
35 +
36 + if (form.password.length < 6) {
37 + return '비밀번호는 6글자 이상이어야 합니다.';
38 + }
39 +
40 + return null;
41 +}
42 +
43 +/* GET users listing. */
44 +router.get('/', needAuth, function(req, res, next) {
45 + User.find({}, function(err, users) {
46 + if (err) {
47 + return next(err);
48 + }
49 + res.render('users/index', {users: users});
50 + });
51 +});
52 +
53 +router.get('/new', function(req, res, next) {
54 + res.render('users/new', {messages: req.flash()});
55 +});
56 +
57 +router.get('/:id/edit', function(req, res, next) {
58 + User.findById(req.params.id, function(err, user) {
59 + if (err) {
60 + return next(err);
61 + }
62 + res.render('users/edit', {user: user});
63 + });
64 +});
65 +
66 +router.put('/:id', function(req, res, next) {
67 + var err = validateForm(req.body);
68 + if (err) {
69 + req.flash('danger', err);
70 + return res.redirect('back');
71 + }
72 +
73 + User.findById({_id: req.params.id}, function(err, user) {
74 + if (err) {
75 + return next(err);
76 + }
77 + if (!user) {
78 + req.flash('danger', '존재하지 않는 사용자입니다.');
79 + return res.redirect('back');
80 + }
81 +
82 + if (user.password !== req.body.current_password) {
83 + req.flash('danger', '현재 비밀번호가 일치하지 않습니다.');
84 + return res.redirect('back');
85 + }
86 +
87 + user.name = req.body.name;
88 + user.email = req.body.email;
89 + if (req.body.password) {
90 + user.password = req.body.password;
91 + }
92 +
93 + user.save(function(err) {
94 + if (err) {
95 + return next(err);
96 + }
97 + req.flash('success', '사용자 정보가 변경되었습니다.');
98 + res.redirect('/users');
99 + });
100 + });
101 +});
102 +
103 +router.delete('/:id', function(req, res, next) {
104 + User.findOneAndRemove({_id: req.params.id}, function(err) {
105 + if (err) {
106 + return next(err);
107 + }
108 + req.flash('success', '사용자 계정이 삭제되었습니다.');
109 + res.redirect('/users');
110 + });
111 +});
112 +
113 +router.get('/:id', function(req, res, next) {
114 + User.findById(req.params.id, function(err, user) {
115 + if (err) {
116 + return next(err);
117 + }
118 + res.render('users/show', {user: user});
119 + });
120 +});
121 +
122 +router.post('/', function(req, res, next) {
123 + var err = validateForm(req.body, {needPassword: true});
124 + if (err) {
125 + req.flash('danger', err);
126 + return res.redirect('back');
127 + }
128 + User.findOne({email: req.body.email}, function(err, user) {
129 + if (err) {
130 + return next(err);
131 + }
132 + if (user) {
133 + req.flash('danger', '동일한 이메일 주소가 이미 존재합니다.');
134 + res.redirect('back');
135 + }
136 + var newUser = new User({
137 + name: req.body.name,
138 + email: req.body.email,
139 + });
140 + newUser.password = req.body.password;
141 +
142 + newUser.save(function(err) {
143 + if (err) {
144 + return next(err);
145 + } else {
146 + req.flash('success', '가입이 완료되었습니다. 로그인 해주세요.');
147 + res.redirect('/');
148 + }
149 + });
150 + });
151 +});
152 +
153 +
154 +module.exports = router;
1 +.form-signin {
2 + width: 320px;
3 + height: 300px;
4 + padding: 0;
5 + top: 10em;
6 + left: 50%;
7 + position: absolute;
8 + margin: 0 0 0 -160px;
9 +
10 + .checkbox {
11 + margin-bottom: 10px;
12 + font-weight: normal;
13 + }
14 + .form-control {
15 + position: relative;
16 + height: auto;
17 + box-sizing: border-box;
18 + padding: 10px;
19 + font-size: 16px;
20 + }
21 + .form-control:focus {
22 + z-index: 2;
23 + }
24 + input[type="email"] {
25 + margin-bottom: -1px;
26 + border-bottom-right-radius: 0;
27 + border-bottom-left-radius: 0;
28 + }
29 + input[type="password"] {
30 + margin-bottom: 10px;
31 + border-top-left-radius: 0;
32 + border-top-right-radius: 0;
33 + }
34 +}
1 +body {
2 + font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
3 + margin-top: 50px;
4 + padding-top: 1em;
5 + & > .main-content {
6 + min-height: 400px;
7 + }
8 +}
9 +a {
10 + color: #00B7FF
11 +}
12 +
13 +.jumbotron {
14 + margin-top: -1em;
15 + background: url('/images/bg.jpg') no-repeat left top;
16 + -webkit-background-size: 100%;
17 + -moz-background-size: 100%;
18 + -o-background-size: 100%;
19 + background-size: 100%;
20 + min-height: 20em;
21 + color: #fff;
22 + text-shadow: 2px 2px 10px rgba(0, 0, 0, 0.3);
23 +}
24 +
25 +.form-actions {
26 + padding: 19px 20px 20px;
27 + margin-top: 20px;
28 + margin-bottom: 20px;
29 + background-color: #f5f5f5;
30 + border-top: 1px solid #e5e5e5;
31 +}
32 +
33 +.footer {
34 + margin-top: 1em;
35 + width: 100%;
36 + height: 60px;
37 + background-color: #f5f5f5;
38 +
39 + .container {
40 + padding-right: 1em;
41 + padding-left: 1em;
42 +
43 + .text-muted {
44 + margin: 20px 0;
45 + color: #bbb;
46 + }
47 + }
48 +}
1 +form.todos {
2 + width: 100%;
3 + margin: 0 0 1em 0;
4 + padding: 1em;
5 + background: #acddf2;
6 + .main {
7 + input[type='text'] {
8 + font-size: 1.4em;
9 + border: 1px solid #2c9cd2;
10 + padding: 0.5em 1em;
11 + margin-bottom: 1em;
12 + width: 100%;
13 + box-sizing: border-box;
14 + }
15 + }
16 + .actions button {
17 + margin-top: 1em;
18 + }
19 +}
20 +
21 +.tasks {
22 + width: 100%;
23 + list-style: none;
24 + padding: 0;
25 + margin: 0;
26 + li.task {
27 + border-bottom: 1px solid #eaeaea;
28 + padding: 1em 0;
29 + span {
30 + display: inline-block;
31 + margin-right: 1em;
32 + }
33 + .check {
34 + width: 2em;
35 + height: 2em;
36 + border-radius: 1em;
37 + border: 1px solid #2c9cd2;
38 + vertical-align: bottom;
39 + }
40 + .content {
41 + font-size: 1.1em;
42 + font-weight: bold;
43 + line-height: 2em;
44 + }
45 + .category {
46 + float: right;
47 + min-width: 5em;
48 + font-size: 0.9em;
49 + }
50 + .priority {
51 + font-size: 0.8em;
52 + border-radius: 0.8em;
53 + background-color: #888;
54 + color: #fff;
55 + height: 200%;
56 + line-height: 1.6em;
57 + text-align: center;
58 + padding: 0 1em;
59 +
60 + &.p2 {
61 + background-color: #b0b33c;
62 + }
63 + &.p3 {
64 + background-color: #a51e23;
65 + }
66 + }
67 + .deadline {
68 + color: #ccc;
69 + font-size: 0.9em;
70 + }
71 + }
72 +}
73 +.side {
74 + .section {
75 + background: #888;
76 + width: 100%;
77 + color: #fff;
78 + a {
79 + color: #fff;
80 + display: inline-block;
81 + text-decoration: none;
82 + width: 100%;
83 + box-sizing: border-box;
84 + padding: 0.5em 1em 0.5em 3em;
85 + border-bottom: 1px solid #fff;
86 +
87 + &:last-child {
88 + border-bottom: 0;
89 + }
90 +
91 + &.all {
92 + background: #444;
93 + }
94 + }
95 +
96 + a.selected {
97 + padding-left: 1em;
98 + background-color: #009eec;
99 + &:before {
100 + font-family: FontAwesome;
101 + content: "\f00c";
102 + display: inline-block;
103 + vertical-align: middle;
104 + padding-right: 1em;
105 + }
106 + }
107 +
108 + a:hover, a.selected:hover {
109 + background-color: #337AB7;
110 + }
111 + }
112 +}
1 +extends layout
2 +
3 +block content
4 + .container
5 + .panel.panel-danger(style='margin-top:2em')
6 + .panel-heading
7 + h3.panel-title= message
8 + .panel-body
9 + p= error.status
10 + pre #{error.stack}
1 +.footer
2 + .container
3 + p.text-muted
4 + | All rights reserved. &copy; 2015 Myongji University.
1 +form.form-inline(action='/todos', method='POST', class='todos')
2 + .form
3 + .main
4 + input(type='text', id='task', name='task', placeholder='해야할 일이 무엇인가요?')
5 + .sub
6 + .form-group
7 + input.form-control(type='text', id='category', name='category', placeholder='분류')
8 + .form-group
9 + select.form-control(name='priority')
10 + option(value='1') 중요
11 + option(value='2', selected) 보통
12 + option(value='3') 사소
13 + .form-group
14 + input.form-control(type='date', id='deadline', name='deadline')
15 + .actions
16 + button.btn.btn-primary.btn-lg.btn-block(type='submit') 저장
17 +
18 +ul.tasks
19 + each task in tasks
20 + li.task(data-id='#{task._id}')
21 + span.check
22 + span.content= task.content
23 + if task.category
24 + span.label.label-default.category= task.category
25 + span.priority(class='p#{task.priority}')
26 + case task.priority
27 + when 1
28 + | 사소
29 + when 2
30 + | 보통
31 + when 3
32 + | 중요
33 + if task.deadline
34 + span.deadline= moment(task.deadline).format('YYYY-MM-DD')
35 +
1 +h3 완료여부
2 +.section.priority
3 + a(data-value='completed').selected 완료
4 + a(data-value='uncompleted').selected 미완료
5 + a(data-value='all').all 전체
6 +
7 +h3 마감
8 +.section.deadline
9 + a(data-value='past') 과거
10 + a(data-value='today').selected 오늘
11 + a(data-value='week') 이번주
12 + a(data-value='month') 이번달
13 + a(data-value='all').all 전체
14 +
15 +h3 중요도
16 +.section.priority
17 + a(data-value='3').selected 중요
18 + a(data-value='2') 보통
19 + a(data-value='1') 사소
20 + a(data-value='all').all 전체
21 +
22 +
23 +h3 분류
24 +.section.categories
25 + each category in categories
26 + a(data-value='text').selected= category
27 + a(data-value='none').selected <분류없음>
28 + a(data-value='all').all 전체
1 +.navbar.navbar-inverse.navbar-fixed-top
2 + .container
3 + .navbar-header
4 + button.navbar-toggle.collapsed(type='button', data-toggle='collapse', data-target='#navbar', aria-expanded='false', aria-controls='navbar')
5 + span.sr-only Toggle navigation
6 + span.icon-bar
7 + span.icon-bar
8 + span.icon-bar
9 + a.navbar-brand(href='/')
10 + i.fa.fa-home
11 + #navbar.collapse.navbar-collapse
12 + ul.nav.navbar-nav
13 + li
14 + a(href='/todos') Todo List
15 + li
16 + a(href='/users') Users
17 + ul.nav.navbar-nav.navbar-right
18 + if (!currentUser)
19 + li
20 + a(href='/signin') Signin
21 + li
22 + a(href='/users/new') Signup
23 + else
24 + li
25 + a(href='/users/#{currentUser._id}') Profile
26 + li
27 + a(href='/signout') Signout
28 +
1 +extends layout
2 +
3 +block hero-unit
4 + .jumbotron
5 + .container
6 + h1 BIGBANG-TODO
7 +
8 +block content
9 + .container
10 + .row
11 + .col-md-6
12 + h3 서비스 목적
13 + p 본 서비스는 웹프로그래밍 수업을 위해서 sample로 만들어보는 것입니다.
14 + .col-md-6
15 + h3 주요 기능
16 + ul
17 + li 사용자 관리
18 + li 할 일 기록
19 + li 기록 내용: 분류, 내용, 중요도, deadline
20 + li 완료된 일 체크
21 +
1 +doctype html
2 +html(lang='ko')
3 + head
4 + block title
5 + title BBDO
6 + meta(charset='UTF-8')
7 + link(rel='stylesheet', href='/bower_components/bootstrap/dist/css/bootstrap-theme.css')
8 + link(rel='stylesheet', href='/bower_components/bootstrap/dist/css/bootstrap.css')
9 + link(rel='stylesheet', href='/bower_components/font-awesome/css/font-awesome.min.css')
10 + link(rel='stylesheet', href='/stylesheets/style.css')
11 + script(type='text/javascript', src='/bower_components/jquery/dist/jquery.js')
12 + script(type='text/javascript', src='/bower_components/bootstrap/dist/js/bootstrap.js')
13 + body
14 + block top-nav
15 + include ./includes/topnav
16 + block hero-unit
17 + if flashMessages
18 + each texts, type in flashMessages
19 + .container
20 + .alert(class='alert-#{type}')
21 + each msg in texts
22 + p= msg
23 + block content
24 +
25 + block footer
26 + include ./includes/footer
1 +extends layout
2 +
3 +block content
4 + .container
5 + form.form-signin(action='/signin', method='POST')
6 + label(for='email', class='sr-only') Email address
7 + input(
8 + type='email', id='email', name='email', class='form-control',
9 + placeholder='Email address', required, autofocus
10 + )
11 + label(for='password', class='sr-only') Password
12 + input(
13 + type='password', id='password', name='password', class='form-control',
14 + placeholder='Password', required, autofocus
15 + )
16 + button.btn.btn-lg.btn-primary.btn-block(type='submit') 로그인
17 + hr
18 + a.btn.btn-default.btn-mini(href='/users/new') 회원가입
19 + |
20 + a.btn.btn-default.btn-mini(href='/reset-password') 비밀번호 재설정
21 +
1 +extends layout
2 +
3 +block content
4 + .container
5 + .row
6 + .col-md-8
7 + include ./includes/todo-main
8 + .col-md-4.side
9 + include ./includes/todo-side
1 +extends ../layout
2 +
3 +block content
4 + .container
5 + h1.page-header 회원정보 수정
6 + form(action='/users/#{user._id}?_method=PUT', method='POST')
7 + .form-group
8 + label(for='name') Name
9 + input.form-control(type='text', id='name', name='name', placeholder='Your name', value=user.name)
10 + .form-group
11 + label(for='email') Email address
12 + input.form-control(type='email', id='email', name='email', placeholder='Email', value=user.email)
13 + .form-group
14 + label(for='current_password') 현재 Password
15 + input.form-control(type='password', id='current_password', name='current_password', placeholder='현재 Password')
16 + .form-group
17 + label(for='password') 변경할 Password
18 + input.form-control(type='password', id='password', name='password', placeholder='변경할 Password')
19 + .form-group
20 + label(for='password_confirmation') Password 확인
21 + input.form-control(type='password', id='password_confirmation', name='password_confirmation', placeholder='변경할 Password 확인')
22 + div.form-actions
23 + a.btn.btn-default(href='javascript:window.history.back();') 뒤로
24 + |
25 + button.btn.btn-primary(type='submit') 수정
1 +extends ../layout
2 +
3 +block content
4 + .container
5 + h1.page-header 회원 목록
6 +
7 + table.table.table-striped.table-bordered
8 + thead
9 + tr
10 + th 이름
11 + th 이메일
12 + th 가입일시
13 + th
14 + tbody
15 + each user in users
16 + tr
17 + td
18 + a(href='/users/#{user._id}')= user.name
19 + td= user.email
20 + td= moment(user.createdAt).format('YYYY-MM-DD HH:mm:ss')
21 + td
22 + a.btn.btn-xs.btn-default(href='/users/#{user._id}/edit') 수정
23 + |
24 + a.btn.btn-xs.btn-default(href='/users/#{user._id}?_method=DELETE') 삭제
25 + a.btn.btn-primary(href='/users/new') 사용자추가
1 +extends ../layout
2 +
3 +block content
4 + .container
5 + h1.page-header 회원가입
6 + form(action='/users', method='POST')
7 + .form-group
8 + label(for='name') Name
9 + input.form-control(type='text', id='name', name='name', placeholder='Your name')
10 + .form-group
11 + label(for='email') Email address
12 + input.form-control(type='email', id='email', name='email', placeholder='Email')
13 + .form-group
14 + label(for='password') Password
15 + input.form-control(type='password', id='password', name='password', placeholder='Password')
16 + .form-group
17 + label(for='password_confirmation') Password 확인
18 + input.form-control(type='password', id='password_confirmation', name='password_confirmation', placeholder='Password')
19 + div.form-actions
20 + a.btn.btn-default(href='javascript:window.history.back();') 뒤로
21 + |
22 + button.btn.btn-primary(type='submit') 회원가입
1 +extends ../layout
2 +
3 +block content
4 + .container
5 + h1.page-header 회원 정보
6 +
7 + ul
8 + li 이름: #{user.name}
9 + li 이메일: #{user.email}
10 +
11 + hr
12 + p
13 + a.btn.btn-default(href='/users/') 목록
14 + |
15 + a.btn.btn-default(href='/users/#{user._id}/edit') 수정
16 + |
17 + a.btn.btn-default(href='/users/#{user._id}?_method=DELETE') 삭제