Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
T
todomvc
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Sven Franck
todomvc
Commits
5400ccb9
Commit
5400ccb9
authored
Jul 26, 2012
by
Ralph Holzmann
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Removing Zepto so we can make the release.
parent
84b4a7b6
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
0 additions
and
1886 deletions
+0
-1886
labs/architecture-examples/canjs/zepto/base.css
labs/architecture-examples/canjs/zepto/base.css
+0
-208
labs/architecture-examples/canjs/zepto/index.html
labs/architecture-examples/canjs/zepto/index.html
+0
-32
labs/architecture-examples/canjs/zepto/todo.css
labs/architecture-examples/canjs/zepto/todo.css
+0
-5
labs/architecture-examples/canjs/zepto/todo.ejs
labs/architecture-examples/canjs/zepto/todo.ejs
+0
-25
labs/architecture-examples/canjs/zepto/todo.js
labs/architecture-examples/canjs/zepto/todo.js
+0
-192
labs/architecture-examples/canjs/zepto/zepto.0.8-focusblur.js
.../architecture-examples/canjs/zepto/zepto.0.8-focusblur.js
+0
-1424
No files found.
labs/architecture-examples/canjs/zepto/base.css
deleted
100755 → 0
View file @
84b4a7b6
html
,
body
{
margin
:
0
;
padding
:
0
;
}
body
{
font
:
14px
"Helvetica Neue"
,
Helvetica
,
Arial
,
sans-serif
;
line-height
:
1.4em
;
background
:
#eeeeee
;
color
:
#333333
;
width
:
520px
;
margin
:
0
auto
;
-webkit-font-smoothing
:
antialiased
;
}
#todoapp
{
background
:
#fff
;
padding
:
20px
;
margin-bottom
:
40px
;
-webkit-box-shadow
:
rgba
(
0
,
0
,
0
,
0.2
)
0
2px
6px
0
;
-moz-box-shadow
:
rgba
(
0
,
0
,
0
,
0.2
)
0
2px
6px
0
;
-ms-box-shadow
:
rgba
(
0
,
0
,
0
,
0.2
)
0
2px
6px
0
;
-o-box-shadow
:
rgba
(
0
,
0
,
0
,
0.2
)
0
2px
6px
0
;
box-shadow
:
rgba
(
0
,
0
,
0
,
0.2
)
0
2px
6px
0
;
-webkit-border-radius
:
0
0
5px
5px
;
-moz-border-radius
:
0
0
5px
5px
;
-ms-border-radius
:
0
0
5px
5px
;
-o-border-radius
:
0
0
5px
5px
;
border-radius
:
0
0
5px
5px
;
}
#todoapp
h1
{
font-size
:
36px
;
font-weight
:
bold
;
text-align
:
center
;
padding
:
0
0
10px
0
;
}
#todoapp
input
[
type
=
"text"
]
{
width
:
466px
;
font-size
:
24px
;
font-family
:
inherit
;
line-height
:
1.4em
;
border
:
0
;
outline
:
none
;
padding
:
6px
;
border
:
1px
solid
#999999
;
-webkit-box-shadow
:
rgba
(
0
,
0
,
0
,
0.2
)
0
1px
2px
0
inset
;
-moz-box-shadow
:
rgba
(
0
,
0
,
0
,
0.2
)
0
1px
2px
0
inset
;
-ms-box-shadow
:
rgba
(
0
,
0
,
0
,
0.2
)
0
1px
2px
0
inset
;
-o-box-shadow
:
rgba
(
0
,
0
,
0
,
0.2
)
0
1px
2px
0
inset
;
box-shadow
:
rgba
(
0
,
0
,
0
,
0.2
)
0
1px
2px
0
inset
;
}
#todoapp
input
::-webkit-input-placeholder
{
font-style
:
italic
;
}
#main
{
display
:
none
;
}
#todo-list
{
margin
:
10px
0
;
padding
:
0
;
list-style
:
none
;
}
#todo-list
li
{
padding
:
18px
20px
18px
0
;
position
:
relative
;
font-size
:
24px
;
border-bottom
:
1px
solid
#cccccc
;
}
#todo-list
li
:last-child
{
border-bottom
:
none
;
}
#todo-list
li
.done
label
{
color
:
#777777
;
text-decoration
:
line-through
;
}
#todo-list
li
.destroy
{
display
:
none
;
position
:
absolute
;
top
:
20px
;
right
:
10px
;
cursor
:
pointer
;
width
:
20px
;
height
:
20px
;
background
:
url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUBAMAAAB/pwA+AAAABGdBTUEAALGPC/xhBQAAACdQTFRFzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMAAAA////zMzMhnu0WAAAAAt0Uk5T5u3pqtV3jFQEKAC0bVelAAAAfUlEQVQI12NYtWpFsc8R865VqxhWrZpyBgg8QcylZ8AgCsjMgTCPrWJYfgYKqhjWwJgaDDVnzpw+c2bPmTPHGWzOnNm95/TuM2cOM/AARXfvBooeZAAp270bRCIz4QoOIGtDMqwJZoUEQzvCYrhzuhhWtUKYEahOX7UK6iEA3A6NUGwCTZIAAAAASUVORK5CYII=')
no-repeat
center
center
;
}
#todo-list
li
:hover
.destroy
{
display
:
block
;
}
#todo-list
li
.editing
{
border-bottom
:
none
;
margin-top
:
-1px
;
padding
:
0
;
}
#todo-list
li
.editing
:last-child
{
margin-bottom
:
-1px
;
}
#todo-list
li
.editing
.edit
{
display
:
block
;
width
:
444px
;
padding
:
13px
15px
14px
20px
;
margin
:
0
;
}
#todo-list
li
.editing
.view
{
display
:
none
;
}
#todo-list
li
.view
label
{
word-break
:
break-word
;
}
#todo-list
li
.edit
{
display
:
none
;
}
#todoapp
footer
{
display
:
none
;
margin
:
0
-20px
-20px
-20px
;
overflow
:
hidden
;
color
:
#555555
;
background
:
#f4fce8
;
border-top
:
1px
solid
#ededed
;
padding
:
0
20px
;
line-height
:
37px
;
-webkit-border-radius
:
0
0
5px
5px
;
-moz-border-radius
:
0
0
5px
5px
;
-ms-border-radius
:
0
0
5px
5px
;
-o-border-radius
:
0
0
5px
5px
;
border-radius
:
0
0
5px
5px
;
}
#clear-completed
{
display
:
none
;
float
:
right
;
line-height
:
20px
;
text-decoration
:
none
;
background
:
rgba
(
0
,
0
,
0
,
0.1
);
color
:
#555555
;
font-size
:
11px
;
margin-top
:
8px
;
margin-bottom
:
8px
;
padding
:
0
10px
1px
;
cursor
:
pointer
;
-webkit-border-radius
:
12px
;
-moz-border-radius
:
12px
;
-ms-border-radius
:
12px
;
-o-border-radius
:
12px
;
border-radius
:
12px
;
-webkit-box-shadow
:
rgba
(
0
,
0
,
0
,
0.2
)
0
-1px
0
0
;
-moz-box-shadow
:
rgba
(
0
,
0
,
0
,
0.2
)
0
-1px
0
0
;
-ms-box-shadow
:
rgba
(
0
,
0
,
0
,
0.2
)
0
-1px
0
0
;
-o-box-shadow
:
rgba
(
0
,
0
,
0
,
0.2
)
0
-1px
0
0
;
box-shadow
:
rgba
(
0
,
0
,
0
,
0.2
)
0
-1px
0
0
;
}
#clear-completed
:hover
{
background
:
rgba
(
0
,
0
,
0
,
0.15
);
-webkit-box-shadow
:
rgba
(
0
,
0
,
0
,
0.3
)
0
-1px
0
0
;
-moz-box-shadow
:
rgba
(
0
,
0
,
0
,
0.3
)
0
-1px
0
0
;
-ms-box-shadow
:
rgba
(
0
,
0
,
0
,
0.3
)
0
-1px
0
0
;
-o-box-shadow
:
rgba
(
0
,
0
,
0
,
0.3
)
0
-1px
0
0
;
box-shadow
:
rgba
(
0
,
0
,
0
,
0.3
)
0
-1px
0
0
;
}
#clear-completed
:active
{
position
:
relative
;
top
:
1px
;
}
#todo-count
span
{
font-weight
:
bold
;
}
#instructions
{
margin
:
10px
auto
;
color
:
#777777
;
text-shadow
:
rgba
(
255
,
255
,
255
,
0.8
)
0
1px
0
;
text-align
:
center
;
}
#instructions
a
{
color
:
#336699
;
}
#credits
{
margin
:
30px
auto
;
color
:
#999
;
text-shadow
:
rgba
(
255
,
255
,
255
,
0.8
)
0
1px
0
;
text-align
:
center
;
}
#credits
a
{
color
:
#888
;
}
\ No newline at end of file
labs/architecture-examples/canjs/zepto/index.html
deleted
100755 → 0
View file @
84b4a7b6
<!doctype html>
<html
lang=
"en"
>
<head>
<meta
charset=
"utf-8"
>
<title>
Todo - CanJS with Zepto
</title>
<link
rel=
"stylesheet"
href=
"base.css"
>
<link
rel=
"stylesheet"
href=
"todo.css"
>
</head>
<body>
<div
id=
"todoapp"
>
<header>
<h1>
todos
</h1>
<input
id=
"new-todo"
type=
"text"
placeholder=
"What needs to be done?"
>
</header>
</div>
<div
id=
"instructions"
>
Double-click to edit a todo.
</div>
<div
id=
"credits"
>
<p>
Created by
<a
href=
"http://bitovi.com/"
>
Bitovi
</a>
.
</p>
<p>
Part of
<a
href=
"http://todomvc.com"
>
TodoMVC
</a>
.
</p>
</div>
<!--
Zepto 0.8 doesn't support delegate focus/blur.
This is Zepto 0.8 with this patch applied:
https://github.com/madrobby/zepto/commit/ab2a3ef0d18beaf768903f0943efd019a29803f0
-->
<script
src=
"zepto.0.8-focusblur.js"
></script>
<script
src=
"http://canjs.us/release/latest/can.zepto.js"
></script>
<script
src=
"todo.js"
></script>
</body>
</html>
labs/architecture-examples/canjs/zepto/todo.css
deleted
100755 → 0
View file @
84b4a7b6
#main
.show
,
#stats
.show
,
#stats
.show
#clear-completed
{
display
:
block
;
}
\ No newline at end of file
labs/architecture-examples/canjs/zepto/todo.ejs
deleted
100755 → 0
View file @
84b4a7b6
<section id="main" class="<%= todos.attr("length") > 0 ? "show" : "" %>">
<input id="toggle-all" type="checkbox" <%= todos.allComplete() ? "checked" : "" %>>
<label for="toggle-all">Mark all as complete</label>
<ul id="todo-list">
<% list(todos, function( todo ) { %>
<li class="todo
<%= todo.attr("complete") ? "done" : "" %>
<%= todo.attr("editing") ? "editing" : "" %>"
<%= (el)-> can.data(el, 'todo', todo) %>>
<div class="view">
<input class="toggle" type="checkbox" <%= todo.attr("complete") ? "checked" : "" %>>
<label><%= todo.attr("text") %></label>
<a class="destroy"></a>
</div>
<input class="edit" type="text" value="<%= todo.attr("text") %>">
</li>
<% }) %>
</ul>
</section>
<footer id="stats" class="<%= todos.attr("length") > 0 ? "show" : "" %>">
<a id="clear-completed">Clear <%= todos.completed() %>
completed item<%= todos.completed() == 1 ? "" : "s" %></a>
<div id="todo-count"><span><%= todos.remaining() %></span>
item<%= todos.remaining() == 1 ? "" : "s" %> left</div>
</footer>
\ No newline at end of file
labs/architecture-examples/canjs/zepto/todo.js
deleted
100755 → 0
View file @
84b4a7b6
(
function
()
{
// Basic Todo entry model
// { text: 'todo', complete: false }
Todo
=
can
.
Model
({
// Implement local storage handling
localStore
:
function
(
cb
){
var
name
=
'
todos-canjs-zepto
'
,
data
=
JSON
.
parse
(
window
.
localStorage
[
name
]
||
(
window
.
localStorage
[
name
]
=
'
[]
'
)
),
res
=
cb
.
call
(
this
,
data
);
if
(
res
!==
false
){
can
.
each
(
data
,
function
(
todo
)
{
delete
todo
.
editing
;
});
window
.
localStorage
[
name
]
=
JSON
.
stringify
(
data
);
}
},
findAll
:
function
(
params
){
var
def
=
new
can
.
Deferred
();
this
.
localStore
(
function
(
todos
){
var
instances
=
[],
self
=
this
;
can
.
each
(
todos
,
function
(
todo
)
{
instances
.
push
(
new
self
(
todo
));
});
def
.
resolve
({
data
:
instances
});
})
return
def
;
},
destroy
:
function
(
id
){
var
def
=
new
can
.
Deferred
();
this
.
localStore
(
function
(
todos
){
for
(
var
i
=
0
;
i
<
todos
.
length
;
i
++
)
{
if
(
todos
[
i
].
id
===
id
)
{
todos
.
splice
(
i
,
1
);
break
;
}
}
def
.
resolve
({});
});
return
def
},
create
:
function
(
attrs
){
var
def
=
new
can
.
Deferred
();
this
.
localStore
(
function
(
todos
){
attrs
.
id
=
attrs
.
id
||
parseInt
(
100000
*
Math
.
random
());
todos
.
push
(
attrs
);
});
def
.
resolve
({
id
:
attrs
.
id
});
return
def
},
update
:
function
(
id
,
attrs
){
var
def
=
new
can
.
Deferred
();
this
.
localStore
(
function
(
todos
){
for
(
var
i
=
0
;
i
<
todos
.
length
;
i
++
)
{
if
(
todos
[
i
].
id
===
id
)
{
var
todo
=
todos
[
i
];
break
;
}
}
can
.
extend
(
todo
,
attrs
);
});
def
.
resolve
({});
return
def
}
},{});
// List for Todos
Todo
.
List
=
can
.
Model
.
List
({
completed
:
function
()
{
// Ensure this triggers on length change
this
.
attr
(
'
length
'
);
var
completed
=
0
;
this
.
each
(
function
(
todo
)
{
completed
+=
todo
.
attr
(
'
complete
'
)
?
1
:
0
});
return
completed
;
},
remaining
:
function
()
{
return
this
.
attr
(
'
length
'
)
-
this
.
completed
();
},
allComplete
:
function
()
{
return
this
.
attr
(
'
length
'
)
===
this
.
completed
();
}
});
Todos
=
can
.
Control
({
// Initialize the Todos list
init
:
function
(){
// Render the Todos
this
.
element
.
append
(
can
.
view
(
'
todo
'
,
{
todos
:
this
.
options
.
todos
}));
// Clear the new todo field
$
(
'
#new-todo
'
).
val
(
''
)[
0
].
focus
();
},
// Listen for when a new Todo has been entered
'
#new-todo keyup
'
:
function
(
el
,
ev
){
if
(
ev
.
keyCode
==
13
)
{
new
Todo
({
text
:
el
.
val
(),
complete
:
false
}).
save
(
function
()
{
el
.
val
(
''
);
});
}
},
// Handle a newly created Todo
'
{Todo} created
'
:
function
(
list
,
ev
,
item
){
this
.
options
.
todos
.
push
(
item
);
},
// Listen for editing a Todo
'
.todo dblclick
'
:
function
(
el
,
ev
)
{
el
.
data
(
'
todo
'
).
attr
(
'
editing
'
,
true
).
save
(
function
()
{
var
child
=
el
.
children
(
'
.edit
'
)[
0
];
child
.
focus
();
child
.
select
();
});
},
// Update a todo
updateTodo
:
function
(
el
)
{
el
.
closest
(
'
.todo
'
).
data
(
'
todo
'
)
.
attr
({
editing
:
false
,
text
:
el
.
val
()
}).
save
();
},
// Listen for an edited Todo
'
.todo .edit keyup
'
:
function
(
el
,
ev
){
if
(
ev
.
keyCode
==
13
){
this
.
updateTodo
(
el
);
}
},
'
.todo .edit blur
'
:
function
(
el
,
ev
)
{
this
.
updateTodo
(
el
);
},
// Listen for the toggled completion of a Todo
'
.todo .toggle change
'
:
function
(
el
,
ev
)
{
el
.
closest
(
'
.todo
'
).
data
(
'
todo
'
)
.
attr
(
'
complete
'
,
el
.
is
(
'
:checked
'
))
.
save
();
},
// Listen for a removed Todo
'
.todo .destroy click
'
:
function
(
el
){
el
.
closest
(
'
.todo
'
).
data
(
'
todo
'
).
destroy
();
},
// Listen for toggle all completed Todos
'
#toggle-all change
'
:
function
(
el
,
ev
)
{
var
toggle
=
el
[
0
].
checked
;
can
.
each
(
this
.
options
.
todos
,
function
(
todo
)
{
todo
.
attr
(
'
complete
'
,
toggle
).
save
();
});
},
// Listen for removing all completed Todos
'
#clear-completed click
'
:
function
()
{
for
(
var
i
=
this
.
options
.
todos
.
length
-
1
,
todo
;
i
>
-
1
&&
(
todo
=
this
.
options
.
todos
[
i
]);
i
--
)
{
todo
.
attr
(
'
complete
'
)
&&
todo
.
destroy
();
}
}
})
// Initialize the app
Todo
.
findAll
({},
function
(
todos
)
{
new
Todos
(
'
#todoapp
'
,
{
todos
:
todos
});
});
})();
labs/architecture-examples/canjs/zepto/zepto.0.8-focusblur.js
deleted
100755 → 0
View file @
84b4a7b6
// Zepto.js
// (c) 2010, 2011 Thomas Fuchs
// Zepto.js may be freely distributed under the MIT license.
// Zepto 0.8 with patch for focus/blur delegate support
// https://github.com/madrobby/zepto/commit/ab2a3ef0d18beaf768903f0943efd019a29803f0
(
function
(
undefined
){
if
(
String
.
prototype
.
trim
===
undefined
)
// fix for iOS 3.2
String
.
prototype
.
trim
=
function
(){
return
this
.
replace
(
/^
\s
+/
,
''
).
replace
(
/
\s
+$/
,
''
)
};
// For iOS 3.x
// from https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/reduce
if
(
Array
.
prototype
.
reduce
===
undefined
)
Array
.
prototype
.
reduce
=
function
(
fun
){
if
(
this
===
void
0
||
this
===
null
)
throw
new
TypeError
();
var
t
=
Object
(
this
),
len
=
t
.
length
>>>
0
,
k
=
0
,
accumulator
;
if
(
typeof
fun
!=
'
function
'
)
throw
new
TypeError
();
if
(
len
==
0
&&
arguments
.
length
==
1
)
throw
new
TypeError
();
if
(
arguments
.
length
>=
2
)
accumulator
=
arguments
[
1
];
else
do
{
if
(
k
in
t
){
accumulator
=
t
[
k
++
];
break
;
}
if
(
++
k
>=
len
)
throw
new
TypeError
();
}
while
(
true
);
while
(
k
<
len
){
if
(
k
in
t
)
accumulator
=
fun
.
call
(
undefined
,
accumulator
,
t
[
k
],
k
,
t
);
k
++
;
}
return
accumulator
;
};
})();
// Zepto.js
// (c) 2010, 2011 Thomas Fuchs
// Zepto.js may be freely distributed under the MIT license.
var
Zepto
=
(
function
()
{
var
undefined
,
key
,
$$
,
classList
,
emptyArray
=
[],
slice
=
emptyArray
.
slice
,
document
=
window
.
document
,
elementDisplay
=
{},
classCache
=
{},
getComputedStyle
=
document
.
defaultView
.
getComputedStyle
,
cssNumber
=
{
'
column-count
'
:
1
,
'
columns
'
:
1
,
'
font-weight
'
:
1
,
'
line-height
'
:
1
,
'
opacity
'
:
1
,
'
z-index
'
:
1
,
'
zoom
'
:
1
},
fragmentRE
=
/^
\s
*<
(\w
+
)[^
>
]
*>/
,
elementTypes
=
[
1
,
9
,
11
],
adjacencyOperators
=
[
'
after
'
,
'
prepend
'
,
'
before
'
,
'
append
'
],
table
=
document
.
createElement
(
'
table
'
),
tableRow
=
document
.
createElement
(
'
tr
'
),
containers
=
{
'
tr
'
:
document
.
createElement
(
'
tbody
'
),
'
tbody
'
:
table
,
'
thead
'
:
table
,
'
tfoot
'
:
table
,
'
td
'
:
tableRow
,
'
th
'
:
tableRow
,
'
*
'
:
document
.
createElement
(
'
div
'
)
},
readyRE
=
/complete|loaded|interactive/
,
classSelectorRE
=
/^
\.([\w
-
]
+
)
$/
,
idSelectorRE
=
/^#
([\w
-
]
+
)
$/
,
tagSelectorRE
=
/^
[\w
-
]
+$/
;
function
isF
(
value
)
{
return
({}).
toString
.
call
(
value
)
==
"
[object Function]
"
}
function
isO
(
value
)
{
return
value
instanceof
Object
}
function
isA
(
value
)
{
return
value
instanceof
Array
}
function
likeArray
(
obj
)
{
return
typeof
obj
.
length
==
'
number
'
}
function
compact
(
array
)
{
return
array
.
filter
(
function
(
item
){
return
item
!==
undefined
&&
item
!==
null
})
}
function
flatten
(
array
)
{
return
array
.
length
>
0
?
[].
concat
.
apply
([],
array
)
:
array
}
function
camelize
(
str
)
{
return
str
.
replace
(
/-+
(
.
)?
/g
,
function
(
match
,
chr
){
return
chr
?
chr
.
toUpperCase
()
:
''
})
}
function
dasherize
(
str
){
return
str
.
replace
(
/::/g
,
'
/
'
)
.
replace
(
/
([
A-Z
]
+
)([
A-Z
][
a-z
])
/g
,
'
$1_$2
'
)
.
replace
(
/
([
a-z
\d])([
A-Z
])
/g
,
'
$1_$2
'
)
.
replace
(
/_/g
,
'
-
'
)
.
toLowerCase
();
}
function
uniq
(
array
)
{
return
array
.
filter
(
function
(
item
,
index
,
array
){
return
array
.
indexOf
(
item
)
==
index
})
}
function
classRE
(
name
){
return
name
in
classCache
?
classCache
[
name
]
:
(
classCache
[
name
]
=
new
RegExp
(
'
(^|
\\
s)
'
+
name
+
'
(
\\
s|$)
'
));
}
function
maybeAddPx
(
name
,
value
)
{
return
(
typeof
value
==
"
number
"
&&
!
cssNumber
[
dasherize
(
name
)])
?
value
+
"
px
"
:
value
;
}
function
defaultDisplay
(
nodeName
)
{
var
element
,
display
;
if
(
!
elementDisplay
[
nodeName
])
{
element
=
document
.
createElement
(
nodeName
);
document
.
body
.
appendChild
(
element
);
display
=
getComputedStyle
(
element
,
''
).
getPropertyValue
(
"
display
"
);
element
.
parentNode
.
removeChild
(
element
);
display
==
"
none
"
&&
(
display
=
"
block
"
);
elementDisplay
[
nodeName
]
=
display
;
}
return
elementDisplay
[
nodeName
];
}
function
fragment
(
html
,
name
)
{
if
(
name
===
undefined
)
fragmentRE
.
test
(
html
)
&&
RegExp
.
$1
;
if
(
!
(
name
in
containers
))
name
=
'
*
'
;
var
container
=
containers
[
name
];
container
.
innerHTML
=
''
+
html
;
return
slice
.
call
(
container
.
childNodes
);
}
function
Z
(
dom
,
selector
){
dom
=
dom
||
emptyArray
;
dom
.
__proto__
=
Z
.
prototype
;
dom
.
selector
=
selector
||
''
;
return
dom
;
}
function
$
(
selector
,
context
){
if
(
!
selector
)
return
Z
();
if
(
context
!==
undefined
)
return
$
(
context
).
find
(
selector
);
else
if
(
isF
(
selector
))
return
$
(
document
).
ready
(
selector
);
else
if
(
selector
instanceof
Z
)
return
selector
;
else
{
var
dom
;
if
(
isA
(
selector
))
dom
=
compact
(
selector
);
else
if
(
elementTypes
.
indexOf
(
selector
.
nodeType
)
>=
0
||
selector
===
window
)
dom
=
[
selector
],
selector
=
null
;
else
if
(
fragmentRE
.
test
(
selector
))
dom
=
fragment
(
selector
.
trim
(),
RegExp
.
$1
),
selector
=
null
;
else
if
(
selector
.
nodeType
&&
selector
.
nodeType
==
3
)
dom
=
[
selector
];
else
dom
=
$$
(
document
,
selector
);
return
Z
(
dom
,
selector
);
}
}
$
.
extend
=
function
(
target
){
slice
.
call
(
arguments
,
1
).
forEach
(
function
(
source
)
{
for
(
key
in
source
)
target
[
key
]
=
source
[
key
];
})
return
target
;
}
$
.
qsa
=
$$
=
function
(
element
,
selector
){
var
found
;
return
(
element
===
document
&&
idSelectorRE
.
test
(
selector
))
?
(
(
found
=
element
.
getElementById
(
RegExp
.
$1
))
?
[
found
]
:
emptyArray
)
:
slice
.
call
(
classSelectorRE
.
test
(
selector
)
?
element
.
getElementsByClassName
(
RegExp
.
$1
)
:
tagSelectorRE
.
test
(
selector
)
?
element
.
getElementsByTagName
(
selector
)
:
element
.
querySelectorAll
(
selector
)
);
}
function
filtered
(
nodes
,
selector
){
return
selector
===
undefined
?
$
(
nodes
)
:
$
(
nodes
).
filter
(
selector
);
}
function
funcArg
(
context
,
arg
,
idx
,
payload
){
return
isF
(
arg
)
?
arg
.
call
(
context
,
idx
,
payload
)
:
arg
;
}
$
.
isFunction
=
isF
;
$
.
isObject
=
isO
;
$
.
isArray
=
isA
;
$
.
map
=
function
(
elements
,
callback
)
{
var
value
,
values
=
[],
i
,
key
;
if
(
likeArray
(
elements
))
for
(
i
=
0
;
i
<
elements
.
length
;
i
++
)
{
value
=
callback
(
elements
[
i
],
i
);
if
(
value
!=
null
)
values
.
push
(
value
);
}
else
for
(
key
in
elements
)
{
value
=
callback
(
elements
[
key
],
key
);
if
(
value
!=
null
)
values
.
push
(
value
);
}
return
flatten
(
values
);
}
$
.
each
=
function
(
elements
,
callback
)
{
var
i
,
key
;
if
(
likeArray
(
elements
))
for
(
i
=
0
;
i
<
elements
.
length
;
i
++
)
{
if
(
callback
(
i
,
elements
[
i
])
===
false
)
return
elements
;
}
else
for
(
key
in
elements
)
{
if
(
callback
(
key
,
elements
[
key
])
===
false
)
return
elements
;
}
return
elements
;
}
$
.
fn
=
{
forEach
:
emptyArray
.
forEach
,
reduce
:
emptyArray
.
reduce
,
push
:
emptyArray
.
push
,
indexOf
:
emptyArray
.
indexOf
,
concat
:
emptyArray
.
concat
,
map
:
function
(
fn
){
return
$
.
map
(
this
,
function
(
el
,
i
){
return
fn
.
call
(
el
,
i
,
el
)
});
},
slice
:
function
(){
return
$
(
slice
.
apply
(
this
,
arguments
));
},
ready
:
function
(
callback
){
if
(
readyRE
.
test
(
document
.
readyState
))
callback
(
$
);
else
document
.
addEventListener
(
'
DOMContentLoaded
'
,
function
(){
callback
(
$
)
},
false
);
return
this
;
},
get
:
function
(
idx
){
return
idx
===
undefined
?
this
:
this
[
idx
]
},
size
:
function
(){
return
this
.
length
},
remove
:
function
()
{
return
this
.
each
(
function
()
{
if
(
this
.
parentNode
!=
null
)
{
this
.
parentNode
.
removeChild
(
this
);
}
});
},
each
:
function
(
callback
){
this
.
forEach
(
function
(
el
,
idx
){
callback
.
call
(
el
,
idx
,
el
)
});
return
this
;
},
filter
:
function
(
selector
){
return
$
([].
filter
.
call
(
this
,
function
(
element
){
return
element
.
parentNode
&&
$$
(
element
.
parentNode
,
selector
).
indexOf
(
element
)
>=
0
;
}));
},
end
:
function
(){
return
this
.
prevObject
||
$
();
},
andSelf
:
function
(){
return
this
.
add
(
this
.
prevObject
||
$
())
},
add
:
function
(
selector
,
context
){
return
$
(
uniq
(
this
.
concat
(
$
(
selector
,
context
))));
},
is
:
function
(
selector
){
return
this
.
length
>
0
&&
$
(
this
[
0
]).
filter
(
selector
).
length
>
0
;
},
not
:
function
(
selector
){
var
nodes
=
[];
if
(
isF
(
selector
)
&&
selector
.
call
!==
undefined
)
this
.
each
(
function
(
idx
){
if
(
!
selector
.
call
(
this
,
idx
))
nodes
.
push
(
this
);
});
else
{
var
excludes
=
typeof
selector
==
'
string
'
?
this
.
filter
(
selector
)
:
(
likeArray
(
selector
)
&&
isF
(
selector
.
item
))
?
slice
.
call
(
selector
)
:
$
(
selector
);
this
.
forEach
(
function
(
el
){
if
(
excludes
.
indexOf
(
el
)
<
0
)
nodes
.
push
(
el
);
});
}
return
$
(
nodes
);
},
eq
:
function
(
idx
){
return
idx
===
-
1
?
this
.
slice
(
idx
)
:
this
.
slice
(
idx
,
+
idx
+
1
);
},
first
:
function
(){
var
el
=
this
[
0
];
return
el
&&
!
isO
(
el
)
?
el
:
$
(
el
)
},
last
:
function
(){
var
el
=
this
[
this
.
length
-
1
];
return
el
&&
!
isO
(
el
)
?
el
:
$
(
el
)
},
find
:
function
(
selector
){
var
result
;
if
(
this
.
length
==
1
)
result
=
$$
(
this
[
0
],
selector
);
else
result
=
this
.
map
(
function
(){
return
$$
(
this
,
selector
)
});
return
$
(
result
);
},
closest
:
function
(
selector
,
context
){
var
node
=
this
[
0
],
candidates
=
$$
(
context
||
document
,
selector
);
if
(
!
candidates
.
length
)
node
=
null
;
while
(
node
&&
candidates
.
indexOf
(
node
)
<
0
)
node
=
node
!==
context
&&
node
!==
document
&&
node
.
parentNode
;
return
$
(
node
);
},
parents
:
function
(
selector
){
var
ancestors
=
[],
nodes
=
this
;
while
(
nodes
.
length
>
0
)
nodes
=
$
.
map
(
nodes
,
function
(
node
){
if
((
node
=
node
.
parentNode
)
&&
node
!==
document
&&
ancestors
.
indexOf
(
node
)
<
0
)
{
ancestors
.
push
(
node
);
return
node
;
}
});
return
filtered
(
ancestors
,
selector
);
},
parent
:
function
(
selector
){
return
filtered
(
uniq
(
this
.
pluck
(
'
parentNode
'
)),
selector
);
},
children
:
function
(
selector
){
return
filtered
(
this
.
map
(
function
(){
return
slice
.
call
(
this
.
children
)
}),
selector
);
},
siblings
:
function
(
selector
){
return
filtered
(
this
.
map
(
function
(
i
,
el
){
return
slice
.
call
(
el
.
parentNode
.
children
).
filter
(
function
(
child
){
return
child
!==
el
});
}),
selector
);
},
empty
:
function
(){
return
this
.
each
(
function
(){
this
.
innerHTML
=
''
})
},
pluck
:
function
(
property
){
return
this
.
map
(
function
(){
return
this
[
property
]
})
},
show
:
function
(){
return
this
.
each
(
function
()
{
this
.
style
.
display
==
"
none
"
&&
(
this
.
style
.
display
=
null
);
if
(
getComputedStyle
(
this
,
''
).
getPropertyValue
(
"
display
"
)
==
"
none
"
)
{
this
.
style
.
display
=
defaultDisplay
(
this
.
nodeName
)
}
})
},
replaceWith
:
function
(
newContent
)
{
return
this
.
each
(
function
()
{
$
(
this
).
before
(
newContent
).
remove
();
});
},
wrap
:
function
(
newContent
)
{
return
this
.
each
(
function
()
{
$
(
this
).
wrapAll
(
$
(
newContent
)[
0
].
cloneNode
(
false
));
});
},
wrapAll
:
function
(
newContent
)
{
if
(
this
[
0
])
{
$
(
this
[
0
]).
before
(
newContent
=
$
(
newContent
));
newContent
.
append
(
this
);
}
return
this
;
},
unwrap
:
function
(){
this
.
parent
().
each
(
function
(){
$
(
this
).
replaceWith
(
$
(
this
).
children
());
});
return
this
;
},
hide
:
function
(){
return
this
.
css
(
"
display
"
,
"
none
"
)
},
toggle
:
function
(
setting
){
return
(
setting
===
undefined
?
this
.
css
(
"
display
"
)
==
"
none
"
:
setting
)
?
this
.
show
()
:
this
.
hide
();
},
prev
:
function
(){
return
$
(
this
.
pluck
(
'
previousElementSibling
'
))
},
next
:
function
(){
return
$
(
this
.
pluck
(
'
nextElementSibling
'
))
},
html
:
function
(
html
){
return
html
===
undefined
?
(
this
.
length
>
0
?
this
[
0
].
innerHTML
:
null
)
:
this
.
each
(
function
(
idx
)
{
var
originHtml
=
this
.
innerHTML
;
$
(
this
).
empty
().
append
(
funcArg
(
this
,
html
,
idx
,
originHtml
)
);
});
},
text
:
function
(
text
){
return
text
===
undefined
?
(
this
.
length
>
0
?
this
[
0
].
textContent
:
null
)
:
this
.
each
(
function
(){
this
.
textContent
=
text
});
},
attr
:
function
(
name
,
value
){
var
res
;
return
(
typeof
name
==
'
string
'
&&
value
===
undefined
)
?
(
this
.
length
==
0
?
undefined
:
(
name
==
'
value
'
&&
this
[
0
].
nodeName
==
'
INPUT
'
)
?
this
.
val
()
:
(
!
(
res
=
this
[
0
].
getAttribute
(
name
))
&&
name
in
this
[
0
])
?
this
[
0
][
name
]
:
res
)
:
this
.
each
(
function
(
idx
){
if
(
isO
(
name
))
for
(
key
in
name
)
this
.
setAttribute
(
key
,
name
[
key
])
else
this
.
setAttribute
(
name
,
funcArg
(
this
,
value
,
idx
,
this
.
getAttribute
(
name
)));
});
},
removeAttr
:
function
(
name
)
{
return
this
.
each
(
function
()
{
this
.
removeAttribute
(
name
);
});
},
data
:
function
(
name
,
value
){
return
this
.
attr
(
'
data-
'
+
name
,
value
);
},
val
:
function
(
value
){
return
(
value
===
undefined
)
?
(
this
.
length
>
0
?
this
[
0
].
value
:
null
)
:
this
.
each
(
function
(
idx
){
this
.
value
=
funcArg
(
this
,
value
,
idx
,
this
.
value
);
});
},
offset
:
function
(){
if
(
this
.
length
==
0
)
return
null
;
var
obj
=
this
[
0
].
getBoundingClientRect
();
return
{
left
:
obj
.
left
+
window
.
pageXOffset
,
top
:
obj
.
top
+
window
.
pageYOffset
,
width
:
obj
.
width
,
height
:
obj
.
height
};
},
css
:
function
(
property
,
value
){
if
(
value
===
undefined
&&
typeof
property
==
'
string
'
)
{
return
(
this
.
length
==
0
?
undefined
:
this
[
0
].
style
[
camelize
(
property
)]
||
getComputedStyle
(
this
[
0
],
''
).
getPropertyValue
(
property
)
);
}
var
css
=
''
;
for
(
key
in
property
)
css
+=
dasherize
(
key
)
+
'
:
'
+
maybeAddPx
(
key
,
property
[
key
])
+
'
;
'
;
if
(
typeof
property
==
'
string
'
)
css
=
dasherize
(
property
)
+
"
:
"
+
maybeAddPx
(
property
,
value
);
return
this
.
each
(
function
()
{
this
.
style
.
cssText
+=
'
;
'
+
css
});
},
index
:
function
(
element
){
return
element
?
this
.
indexOf
(
$
(
element
)[
0
])
:
this
.
parent
().
children
().
indexOf
(
this
[
0
]);
},
hasClass
:
function
(
name
){
if
(
this
.
length
<
1
)
return
false
;
else
return
classRE
(
name
).
test
(
this
[
0
].
className
);
},
addClass
:
function
(
name
){
return
this
.
each
(
function
(
idx
)
{
classList
=
[];
var
cls
=
this
.
className
,
newName
=
funcArg
(
this
,
name
,
idx
,
cls
);
newName
.
split
(
/
\s
+/g
).
forEach
(
function
(
klass
)
{
if
(
!
$
(
this
).
hasClass
(
klass
))
{
classList
.
push
(
klass
)
}
},
this
);
classList
.
length
&&
(
this
.
className
+=
(
cls
?
"
"
:
""
)
+
classList
.
join
(
"
"
))
});
},
removeClass
:
function
(
name
){
return
this
.
each
(
function
(
idx
)
{
if
(
name
===
undefined
)
return
this
.
className
=
''
;
classList
=
this
.
className
;
funcArg
(
this
,
name
,
idx
,
classList
).
split
(
/
\s
+/g
).
forEach
(
function
(
klass
)
{
classList
=
classList
.
replace
(
classRE
(
klass
),
"
"
)
});
this
.
className
=
classList
.
trim
()
});
},
toggleClass
:
function
(
name
,
when
){
return
this
.
each
(
function
(
idx
){
var
newName
=
funcArg
(
this
,
name
,
idx
,
this
.
className
);
(
when
===
undefined
?
!
$
(
this
).
hasClass
(
newName
)
:
when
)
?
$
(
this
).
addClass
(
newName
)
:
$
(
this
).
removeClass
(
newName
);
});
}
};
'
filter,add,not,eq,first,last,find,closest,parents,parent,children,siblings
'
.
split
(
'
,
'
).
forEach
(
function
(
property
){
var
fn
=
$
.
fn
[
property
];
$
.
fn
[
property
]
=
function
()
{
var
ret
=
fn
.
apply
(
this
,
arguments
);
ret
.
prevObject
=
this
;
return
ret
;
}
});
[
'
width
'
,
'
height
'
].
forEach
(
function
(
dimension
){
$
.
fn
[
dimension
]
=
function
(
value
)
{
var
offset
,
Dimension
=
dimension
.
replace
(
/./
,
function
(
m
)
{
return
m
[
0
].
toUpperCase
()
});
if
(
value
===
undefined
)
return
this
[
0
]
==
window
?
window
[
'
inner
'
+
Dimension
]
:
this
[
0
]
==
document
?
document
.
documentElement
[
'
offset
'
+
Dimension
]
:
(
offset
=
this
.
offset
())
&&
offset
[
dimension
];
else
return
this
.
each
(
function
(
idx
){
var
el
=
$
(
this
);
el
.
css
(
dimension
,
funcArg
(
this
,
value
,
idx
,
el
[
dimension
]()));
});
}
});
function
insert
(
operator
,
target
,
node
)
{
var
parent
=
(
operator
%
2
)
?
target
:
target
.
parentNode
;
parent
&&
parent
.
insertBefore
(
node
,
!
operator
?
target
.
nextSibling
:
// after
operator
==
1
?
parent
.
firstChild
:
// prepend
operator
==
2
?
target
:
// before
null
);
// append
}
function
traverseNode
(
node
,
fun
)
{
fun
(
node
);
for
(
var
key
in
node
.
childNodes
)
{
traverseNode
(
node
.
childNodes
[
key
],
fun
);
}
}
adjacencyOperators
.
forEach
(
function
(
key
,
operator
)
{
$
.
fn
[
key
]
=
function
(
html
){
var
nodes
=
isO
(
html
)
?
html
:
fragment
(
html
);
if
(
!
(
'
length
'
in
nodes
)
||
nodes
.
nodeType
)
nodes
=
[
nodes
];
if
(
nodes
.
length
<
1
)
return
this
;
var
size
=
this
.
length
,
copyByClone
=
size
>
1
,
inReverse
=
operator
<
2
;
return
this
.
each
(
function
(
index
,
target
){
for
(
var
i
=
0
;
i
<
nodes
.
length
;
i
++
)
{
var
node
=
nodes
[
inReverse
?
nodes
.
length
-
i
-
1
:
i
];
traverseNode
(
node
,
function
(
node
)
{
if
(
node
.
nodeName
!=
null
&&
node
.
nodeName
.
toUpperCase
()
===
'
SCRIPT
'
&&
(
!
node
.
type
||
node
.
type
===
'
text/javascript
'
))
{
window
[
'
eval
'
].
call
(
window
,
node
.
innerHTML
);
}
});
if
(
copyByClone
&&
index
<
size
-
1
)
node
=
node
.
cloneNode
(
true
);
insert
(
operator
,
target
,
node
);
}
});
};
var
reverseKey
=
(
operator
%
2
)
?
key
+
'
To
'
:
'
insert
'
+
(
operator
?
'
Before
'
:
'
After
'
);
$
.
fn
[
reverseKey
]
=
function
(
html
)
{
$
(
html
)[
key
](
this
);
return
this
;
};
});
Z
.
prototype
=
$
.
fn
;
return
$
;
})();
window
.
Zepto
=
Zepto
;
'
$
'
in
window
||
(
window
.
$
=
Zepto
);
// Zepto.js
// (c) 2010, 2011 Thomas Fuchs
// Zepto.js may be freely distributed under the MIT license.
(
function
(
$
){
var
$$
=
$
.
qsa
,
handlers
=
{},
_zid
=
1
,
specialEvents
=
{};
specialEvents
.
click
=
specialEvents
.
mousedown
=
specialEvents
.
mouseup
=
specialEvents
.
mousemove
=
'
MouseEvents
'
;
function
zid
(
element
)
{
return
element
.
_zid
||
(
element
.
_zid
=
_zid
++
);
}
function
findHandlers
(
element
,
event
,
fn
,
selector
)
{
event
=
parse
(
event
);
if
(
event
.
ns
)
var
matcher
=
matcherFor
(
event
.
ns
);
return
(
handlers
[
zid
(
element
)]
||
[]).
filter
(
function
(
handler
)
{
return
handler
&&
(
!
event
.
e
||
handler
.
e
==
event
.
e
)
&&
(
!
event
.
ns
||
matcher
.
test
(
handler
.
ns
))
&&
(
!
fn
||
handler
.
fn
==
fn
)
&&
(
!
selector
||
handler
.
sel
==
selector
);
});
}
function
parse
(
event
)
{
var
parts
=
(
''
+
event
).
split
(
'
.
'
);
return
{
e
:
parts
[
0
],
ns
:
parts
.
slice
(
1
).
sort
().
join
(
'
'
)};
}
function
matcherFor
(
ns
)
{
return
new
RegExp
(
'
(?:^| )
'
+
ns
.
replace
(
'
'
,
'
.* ?
'
)
+
'
(?: |$)
'
);
}
function
eachEvent
(
events
,
fn
,
iterator
){
if
(
$
.
isObject
(
events
))
$
.
each
(
events
,
iterator
);
else
events
.
split
(
/
\s
/
).
forEach
(
function
(
type
){
iterator
(
type
,
fn
)
});
}
function
add
(
element
,
events
,
fn
,
selector
,
getDelegate
,
capture
){
capture
=
!!
capture
;
var
id
=
zid
(
element
),
set
=
(
handlers
[
id
]
||
(
handlers
[
id
]
=
[]));
eachEvent
(
events
,
fn
,
function
(
event
,
fn
){
var
delegate
=
getDelegate
&&
getDelegate
(
fn
,
event
),
callback
=
delegate
||
fn
;
var
proxyfn
=
function
(
event
)
{
var
result
=
callback
.
apply
(
element
,
[
event
].
concat
(
event
.
data
));
if
(
result
===
false
)
event
.
preventDefault
();
return
result
;
};
var
handler
=
$
.
extend
(
parse
(
event
),
{
fn
:
fn
,
proxy
:
proxyfn
,
sel
:
selector
,
del
:
delegate
,
i
:
set
.
length
});
set
.
push
(
handler
);
element
.
addEventListener
(
handler
.
e
,
proxyfn
,
capture
);
});
}
function
remove
(
element
,
events
,
fn
,
selector
){
var
id
=
zid
(
element
);
eachEvent
(
events
||
''
,
fn
,
function
(
event
,
fn
){
findHandlers
(
element
,
event
,
fn
,
selector
).
forEach
(
function
(
handler
){
delete
handlers
[
id
][
handler
.
i
];
element
.
removeEventListener
(
handler
.
e
,
handler
.
proxy
,
false
);
});
});
}
$
.
event
=
{
add
:
add
,
remove
:
remove
}
$
.
fn
.
bind
=
function
(
event
,
callback
){
return
this
.
each
(
function
(){
add
(
this
,
event
,
callback
);
});
};
$
.
fn
.
unbind
=
function
(
event
,
callback
){
return
this
.
each
(
function
(){
remove
(
this
,
event
,
callback
);
});
};
$
.
fn
.
one
=
function
(
event
,
callback
){
return
this
.
each
(
function
(
i
,
element
){
add
(
this
,
event
,
callback
,
null
,
function
(
fn
,
type
){
return
function
(){
var
result
=
fn
.
apply
(
element
,
arguments
);
remove
(
element
,
type
,
fn
);
return
result
;
}
});
});
};
var
returnTrue
=
function
(){
return
true
},
returnFalse
=
function
(){
return
false
},
eventMethods
=
{
preventDefault
:
'
isDefaultPrevented
'
,
stopImmediatePropagation
:
'
isImmediatePropagationStopped
'
,
stopPropagation
:
'
isPropagationStopped
'
};
function
createProxy
(
event
)
{
var
proxy
=
$
.
extend
({
originalEvent
:
event
},
event
);
$
.
each
(
eventMethods
,
function
(
name
,
predicate
)
{
proxy
[
name
]
=
function
(){
this
[
predicate
]
=
returnTrue
;
return
event
[
name
].
apply
(
event
,
arguments
);
};
proxy
[
predicate
]
=
returnFalse
;
})
return
proxy
;
}
// emulates the 'defaultPrevented' property for browsers that have none
function
fix
(
event
)
{
if
(
!
(
'
defaultPrevented
'
in
event
))
{
event
.
defaultPrevented
=
false
;
var
prevent
=
event
.
preventDefault
;
event
.
preventDefault
=
function
()
{
this
.
defaultPrevented
=
true
;
prevent
.
call
(
this
);
}
}
}
$
.
fn
.
delegate
=
function
(
selector
,
event
,
callback
){
var
capture
=
false
;
if
(
event
==
'
blur
'
||
event
==
'
focus
'
){
if
(
$
.
iswebkit
)
event
=
event
==
'
blur
'
?
'
focusout
'
:
event
==
'
focus
'
?
'
focusin
'
:
event
;
else
capture
=
true
;
}
return
this
.
each
(
function
(
i
,
element
){
add
(
element
,
event
,
callback
,
selector
,
function
(
fn
){
return
function
(
e
){
var
evt
,
match
=
$
(
e
.
target
).
closest
(
selector
,
element
).
get
(
0
);
if
(
match
)
{
evt
=
$
.
extend
(
createProxy
(
e
),
{
currentTarget
:
match
,
liveFired
:
element
});
return
fn
.
apply
(
match
,
[
evt
].
concat
([].
slice
.
call
(
arguments
,
1
)));
}
}
},
capture
);
});
};
$
.
fn
.
undelegate
=
function
(
selector
,
event
,
callback
){
return
this
.
each
(
function
(){
remove
(
this
,
event
,
callback
,
selector
);
});
}
$
.
fn
.
live
=
function
(
event
,
callback
){
$
(
document
.
body
).
delegate
(
this
.
selector
,
event
,
callback
);
return
this
;
};
$
.
fn
.
die
=
function
(
event
,
callback
){
$
(
document
.
body
).
undelegate
(
this
.
selector
,
event
,
callback
);
return
this
;
};
$
.
fn
.
on
=
function
(
event
,
selector
,
callback
){
return
selector
===
undefined
||
$
.
isFunction
(
selector
)
?
this
.
bind
(
event
,
selector
)
:
this
.
delegate
(
selector
,
event
,
callback
);
};
$
.
fn
.
off
=
function
(
event
,
selector
,
callback
){
return
selector
===
undefined
||
$
.
isFunction
(
selector
)
?
this
.
unbind
(
event
,
selector
)
:
this
.
undelegate
(
selector
,
event
,
callback
);
};
$
.
fn
.
trigger
=
function
(
event
,
data
){
if
(
typeof
event
==
'
string
'
)
event
=
$
.
Event
(
event
);
fix
(
event
);
event
.
data
=
data
;
return
this
.
each
(
function
(){
this
.
dispatchEvent
(
event
)
});
};
// triggers event handlers on current element just as if an event occurred,
// doesn't trigger an actual event, doesn't bubble
$
.
fn
.
triggerHandler
=
function
(
event
,
data
){
var
e
,
result
;
this
.
each
(
function
(
i
,
element
){
e
=
createProxy
(
typeof
event
==
'
string
'
?
$
.
Event
(
event
)
:
event
);
e
.
data
=
data
;
e
.
target
=
element
;
$
.
each
(
findHandlers
(
element
,
event
.
type
||
event
),
function
(
i
,
handler
){
result
=
handler
.
proxy
(
e
);
if
(
e
.
isImmediatePropagationStopped
())
return
false
;
});
});
return
result
;
};
// shortcut methods for `.bind(event, fn)` for each event type
(
'
focusin focusout load resize scroll unload click dblclick
'
+
'
mousedown mouseup mousemove mouseover mouseout
'
+
'
change select keydown keypress keyup error
'
).
split
(
'
'
).
forEach
(
function
(
event
)
{
$
.
fn
[
event
]
=
function
(
callback
){
return
this
.
bind
(
event
,
callback
)
};
});
[
'
focus
'
,
'
blur
'
].
forEach
(
function
(
name
)
{
$
.
fn
[
name
]
=
function
(
callback
)
{
if
(
callback
)
this
.
bind
(
name
,
callback
);
else
if
(
this
.
length
)
try
{
this
.
get
(
0
)[
name
]()
}
catch
(
e
){};
return
this
;
};
});
$
.
Event
=
function
(
type
,
props
)
{
var
event
=
document
.
createEvent
(
specialEvents
[
type
]
||
'
Events
'
),
bubbles
=
true
;
if
(
props
)
for
(
var
name
in
props
)
(
name
==
'
bubbles
'
)
?
(
bubbles
=
!!
props
[
name
])
:
(
event
[
name
]
=
props
[
name
]);
event
.
initEvent
(
type
,
bubbles
,
true
,
null
,
null
,
null
,
null
,
null
,
null
,
null
,
null
,
null
,
null
,
null
,
null
);
return
event
;
};
})(
Zepto
);
// Zepto.js
// (c) 2010, 2011 Thomas Fuchs
// Zepto.js may be freely distributed under the MIT license.
(
function
(
$
){
function
detect
(
ua
){
var
os
=
(
this
.
os
=
{}),
browser
=
(
this
.
browser
=
{}),
webkit
=
ua
.
match
(
/WebKit
\/([\d
.
]
+
)
/
),
android
=
ua
.
match
(
/
(
Android
)\s
+
([\d
.
]
+
)
/
),
ipad
=
ua
.
match
(
/
(
iPad
)
.*OS
\s([\d
_
]
+
)
/
),
iphone
=
!
ipad
&&
ua
.
match
(
/
(
iPhone
\s
OS
)\s([\d
_
]
+
)
/
),
webos
=
ua
.
match
(
/
(
webOS|hpwOS
)[\s\/]([\d
.
]
+
)
/
),
touchpad
=
webos
&&
ua
.
match
(
/TouchPad/
),
blackberry
=
ua
.
match
(
/
(
BlackBerry
)
.*Version
\/([\d
.
]
+
)
/
);
if
(
webkit
)
browser
.
version
=
webkit
[
1
];
browser
.
webkit
=
!!
webkit
;
if
(
android
)
os
.
android
=
true
,
os
.
version
=
android
[
2
];
if
(
iphone
)
os
.
ios
=
true
,
os
.
version
=
iphone
[
2
].
replace
(
/_/g
,
'
.
'
),
os
.
iphone
=
true
;
if
(
ipad
)
os
.
ios
=
true
,
os
.
version
=
ipad
[
2
].
replace
(
/_/g
,
'
.
'
),
os
.
ipad
=
true
;
if
(
webos
)
os
.
webos
=
true
,
os
.
version
=
webos
[
2
];
if
(
touchpad
)
os
.
touchpad
=
true
;
if
(
blackberry
)
os
.
blackberry
=
true
,
os
.
version
=
blackberry
[
2
];
}
// ### $.os
//
// Object containing information about browser platform
//
// *Example:*
//
// $.os.ios // => true if running on Apple iOS
// $.os.android // => true if running on Android
// $.os.webos // => true if running on HP/Palm WebOS
// $.os.touchpad // => true if running on a HP TouchPad
// $.os.version // => string with a version number, e.g.
// "4.0", "3.1.1", "2.1", etc.
// $.os.iphone // => true if running on iPhone
// $.os.ipad // => true if running on iPad
// $.os.blackberry // => true if running on BlackBerry
//
// ### $.browser
//
// *Example:*
//
// $.browser.webkit // => true if the browser is WebKit-based
// $.browser.version // => WebKit version string
detect
.
call
(
$
,
navigator
.
userAgent
);
// make available to unit tests
$
.
__detect
=
detect
;
})(
Zepto
);
// Zepto.js
// (c) 2010, 2011 Thomas Fuchs
// Zepto.js may be freely distributed under the MIT license.
(
function
(
$
,
undefined
){
var
prefix
=
''
,
eventPrefix
,
endEventName
,
endAnimationName
,
vendors
=
{
Webkit
:
'
webkit
'
,
Moz
:
''
,
O
:
'
o
'
,
ms
:
'
MS
'
},
document
=
window
.
document
,
testEl
=
document
.
createElement
(
'
div
'
),
supportedTransforms
=
/^
((
translate|rotate|scale
)(
X|Y|Z|3d
)?
|matrix
(
3d
)?
|perspective|skew
(
X|Y
)?)
$/i
;
function
downcase
(
str
)
{
return
str
.
toLowerCase
()
}
function
normalizeEvent
(
name
)
{
return
eventPrefix
?
eventPrefix
+
name
:
downcase
(
name
)
};
$
.
each
(
vendors
,
function
(
vendor
,
event
){
if
(
testEl
.
style
[
vendor
+
'
TransitionProperty
'
]
!==
undefined
)
{
prefix
=
'
-
'
+
downcase
(
vendor
)
+
'
-
'
;
eventPrefix
=
event
;
return
false
;
}
});
$
.
fx
=
{
off
:
(
eventPrefix
===
undefined
&&
testEl
.
style
.
transitionProperty
===
undefined
),
cssPrefix
:
prefix
,
transitionEnd
:
normalizeEvent
(
'
TransitionEnd
'
),
animationEnd
:
normalizeEvent
(
'
AnimationEnd
'
)
};
$
.
fn
.
animate
=
function
(
properties
,
duration
,
ease
,
callback
){
if
(
$
.
isObject
(
duration
))
ease
=
duration
.
easing
,
callback
=
duration
.
complete
,
duration
=
duration
.
duration
;
if
(
duration
)
duration
=
duration
/
1000
;
return
this
.
anim
(
properties
,
duration
,
ease
,
callback
);
};
$
.
fn
.
anim
=
function
(
properties
,
duration
,
ease
,
callback
){
var
transforms
,
cssProperties
=
{},
key
,
that
=
this
,
wrappedCallback
,
endEvent
=
$
.
fx
.
transitionEnd
;
if
(
duration
===
undefined
)
duration
=
0.4
;
if
(
$
.
fx
.
off
)
duration
=
0
;
if
(
typeof
properties
==
'
string
'
)
{
// keyframe animation
cssProperties
[
prefix
+
'
animation-name
'
]
=
properties
;
cssProperties
[
prefix
+
'
animation-duration
'
]
=
duration
+
'
s
'
;
endEvent
=
$
.
fx
.
animationEnd
;
}
else
{
// CSS transitions
for
(
key
in
properties
)
if
(
supportedTransforms
.
test
(
key
))
{
transforms
||
(
transforms
=
[]);
transforms
.
push
(
key
+
'
(
'
+
properties
[
key
]
+
'
)
'
);
}
else
cssProperties
[
key
]
=
properties
[
key
];
if
(
transforms
)
cssProperties
[
prefix
+
'
transform
'
]
=
transforms
.
join
(
'
'
);
if
(
!
$
.
fx
.
off
)
cssProperties
[
prefix
+
'
transition
'
]
=
'
all
'
+
duration
+
'
s
'
+
(
ease
||
''
);
}
wrappedCallback
=
function
(){
var
props
=
{};
props
[
prefix
+
'
transition
'
]
=
props
[
prefix
+
'
animation-name
'
]
=
'
none
'
;
$
(
this
).
css
(
props
);
callback
&&
callback
.
call
(
this
);
}
if
(
duration
>
0
)
this
.
one
(
endEvent
,
wrappedCallback
);
setTimeout
(
function
()
{
that
.
css
(
cssProperties
);
if
(
duration
<=
0
)
setTimeout
(
function
()
{
that
.
each
(
function
(){
wrappedCallback
.
call
(
this
)
});
},
0
);
},
0
);
return
this
;
};
testEl
=
null
;
})(
Zepto
);
// Zepto.js
// (c) 2010, 2011 Thomas Fuchs
// Zepto.js may be freely distributed under the MIT license.
(
function
(
$
){
var
jsonpID
=
0
,
isObject
=
$
.
isObject
,
document
=
window
.
document
,
key
,
name
;
// trigger a custom event and return false if it was cancelled
function
triggerAndReturn
(
context
,
eventName
,
data
)
{
var
event
=
$
.
Event
(
eventName
);
$
(
context
).
trigger
(
event
,
data
);
return
!
event
.
defaultPrevented
;
}
// trigger an Ajax "global" event
function
triggerGlobal
(
settings
,
context
,
eventName
,
data
)
{
if
(
settings
.
global
)
return
triggerAndReturn
(
context
||
document
,
eventName
,
data
);
}
// Number of active Ajax requests
$
.
active
=
0
;
function
ajaxStart
(
settings
)
{
if
(
settings
.
global
&&
$
.
active
++
===
0
)
triggerGlobal
(
settings
,
null
,
'
ajaxStart
'
);
}
function
ajaxStop
(
settings
)
{
if
(
settings
.
global
&&
!
(
--
$
.
active
))
triggerGlobal
(
settings
,
null
,
'
ajaxStop
'
);
}
// triggers an extra global event "ajaxBeforeSend" that's like "ajaxSend" but cancelable
function
ajaxBeforeSend
(
xhr
,
settings
)
{
var
context
=
settings
.
context
;
if
(
settings
.
beforeSend
.
call
(
context
,
xhr
,
settings
)
===
false
||
triggerGlobal
(
settings
,
context
,
'
ajaxBeforeSend
'
,
[
xhr
,
settings
])
===
false
)
return
false
;
triggerGlobal
(
settings
,
context
,
'
ajaxSend
'
,
[
xhr
,
settings
]);
}
function
ajaxSuccess
(
data
,
xhr
,
settings
)
{
var
context
=
settings
.
context
,
status
=
'
success
'
;
settings
.
success
.
call
(
context
,
data
,
status
,
xhr
);
triggerGlobal
(
settings
,
context
,
'
ajaxSuccess
'
,
[
xhr
,
settings
,
data
]);
ajaxComplete
(
status
,
xhr
,
settings
);
}
// type: "timeout", "error", "abort", "parsererror"
function
ajaxError
(
error
,
type
,
xhr
,
settings
)
{
var
context
=
settings
.
context
;
settings
.
error
.
call
(
context
,
xhr
,
type
,
error
);
triggerGlobal
(
settings
,
context
,
'
ajaxError
'
,
[
xhr
,
settings
,
error
]);
ajaxComplete
(
type
,
xhr
,
settings
);
}
// status: "success", "notmodified", "error", "timeout", "abort", "parsererror"
function
ajaxComplete
(
status
,
xhr
,
settings
)
{
var
context
=
settings
.
context
;
settings
.
complete
.
call
(
context
,
xhr
,
status
);
triggerGlobal
(
settings
,
context
,
'
ajaxComplete
'
,
[
xhr
,
settings
]);
ajaxStop
(
settings
);
}
// Empty function, used as default callback
function
empty
()
{}
// ### $.ajaxJSONP
//
// Load JSON from a server in a different domain (JSONP)
//
// *Arguments:*
//
// options — object that configure the request,
// see avaliable options below
//
// *Avaliable options:*
//
// url — url to which the request is sent
// success — callback that is executed if the request succeeds
// error — callback that is executed if the server drops error
// context — in which context to execute the callbacks in
//
// *Example:*
//
// $.ajaxJSONP({
// url: 'http://example.com/projects?callback=?',
// success: function (data) {
// projects.push(json);
// }
// });
//
$
.
ajaxJSONP
=
function
(
options
){
var
callbackName
=
'
jsonp
'
+
(
++
jsonpID
),
script
=
document
.
createElement
(
'
script
'
),
abort
=
function
(){
$
(
script
).
remove
();
if
(
callbackName
in
window
)
window
[
callbackName
]
=
empty
;
ajaxComplete
(
xhr
,
options
,
'
abort
'
);
},
xhr
=
{
abort
:
abort
},
abortTimeout
;
window
[
callbackName
]
=
function
(
data
){
clearTimeout
(
abortTimeout
);
$
(
script
).
remove
();
delete
window
[
callbackName
];
ajaxSuccess
(
data
,
xhr
,
options
);
};
script
.
src
=
options
.
url
.
replace
(
/=
\?
/
,
'
=
'
+
callbackName
);
$
(
'
head
'
).
append
(
script
);
if
(
options
.
timeout
>
0
)
abortTimeout
=
setTimeout
(
function
(){
xhr
.
abort
();
ajaxComplete
(
xhr
,
options
,
'
timeout
'
);
},
options
.
timeout
);
return
xhr
;
};
// ### $.ajaxSettings
//
// AJAX settings
//
$
.
ajaxSettings
=
{
// Default type of request
type
:
'
GET
'
,
// Callback that is executed before request
beforeSend
:
empty
,
// Callback that is executed if the request succeeds
success
:
empty
,
// Callback that is executed the the server drops error
error
:
empty
,
// Callback that is executed on request complete (both: error and success)
complete
:
empty
,
// The context for the callbacks
context
:
null
,
// Whether to trigger "global" Ajax events
global
:
true
,
// Transport
xhr
:
function
()
{
return
new
window
.
XMLHttpRequest
();
},
// MIME types mapping
accepts
:
{
script
:
'
text/javascript, application/javascript
'
,
json
:
'
application/json
'
,
xml
:
'
application/xml, text/xml
'
,
html
:
'
text/html
'
,
text
:
'
text/plain
'
},
// Whether the request is to another domain
crossDomain
:
false
,
// Default timeout
timeout
:
0
};
// ### $.ajax
//
// Perform AJAX request
//
// *Arguments:*
//
// options — object that configure the request,
// see avaliable options below
//
// *Avaliable options:*
//
// type ('GET') — type of request GET / POST
// url (window.location) — url to which the request is sent
// data — data to send to server,
// can be string or object
// dataType ('json') — what response type you accept from
// the server:
// 'json', 'xml', 'html', or 'text'
// timeout (0) — request timeout
// beforeSend — callback that is executed before
// request send
// complete — callback that is executed on request
// complete (both: error and success)
// success — callback that is executed if
// the request succeeds
// error — callback that is executed if
// the server drops error
// context — in which context to execute the
// callbacks in
//
// *Example:*
//
// $.ajax({
// type: 'POST',
// url: '/projects',
// data: { name: 'Zepto.js' },
// dataType: 'html',
// timeout: 100,
// context: $('body'),
// success: function (data) {
// this.append(data);
// },
// error: function (xhr, type) {
// alert('Error!');
// }
// });
//
$
.
ajax
=
function
(
options
){
var
settings
=
$
.
extend
({},
options
||
{});
for
(
key
in
$
.
ajaxSettings
)
if
(
settings
[
key
]
===
undefined
)
settings
[
key
]
=
$
.
ajaxSettings
[
key
];
ajaxStart
(
settings
);
if
(
!
settings
.
crossDomain
)
settings
.
crossDomain
=
/^
([\w
-
]
+:
)?\/\/([^\/]
+
)
/
.
test
(
settings
.
url
)
&&
RegExp
.
$2
!=
window
.
location
.
host
;
if
(
/=
\?
/
.
test
(
settings
.
url
))
return
$
.
ajaxJSONP
(
settings
);
if
(
!
settings
.
url
)
settings
.
url
=
window
.
location
.
toString
();
if
(
settings
.
data
&&
!
settings
.
contentType
)
settings
.
contentType
=
'
application/x-www-form-urlencoded
'
;
if
(
isObject
(
settings
.
data
))
settings
.
data
=
$
.
param
(
settings
.
data
);
if
(
settings
.
type
.
match
(
/get/i
)
&&
settings
.
data
)
{
var
queryString
=
settings
.
data
;
if
(
settings
.
url
.
match
(
/
\?
.*=/
))
{
queryString
=
'
&
'
+
queryString
;
}
else
if
(
queryString
[
0
]
!=
'
?
'
)
{
queryString
=
'
?
'
+
queryString
;
}
settings
.
url
+=
queryString
;
}
var
mime
=
settings
.
accepts
[
settings
.
dataType
],
baseHeaders
=
{
},
protocol
=
/^
([\w
-
]
+:
)\/\/
/
.
test
(
settings
.
url
)
?
RegExp
.
$1
:
window
.
location
.
protocol
,
xhr
=
$
.
ajaxSettings
.
xhr
(),
abortTimeout
;
if
(
!
settings
.
crossDomain
)
baseHeaders
[
'
X-Requested-With
'
]
=
'
XMLHttpRequest
'
;
if
(
mime
)
baseHeaders
[
'
Accept
'
]
=
mime
;
settings
.
headers
=
$
.
extend
(
baseHeaders
,
settings
.
headers
||
{});
xhr
.
onreadystatechange
=
function
(){
if
(
xhr
.
readyState
==
4
)
{
clearTimeout
(
abortTimeout
);
var
result
,
error
=
false
;
if
((
xhr
.
status
>=
200
&&
xhr
.
status
<
300
)
||
(
xhr
.
status
==
0
&&
protocol
==
'
file:
'
))
{
if
(
mime
==
'
application/json
'
&&
!
(
/^
\s
*$/
.
test
(
xhr
.
responseText
)))
{
try
{
result
=
JSON
.
parse
(
xhr
.
responseText
);
}
catch
(
e
)
{
error
=
e
;
}
}
else
result
=
xhr
.
responseText
;
if
(
error
)
ajaxError
(
error
,
'
parsererror
'
,
xhr
,
settings
);
else
ajaxSuccess
(
result
,
xhr
,
settings
);
}
else
{
ajaxError
(
null
,
'
error
'
,
xhr
,
settings
);
}
}
};
xhr
.
open
(
settings
.
type
,
settings
.
url
,
true
);
if
(
settings
.
contentType
)
settings
.
headers
[
'
Content-Type
'
]
=
settings
.
contentType
;
for
(
name
in
settings
.
headers
)
xhr
.
setRequestHeader
(
name
,
settings
.
headers
[
name
]);
if
(
ajaxBeforeSend
(
xhr
,
settings
)
===
false
)
{
xhr
.
abort
();
return
false
;
}
if
(
settings
.
timeout
>
0
)
abortTimeout
=
setTimeout
(
function
(){
xhr
.
onreadystatechange
=
empty
;
xhr
.
abort
();
ajaxError
(
null
,
'
timeout
'
,
xhr
,
settings
);
},
settings
.
timeout
);
xhr
.
send
(
settings
.
data
);
return
xhr
;
};
// ### $.get
//
// Load data from the server using a GET request
//
// *Arguments:*
//
// url — url to which the request is sent
// success — callback that is executed if the request succeeds
//
// *Example:*
//
// $.get(
// '/projects/42',
// function (data) {
// $('body').append(data);
// }
// );
//
$
.
get
=
function
(
url
,
success
){
return
$
.
ajax
({
url
:
url
,
success
:
success
})
};
// ### $.post
//
// Load data from the server using POST request
//
// *Arguments:*
//
// url — url to which the request is sent
// [data] — data to send to server, can be string or object
// [success] — callback that is executed if the request succeeds
// [dataType] — type of expected response
// 'json', 'xml', 'html', or 'text'
//
// *Example:*
//
// $.post(
// '/projects',
// { name: 'Zepto.js' },
// function (data) {
// $('body').append(data);
// },
// 'html'
// );
//
$
.
post
=
function
(
url
,
data
,
success
,
dataType
){
if
(
$
.
isFunction
(
data
))
dataType
=
dataType
||
success
,
success
=
data
,
data
=
null
;
return
$
.
ajax
({
type
:
'
POST
'
,
url
:
url
,
data
:
data
,
success
:
success
,
dataType
:
dataType
});
};
// ### $.getJSON
//
// Load JSON from the server using GET request
//
// *Arguments:*
//
// url — url to which the request is sent
// success — callback that is executed if the request succeeds
//
// *Example:*
//
// $.getJSON(
// '/projects/42',
// function (json) {
// projects.push(json);
// }
// );
//
$
.
getJSON
=
function
(
url
,
success
){
return
$
.
ajax
({
url
:
url
,
success
:
success
,
dataType
:
'
json
'
});
};
// ### $.fn.load
//
// Load data from the server into an element
//
// *Arguments:*
//
// url — url to which the request is sent
// [success] — callback that is executed if the request succeeds
//
// *Examples:*
//
// $('#project_container').get(
// '/projects/42',
// function () {
// alert('Project was successfully loaded');
// }
// );
//
// $('#project_comments').get(
// '/projects/42 #comments',
// function () {
// alert('Comments was successfully loaded');
// }
// );
//
$
.
fn
.
load
=
function
(
url
,
success
){
if
(
!
this
.
length
)
return
this
;
var
self
=
this
,
parts
=
url
.
split
(
/
\s
/
),
selector
;
if
(
parts
.
length
>
1
)
url
=
parts
[
0
],
selector
=
parts
[
1
];
$
.
get
(
url
,
function
(
response
){
self
.
html
(
selector
?
$
(
document
.
createElement
(
'
div
'
)).
html
(
response
).
find
(
selector
).
html
()
:
response
);
success
&&
success
.
call
(
self
);
});
return
this
;
};
var
escape
=
encodeURIComponent
;
function
serialize
(
params
,
obj
,
traditional
,
scope
){
var
array
=
$
.
isArray
(
obj
);
$
.
each
(
obj
,
function
(
key
,
value
)
{
if
(
scope
)
key
=
traditional
?
scope
:
scope
+
'
[
'
+
(
array
?
''
:
key
)
+
'
]
'
;
// handle data in serializeArray() format
if
(
!
scope
&&
array
)
params
.
add
(
value
.
name
,
value
.
value
);
// recurse into nested objects
else
if
(
traditional
?
$
.
isArray
(
value
)
:
isObject
(
value
))
serialize
(
params
,
value
,
traditional
,
key
);
else
params
.
add
(
key
,
value
);
});
}
// ### $.param
//
// Encode object as a string of URL-encoded key-value pairs
//
// *Arguments:*
//
// obj — object to serialize
// [traditional] — perform shallow serialization
//
// *Example:*
//
// $.param( { name: 'Zepto.js', version: '0.6' } );
//
$
.
param
=
function
(
obj
,
traditional
){
var
params
=
[];
params
.
add
=
function
(
k
,
v
){
this
.
push
(
escape
(
k
)
+
'
=
'
+
escape
(
v
))
};
serialize
(
params
,
obj
,
traditional
);
return
params
.
join
(
'
&
'
).
replace
(
'
%20
'
,
'
+
'
);
};
})(
Zepto
);
// Zepto.js
// (c) 2010, 2011 Thomas Fuchs
// Zepto.js may be freely distributed under the MIT license.
(
function
(
$
)
{
// ### $.fn.serializeArray
//
// Encode a set of form elements as an array of names and values
//
// *Example:*
//
// $('#login_form').serializeArray();
//
// returns
//
// [
// {
// name: 'email',
// value: 'koss@nocorp.me'
// },
// {
// name: 'password',
// value: '123456'
// }
// ]
//
$
.
fn
.
serializeArray
=
function
()
{
var
result
=
[],
el
;
$
(
Array
.
prototype
.
slice
.
call
(
this
.
get
(
0
).
elements
)
).
each
(
function
()
{
el
=
$
(
this
);
var
type
=
el
.
attr
(
'
type
'
);
if
(
!
this
.
disabled
&&
type
!=
'
submit
'
&&
type
!=
'
reset
'
&&
type
!=
'
button
'
&&
((
type
!=
'
radio
'
&&
type
!=
'
checkbox
'
)
||
this
.
checked
)
)
{
result
.
push
({
name
:
el
.
attr
(
'
name
'
),
value
:
el
.
val
()
});
}
});
return
result
;
};
// ### $.fn.serialize
//
//
// Encode a set of form elements as a string for submission
//
// *Example:*
//
// $('#login_form').serialize();
//
// returns
//
// "email=koss%40nocorp.me&password=123456"
//
$
.
fn
.
serialize
=
function
()
{
var
result
=
[];
this
.
serializeArray
().
forEach
(
function
(
elm
)
{
result
.
push
(
encodeURIComponent
(
elm
.
name
)
+
'
=
'
+
encodeURIComponent
(
elm
.
value
)
);
});
return
result
.
join
(
'
&
'
);
};
// ### $.fn.submit
//
// Bind or trigger the submit event for a form
//
// *Examples:*
//
// To bind a handler for the submit event:
//
// $('#login_form').submit(function (e) {
// alert('Form was submitted!');
// e.preventDefault();
// });
//
// To trigger form submit:
//
// $('#login_form').submit();
//
$
.
fn
.
submit
=
function
(
callback
)
{
if
(
callback
)
this
.
bind
(
'
submit
'
,
callback
)
else
if
(
this
.
length
)
{
var
event
=
$
.
Event
(
'
submit
'
);
this
.
eq
(
0
).
trigger
(
event
);
if
(
!
event
.
defaultPrevented
)
this
.
get
(
0
).
submit
()
}
return
this
;
}
})(
Zepto
);
// Zepto.js
// (c) 2010, 2011 Thomas Fuchs
// Zepto.js may be freely distributed under the MIT license.
(
function
(
$
){
var
touch
=
{},
touchTimeout
;
function
parentIfText
(
node
){
return
'
tagName
'
in
node
?
node
:
node
.
parentNode
;
}
function
swipeDirection
(
x1
,
x2
,
y1
,
y2
){
var
xDelta
=
Math
.
abs
(
x1
-
x2
),
yDelta
=
Math
.
abs
(
y1
-
y2
);
if
(
xDelta
>=
yDelta
)
{
return
(
x1
-
x2
>
0
?
'
Left
'
:
'
Right
'
);
}
else
{
return
(
y1
-
y2
>
0
?
'
Up
'
:
'
Down
'
);
}
}
var
longTapDelay
=
750
;
function
longTap
(){
if
(
touch
.
last
&&
(
Date
.
now
()
-
touch
.
last
>=
longTapDelay
))
{
$
(
touch
.
target
).
trigger
(
'
longTap
'
);
touch
=
{};
}
}
$
(
document
).
ready
(
function
(){
$
(
document
.
body
).
bind
(
'
touchstart
'
,
function
(
e
){
var
now
=
Date
.
now
(),
delta
=
now
-
(
touch
.
last
||
now
);
touch
.
target
=
parentIfText
(
e
.
touches
[
0
].
target
);
touchTimeout
&&
clearTimeout
(
touchTimeout
);
touch
.
x1
=
e
.
touches
[
0
].
pageX
;
touch
.
y1
=
e
.
touches
[
0
].
pageY
;
if
(
delta
>
0
&&
delta
<=
250
)
touch
.
isDoubleTap
=
true
;
touch
.
last
=
now
;
setTimeout
(
longTap
,
longTapDelay
);
}).
bind
(
'
touchmove
'
,
function
(
e
){
touch
.
x2
=
e
.
touches
[
0
].
pageX
;
touch
.
y2
=
e
.
touches
[
0
].
pageY
;
}).
bind
(
'
touchend
'
,
function
(
e
){
if
(
touch
.
isDoubleTap
)
{
$
(
touch
.
target
).
trigger
(
'
doubleTap
'
);
touch
=
{};
}
else
if
(
touch
.
x2
>
0
||
touch
.
y2
>
0
)
{
(
Math
.
abs
(
touch
.
x1
-
touch
.
x2
)
>
30
||
Math
.
abs
(
touch
.
y1
-
touch
.
y2
)
>
30
)
&&
$
(
touch
.
target
).
trigger
(
'
swipe
'
)
&&
$
(
touch
.
target
).
trigger
(
'
swipe
'
+
(
swipeDirection
(
touch
.
x1
,
touch
.
x2
,
touch
.
y1
,
touch
.
y2
)));
touch
.
x1
=
touch
.
x2
=
touch
.
y1
=
touch
.
y2
=
touch
.
last
=
0
;
}
else
if
(
'
last
'
in
touch
)
{
touchTimeout
=
setTimeout
(
function
(){
touchTimeout
=
null
;
$
(
touch
.
target
).
trigger
(
'
tap
'
)
touch
=
{};
},
250
);
}
}).
bind
(
'
touchcancel
'
,
function
(){
touch
=
{}
});
});
[
'
swipe
'
,
'
swipeLeft
'
,
'
swipeRight
'
,
'
swipeUp
'
,
'
swipeDown
'
,
'
doubleTap
'
,
'
tap
'
,
'
longTap
'
].
forEach
(
function
(
m
){
$
.
fn
[
m
]
=
function
(
callback
){
return
this
.
bind
(
m
,
callback
)
}
});
})(
Zepto
);
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment