Skip to content
Toggle navigation
Toggle navigation
This project
Loading...
Sign in
brainfood
/
rivets
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Graphs
Network
Create a new issue
Commits
Issue Boards
Files
Commits
Network
Compare
Branches
Tags
a022aef3
authored
2013-04-19 19:10:20 -0400
by
Zack Owens
Browse Files
Options
Browse Files
Tag
Download
Plain Diff
updating fork
2 parents
d0ec373e
7311b968
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
202 additions
and
60 deletions
component.json
lib/rivets.js
lib/rivets.min.js
package.json
spec/rivets/routines.js
src/rivets.coffee
component.json
View file @
a022aef
...
...
@@ -2,8 +2,8 @@
"name"
:
"rivets"
,
"repo"
:
"mikeric/rivets"
,
"description"
:
"Declarative data binding facility."
,
"version"
:
"0.4.
5
"
,
"keywords"
:
[
"data binding"
,
"templat
e
"
],
"version"
:
"0.4.
8
"
,
"keywords"
:
[
"data binding"
,
"templat
ing
"
],
"scripts"
:
[
"lib/rivets.js"
],
"main"
:
"lib/rivets.js"
,
"license"
:
"MIT"
...
...
lib/rivets.js
View file @
a022aef
// rivets.js
// version: 0.4.
5
// version: 0.4.
8
// author: Michael Richards
// license: MIT
(
function
()
{
var
Rivets
,
bindEvent
,
getInputValue
,
rivets
,
unbindEvent
,
var
Rivets
,
bindEvent
,
factory
,
getInputValue
,
unbindEvent
,
__bind
=
function
(
fn
,
me
){
return
function
(){
return
fn
.
apply
(
me
,
arguments
);
};
},
__slice
=
[].
slice
,
__indexOf
=
[].
indexOf
||
function
(
item
)
{
for
(
var
i
=
0
,
l
=
this
.
length
;
i
<
l
;
i
++
)
{
if
(
i
in
this
&&
this
[
i
]
===
item
)
return
i
;
}
return
-
1
;
};
...
...
@@ -405,6 +405,15 @@
getInputValue
=
function
(
el
)
{
var
o
,
_i
,
_len
,
_results
;
if
(
window
.
jQuery
!=
null
)
{
el
=
jQuery
(
el
);
switch
(
el
[
0
].
type
)
{
case
'checkbox'
:
return
el
.
is
(
':checked'
);
default
:
return
el
.
val
();
}
}
else
{
switch
(
el
.
type
)
{
case
'checkbox'
:
return
el
.
checked
;
...
...
@@ -421,6 +430,7 @@
default
:
return
el
.
value
;
}
}
};
Rivets
.
binders
=
{
...
...
@@ -439,8 +449,9 @@
return
unbindEvent
(
el
,
'change'
,
this
.
currentListener
);
},
routine
:
function
(
el
,
value
)
{
var
_ref
;
if
(
el
.
type
===
'radio'
)
{
return
el
.
checked
=
el
.
value
===
value
;
return
el
.
checked
=
((
_ref
=
el
.
value
)
!=
null
?
_ref
.
toString
()
:
void
0
)
===
(
value
!=
null
?
value
.
toString
()
:
void
0
)
;
}
else
{
return
el
.
checked
=
!!
value
;
}
...
...
@@ -455,8 +466,9 @@
return
unbindEvent
(
el
,
'change'
,
this
.
currentListener
);
},
routine
:
function
(
el
,
value
)
{
var
_ref
;
if
(
el
.
type
===
'radio'
)
{
return
el
.
checked
=
el
.
value
!==
value
;
return
el
.
checked
=
((
_ref
=
el
.
value
)
!=
null
?
_ref
.
toString
()
:
void
0
)
!==
(
value
!=
null
?
value
.
toString
()
:
void
0
)
;
}
else
{
return
el
.
checked
=
!
value
;
}
...
...
@@ -480,20 +492,27 @@
return
unbindEvent
(
el
,
'change'
,
this
.
currentListener
);
},
routine
:
function
(
el
,
value
)
{
var
o
,
_i
,
_len
,
_ref
,
_results
;
var
o
,
_i
,
_len
,
_ref
,
_ref1
,
_ref2
,
_results
;
if
(
window
.
jQuery
!=
null
)
{
el
=
jQuery
(
el
);
if
((
value
!=
null
?
value
.
toString
()
:
void
0
)
!==
((
_ref
=
el
.
val
())
!=
null
?
_ref
.
toString
()
:
void
0
))
{
return
el
.
val
(
value
!=
null
?
value
:
''
);
}
}
else
{
if
(
el
.
type
===
'select-multiple'
)
{
if
(
value
!=
null
)
{
_results
=
[];
for
(
_i
=
0
,
_len
=
el
.
length
;
_i
<
_len
;
_i
++
)
{
o
=
el
[
_i
];
_results
.
push
(
o
.
selected
=
(
_ref
=
o
.
value
,
__indexOf
.
call
(
value
,
_ref
)
>=
0
));
_results
.
push
(
o
.
selected
=
(
_ref1
=
o
.
value
,
__indexOf
.
call
(
value
,
_ref1
)
>=
0
));
}
return
_results
;
}
}
else
{
}
else
if
((
value
!=
null
?
value
.
toString
()
:
void
0
)
!==
((
_ref2
=
el
.
value
)
!=
null
?
_ref2
.
toString
()
:
void
0
))
{
return
el
.
value
=
value
!=
null
?
value
:
''
;
}
}
}
},
text
:
function
(
el
,
value
)
{
if
(
el
.
innerText
!=
null
)
{
...
...
@@ -581,11 +600,11 @@
Rivets
.
formatters
=
{};
rivets
=
{
binders
:
Rivets
.
binders
,
formatters
:
Rivets
.
formatters
,
config
:
Rivets
.
config
,
configure
:
function
(
options
)
{
factory
=
function
(
exports
)
{
exports
.
binders
=
Rivets
.
binders
;
exports
.
formatters
=
Rivets
.
formatters
;
exports
.
config
=
Rivets
.
config
;
exports
.
configure
=
function
(
options
)
{
var
property
,
value
;
if
(
options
==
null
)
{
options
=
{};
...
...
@@ -594,8 +613,8 @@
value
=
options
[
property
];
Rivets
.
config
[
property
]
=
value
;
}
}
,
bind
:
function
(
el
,
models
)
{
}
;
return
exports
.
bind
=
function
(
el
,
models
)
{
var
view
;
if
(
models
==
null
)
{
models
=
{};
...
...
@@ -603,13 +622,18 @@
view
=
new
Rivets
.
View
(
el
,
models
);
view
.
bind
();
return
view
;
}
}
;
};
if
(
typeof
module
!==
"undefined"
&&
module
!==
null
)
{
module
.
exports
=
rivets
;
if
(
typeof
exports
===
'object'
)
{
factory
(
exports
);
}
else
if
(
typeof
define
===
'function'
&&
define
.
amd
)
{
define
([
'exports'
],
function
(
exports
)
{
factory
(
this
.
rivets
=
exports
);
return
exports
;
});
}
else
{
this
.
rivets
=
rivets
;
factory
(
this
.
rivets
=
{})
;
}
}).
call
(
this
);
...
...
lib/rivets.min.js
View file @
a022aef
// rivets.js
// version: 0.4.
5
// version: 0.4.
8
// author: Michael Richards
// license: MIT
(
function
(){
var
e
,
t
,
n
,
r
,
i
,
s
=
function
(
e
,
t
){
return
function
(){
return
e
.
apply
(
t
,
arguments
)}},
o
=
[].
slice
,
u
=
[].
indexOf
||
function
(
e
){
for
(
var
t
=
0
,
n
=
this
.
length
;
t
<
n
;
t
++
)
if
(
t
in
this
&&
this
[
t
]
===
e
)
return
t
;
return
-
1
};
e
=
{},
String
.
prototype
.
trim
||
(
String
.
prototype
.
trim
=
function
(){
return
this
.
replace
(
/^
\s
+|
\s
+$/g
,
""
)}),
e
.
Binding
=
function
(){
function
t
(
t
,
n
,
r
,
i
,
o
){
var
u
,
a
,
f
,
l
;
this
.
el
=
t
,
this
.
type
=
n
,
this
.
model
=
r
,
this
.
keypath
=
i
,
this
.
options
=
o
!=
null
?
o
:{},
this
.
unbind
=
s
(
this
.
unbind
,
this
),
this
.
bind
=
s
(
this
.
bind
,
this
),
this
.
publish
=
s
(
this
.
publish
,
this
),
this
.
sync
=
s
(
this
.
sync
,
this
),
this
.
set
=
s
(
this
.
set
,
this
),
this
.
formattedValue
=
s
(
this
.
formattedValue
,
this
);
if
(
!
(
this
.
binder
=
e
.
binders
[
n
])){
l
=
e
.
binders
;
for
(
u
in
l
)
f
=
l
[
u
],
u
!==
"*"
&&
u
.
indexOf
(
"*"
)
!==-
1
&&
(
a
=
new
RegExp
(
"^"
+
u
.
replace
(
"*"
,
".+"
)
+
"$"
),
a
.
test
(
n
)
&&
(
this
.
binder
=
f
,
this
.
args
=
(
new
RegExp
(
"^"
+
u
.
replace
(
"*"
,
"(.+)"
)
+
"$"
)).
exec
(
n
),
this
.
args
.
shift
()))}
this
.
binder
||
(
this
.
binder
=
e
.
binders
[
"*"
]),
this
.
binder
instanceof
Function
&&
(
this
.
binder
=
{
routine
:
this
.
binder
}),
this
.
formatters
=
this
.
options
.
formatters
||
[]}
return
t
.
prototype
.
formattedValue
=
function
(
t
){
var
n
,
r
,
i
,
s
,
u
,
a
;
a
=
this
.
formatters
;
for
(
s
=
0
,
u
=
a
.
length
;
s
<
u
;
s
++
)
r
=
a
[
s
],
n
=
r
.
split
(
/
\s
+/
),
i
=
n
.
shift
(),
r
=
this
.
model
[
i
]
instanceof
Function
?
this
.
model
[
i
]:
e
.
formatters
[
i
],(
r
!=
null
?
r
.
read
:
void
0
)
instanceof
Function
?
t
=
r
.
read
.
apply
(
r
,[
t
].
concat
(
o
.
call
(
n
))):
r
instanceof
Function
&&
(
t
=
r
.
apply
(
null
,[
t
].
concat
(
o
.
call
(
n
))));
return
t
},
t
.
prototype
.
set
=
function
(
e
){
var
t
;
return
e
=
e
instanceof
Function
&&!
this
.
binder
[
"function"
]?
this
.
formattedValue
(
e
.
call
(
this
.
model
)):
this
.
formattedValue
(
e
),(
t
=
this
.
binder
.
routine
)
!=
null
?
t
.
call
(
this
,
this
.
el
,
e
):
void
0
},
t
.
prototype
.
sync
=
function
(){
return
this
.
set
(
this
.
options
.
bypass
?
this
.
model
[
this
.
keypath
]:
e
.
config
.
adapter
.
read
(
this
.
model
,
this
.
keypath
))},
t
.
prototype
.
publish
=
function
(){
var
t
,
r
,
i
,
s
,
u
,
a
,
f
,
l
,
c
;
s
=
n
(
this
.
el
),
f
=
this
.
formatters
.
slice
(
0
).
reverse
();
for
(
u
=
0
,
a
=
f
.
length
;
u
<
a
;
u
++
){
r
=
f
[
u
],
t
=
r
.
split
(
/
\s
+/
),
i
=
t
.
shift
();
if
((
l
=
e
.
formatters
[
i
])
!=
null
?
l
.
publish
:
void
0
)
s
=
(
c
=
e
.
formatters
[
i
]).
publish
.
apply
(
c
,[
s
].
concat
(
o
.
call
(
t
)))}
return
e
.
config
.
adapter
.
publish
(
this
.
model
,
this
.
keypath
,
s
)},
t
.
prototype
.
bind
=
function
(){
var
t
,
n
,
r
,
i
,
s
,
o
,
u
,
a
,
f
;(
o
=
this
.
binder
.
bind
)
!=
null
&&
o
.
call
(
this
,
this
.
el
),
this
.
options
.
bypass
?
this
.
sync
():(
e
.
config
.
adapter
.
subscribe
(
this
.
model
,
this
.
keypath
,
this
.
sync
),
e
.
config
.
preloadData
&&
this
.
sync
());
if
((
u
=
this
.
options
.
dependencies
)
!=
null
?
u
.
length
:
void
0
){
a
=
this
.
options
.
dependencies
,
f
=
[];
for
(
i
=
0
,
s
=
a
.
length
;
i
<
s
;
i
++
)
t
=
a
[
i
],
/^
\.
/
.
test
(
t
)?(
r
=
this
.
model
,
n
=
t
.
substr
(
1
)):(
t
=
t
.
split
(
"."
),
r
=
this
.
view
.
models
[
t
.
shift
()],
n
=
t
.
join
(
"."
)),
f
.
push
(
e
.
config
.
adapter
.
subscribe
(
r
,
n
,
this
.
sync
));
return
f
}},
t
.
prototype
.
unbind
=
function
(){
var
t
,
n
,
r
,
i
,
s
,
o
,
u
,
a
,
f
;(
o
=
this
.
binder
.
unbind
)
!=
null
&&
o
.
call
(
this
,
this
.
el
),
this
.
options
.
bypass
||
e
.
config
.
adapter
.
unsubscribe
(
this
.
model
,
this
.
keypath
,
this
.
sync
);
if
((
u
=
this
.
options
.
dependencies
)
!=
null
?
u
.
length
:
void
0
){
a
=
this
.
options
.
dependencies
,
f
=
[];
for
(
i
=
0
,
s
=
a
.
length
;
i
<
s
;
i
++
)
t
=
a
[
i
],
/^
\.
/
.
test
(
t
)?(
r
=
this
.
model
,
n
=
t
.
substr
(
1
)):(
t
=
t
.
split
(
"."
),
r
=
this
.
view
.
models
[
t
.
shift
()],
n
=
t
.
join
(
"."
)),
f
.
push
(
e
.
config
.
adapter
.
unsubscribe
(
r
,
n
,
this
.
sync
));
return
f
}},
t
}(),
e
.
View
=
function
(){
function
t
(
e
,
t
){
this
.
els
=
e
,
this
.
models
=
t
,
this
.
publish
=
s
(
this
.
publish
,
this
),
this
.
sync
=
s
(
this
.
sync
,
this
),
this
.
unbind
=
s
(
this
.
unbind
,
this
),
this
.
bind
=
s
(
this
.
bind
,
this
),
this
.
select
=
s
(
this
.
select
,
this
),
this
.
build
=
s
(
this
.
build
,
this
),
this
.
bindingRegExp
=
s
(
this
.
bindingRegExp
,
this
),
this
.
els
.
jquery
||
this
.
els
instanceof
Array
||
(
this
.
els
=
[
this
.
els
]),
this
.
build
()}
return
t
.
prototype
.
bindingRegExp
=
function
(){
var
t
;
return
t
=
e
.
config
.
prefix
,
t
?
new
RegExp
(
"^data-"
+
t
+
"-"
):
/^data-/
},
t
.
prototype
.
build
=
function
(){
var
t
,
n
,
r
,
i
,
s
,
o
,
a
,
f
,
l
,
c
,
h
,
p
=
this
;
this
.
bindings
=
[],
s
=
[],
t
=
this
.
bindingRegExp
(),
i
=
function
(
n
){
var
r
,
i
,
o
,
a
,
f
,
l
,
c
,
h
,
d
,
v
,
m
,
g
,
y
,
b
,
w
,
E
,
S
,
x
,
T
,
N
,
C
,
k
,
L
,
A
,
O
,
M
,
_
,
D
,
P
;
if
(
u
.
call
(
s
,
n
)
<
0
){
M
=
n
.
attributes
;
for
(
N
=
0
,
L
=
M
.
length
;
N
<
L
;
N
++
){
r
=
M
[
N
];
if
(
t
.
test
(
r
.
name
)){
x
=
r
.
name
.
replace
(
t
,
""
);
if
(
!
(
o
=
e
.
binders
[
x
])){
_
=
e
.
binders
;
for
(
h
in
_
)
T
=
_
[
h
],
h
!==
"*"
&&
h
.
indexOf
(
"*"
)
!==-
1
&&
(
E
=
new
RegExp
(
"^"
+
h
.
replace
(
"*"
,
".+"
)
+
"$"
),
E
.
test
(
x
)
&&
(
o
=
T
))}
o
||
(
o
=
e
.
binders
[
"*"
]);
if
(
o
.
block
){
D
=
n
.
getElementsByTagName
(
"*"
);
for
(
C
=
0
,
A
=
D
.
length
;
C
<
A
;
C
++
)
m
=
D
[
C
],
s
.
push
(
m
);
i
=
[
r
]}}}
P
=
i
||
n
.
attributes
;
for
(
k
=
0
,
O
=
P
.
length
;
k
<
O
;
k
++
){
r
=
P
[
k
];
if
(
t
.
test
(
r
.
name
)){
g
=
{},
x
=
r
.
name
.
replace
(
t
,
""
),
w
=
function
(){
var
e
,
t
,
n
,
i
;
n
=
r
.
value
.
split
(
"|"
),
i
=
[];
for
(
e
=
0
,
t
=
n
.
length
;
e
<
t
;
e
++
)
b
=
n
[
e
],
i
.
push
(
b
.
trim
());
return
i
}(),
f
=
function
(){
var
e
,
t
,
n
,
r
;
n
=
w
.
shift
().
split
(
"<"
),
r
=
[];
for
(
e
=
0
,
t
=
n
.
length
;
e
<
t
;
e
++
)
l
=
n
[
e
],
r
.
push
(
l
.
trim
());
return
r
}(),
y
=
f
.
shift
(),
S
=
y
.
split
(
/
\.
|:/
),
g
.
formatters
=
w
,
g
.
bypass
=
y
.
indexOf
(
":"
)
!==-
1
,
S
[
0
]?
v
=
p
.
models
[
S
.
shift
()]:(
v
=
p
.
models
,
S
.
shift
()),
d
=
S
.
join
(
"."
);
if
(
v
){
if
(
c
=
f
.
shift
())
g
.
dependencies
=
c
.
split
(
/
\s
+/
);
a
=
new
e
.
Binding
(
n
,
x
,
v
,
d
,
g
),
a
.
view
=
p
,
p
.
bindings
.
push
(
a
)}}}
i
&&
(
i
=
null
)}},
c
=
this
.
els
;
for
(
o
=
0
,
f
=
c
.
length
;
o
<
f
;
o
++
){
n
=
c
[
o
],
i
(
n
),
h
=
n
.
getElementsByTagName
(
"*"
);
for
(
a
=
0
,
l
=
h
.
length
;
a
<
l
;
a
++
)
r
=
h
[
a
],
r
.
attributes
!=
null
&&
i
(
r
)}},
t
.
prototype
.
select
=
function
(
e
){
var
t
,
n
,
r
,
i
,
s
;
i
=
this
.
bindings
,
s
=
[];
for
(
n
=
0
,
r
=
i
.
length
;
n
<
r
;
n
++
)
t
=
i
[
n
],
e
(
t
)
&&
s
.
push
(
t
);
return
s
},
t
.
prototype
.
bind
=
function
(){
var
e
,
t
,
n
,
r
,
i
;
r
=
this
.
bindings
,
i
=
[];
for
(
t
=
0
,
n
=
r
.
length
;
t
<
n
;
t
++
)
e
=
r
[
t
],
i
.
push
(
e
.
bind
());
return
i
},
t
.
prototype
.
unbind
=
function
(){
var
e
,
t
,
n
,
r
,
i
;
r
=
this
.
bindings
,
i
=
[];
for
(
t
=
0
,
n
=
r
.
length
;
t
<
n
;
t
++
)
e
=
r
[
t
],
i
.
push
(
e
.
unbind
());
return
i
},
t
.
prototype
.
sync
=
function
(){
var
e
,
t
,
n
,
r
,
i
;
r
=
this
.
bindings
,
i
=
[];
for
(
t
=
0
,
n
=
r
.
length
;
t
<
n
;
t
++
)
e
=
r
[
t
],
i
.
push
(
e
.
sync
());
return
i
},
t
.
prototype
.
publish
=
function
(){
var
e
,
t
,
n
,
r
,
i
;
r
=
this
.
select
(
function
(
e
){
return
e
.
binder
.
publishes
}),
i
=
[];
for
(
t
=
0
,
n
=
r
.
length
;
t
<
n
;
t
++
)
e
=
r
[
t
],
i
.
push
(
e
.
publish
());
return
i
},
t
}(),
t
=
function
(
e
,
t
,
n
,
r
){
var
i
;
return
i
=
function
(
e
){
return
n
.
call
(
r
,
e
)},
window
.
jQuery
!=
null
?(
e
=
jQuery
(
e
),
e
.
on
!=
null
?
e
.
on
(
t
,
i
):
e
.
bind
(
t
,
i
)):
window
.
addEventListener
!=
null
?
e
.
addEventListener
(
t
,
i
,
!
1
):(
t
=
"on"
+
t
,
e
.
attachEvent
(
t
,
i
)),
i
},
i
=
function
(
e
,
t
,
n
){
return
window
.
jQuery
!=
null
?(
e
=
jQuery
(
e
),
e
.
off
!=
null
?
e
.
off
(
t
,
n
):
e
.
unbind
(
t
,
n
)):
window
.
removeEventListener
?
e
.
removeEventListener
(
t
,
n
,
!
1
):(
t
=
"on"
+
t
,
e
.
detachEvent
(
t
,
n
))},
n
=
function
(
e
){
var
t
,
n
,
r
,
i
;
switch
(
e
.
type
){
case
"checkbox"
:
return
e
.
checked
;
case
"select-multiple"
:
i
=
[];
for
(
n
=
0
,
r
=
e
.
length
;
n
<
r
;
n
++
)
t
=
e
[
n
],
t
.
selected
&&
i
.
push
(
t
.
value
);
return
i
;
default
:
return
e
.
value
}},
e
.
binders
=
{
enabled
:
function
(
e
,
t
){
return
e
.
disabled
=!
t
},
disabled
:
function
(
e
,
t
){
return
e
.
disabled
=!!
t
},
checked
:{
publishes
:
!
0
,
bind
:
function
(
e
){
return
this
.
currentListener
=
t
(
e
,
"change"
,
this
.
publish
)},
unbind
:
function
(
e
){
return
i
(
e
,
"change"
,
this
.
currentListener
)},
routine
:
function
(
e
,
t
){
return
e
.
type
===
"radio"
?
e
.
checked
=
e
.
value
===
t
:
e
.
checked
=!!
t
}},
unchecked
:{
publishes
:
!
0
,
bind
:
function
(
e
){
return
this
.
currentListener
=
t
(
e
,
"change"
,
this
.
publish
)},
unbind
:
function
(
e
){
return
i
(
e
,
"change"
,
this
.
currentListener
)},
routine
:
function
(
e
,
t
){
return
e
.
type
===
"radio"
?
e
.
checked
=
e
.
value
!==
t
:
e
.
checked
=!
t
}},
show
:
function
(
e
,
t
){
return
e
.
style
.
display
=
t
?
""
:
"none"
},
hide
:
function
(
e
,
t
){
return
e
.
style
.
display
=
t
?
"none"
:
""
},
html
:
function
(
e
,
t
){
return
e
.
innerHTML
=
t
!=
null
?
t
:
""
},
value
:{
publishes
:
!
0
,
bind
:
function
(
e
){
return
this
.
currentListener
=
t
(
e
,
"change"
,
this
.
publish
)},
unbind
:
function
(
e
){
return
i
(
e
,
"change"
,
this
.
currentListener
)},
routine
:
function
(
e
,
t
){
var
n
,
r
,
i
,
s
,
o
;
if
(
e
.
type
!==
"select-multiple"
)
return
e
.
value
=
t
!=
null
?
t
:
""
;
if
(
t
!=
null
){
o
=
[];
for
(
r
=
0
,
i
=
e
.
length
;
r
<
i
;
r
++
)
n
=
e
[
r
],
o
.
push
(
n
.
selected
=
(
s
=
n
.
value
,
u
.
call
(
t
,
s
)
>=
0
));
return
o
}}},
text
:
function
(
e
,
t
){
return
e
.
innerText
!=
null
?
e
.
innerText
=
t
!=
null
?
t
:
""
:
e
.
textContent
=
t
!=
null
?
t
:
""
},
"on-*"
:{
"function"
:
!
0
,
routine
:
function
(
e
,
n
){
return
this
.
currentListener
&&
i
(
e
,
this
.
args
[
0
],
this
.
currentListener
),
this
.
currentListener
=
t
(
e
,
this
.
args
[
0
],
n
,
this
.
model
)}},
"each-*"
:{
block
:
!
0
,
bind
:
function
(
e
,
t
){
return
e
.
removeAttribute
([
"data"
,
r
.
config
.
prefix
,
this
.
type
].
join
(
"-"
).
replace
(
"--"
,
"-"
))},
routine
:
function
(
e
,
t
){
var
n
,
i
,
s
,
o
,
u
,
a
,
f
,
l
,
c
,
h
,
p
,
d
,
v
,
m
,
g
,
y
,
b
,
w
,
E
;
if
(
this
.
iterated
!=
null
){
g
=
this
.
iterated
;
for
(
c
=
0
,
d
=
g
.
length
;
c
<
d
;
c
++
){
l
=
g
[
c
],
l
.
unbind
(),
y
=
l
.
els
;
for
(
h
=
0
,
v
=
y
.
length
;
h
<
v
;
h
++
)
i
=
y
[
h
],
i
.
parentNode
.
removeChild
(
i
)}}
else
this
.
marker
=
document
.
createComment
(
" rivets: "
+
this
.
type
+
" "
),
e
.
parentNode
.
insertBefore
(
this
.
marker
,
e
),
e
.
parentNode
.
removeChild
(
e
);
this
.
iterated
=
[];
if
(
t
){
E
=
[];
for
(
p
=
0
,
m
=
t
.
length
;
p
<
m
;
p
++
){
s
=
t
[
p
],
n
=
{},
b
=
this
.
view
.
models
;
for
(
a
in
b
)
u
=
b
[
a
],
n
[
a
]
=
u
;
n
[
this
.
args
[
0
]]
=
s
,
o
=
e
.
cloneNode
(
!
0
),
this
.
iterated
.
length
>
0
?
f
=
this
.
iterated
[
this
.
iterated
.
length
-
1
].
els
[
0
]:
f
=
this
.
marker
,
this
.
marker
.
parentNode
.
insertBefore
(
o
,(
w
=
f
.
nextSibling
)
!=
null
?
w
:
null
),
E
.
push
(
this
.
iterated
.
push
(
r
.
bind
(
o
,
n
)))}
return
E
}}},
"class-*"
:
function
(
e
,
t
){
var
n
;
n
=
" "
+
e
.
className
+
" "
;
if
(
!
t
==
(
n
.
indexOf
(
" "
+
this
.
args
[
0
]
+
" "
)
!==-
1
))
return
e
.
className
=
t
?
""
+
e
.
className
+
" "
+
this
.
args
[
0
]:
n
.
replace
(
" "
+
this
.
args
[
0
]
+
" "
,
" "
).
trim
()},
"*"
:
function
(
e
,
t
){
return
t
?
e
.
setAttribute
(
this
.
type
,
t
):
e
.
removeAttribute
(
this
.
type
)}},
e
.
config
=
{
preloadData
:
!
0
},
e
.
formatters
=
{},
r
=
{
binders
:
e
.
binders
,
formatters
:
e
.
formatters
,
config
:
e
.
config
,
configure
:
function
(
t
){
var
n
,
r
;
t
==
null
&&
(
t
=
{});
for
(
n
in
t
)
r
=
t
[
n
],
e
.
config
[
n
]
=
r
},
bind
:
function
(
t
,
n
){
var
r
;
return
n
==
null
&&
(
n
=
{}),
r
=
new
e
.
View
(
t
,
n
),
r
.
bind
(),
r
}},
typeof
module
!=
"undefined"
&&
module
!==
null
?
module
.
exports
=
r
:
this
.
rivets
=
r
}).
call
(
this
);
\ No newline at end of file
(
function
(){
var
e
,
t
,
n
,
r
,
i
,
s
=
function
(
e
,
t
){
return
function
(){
return
e
.
apply
(
t
,
arguments
)}},
o
=
[].
slice
,
u
=
[].
indexOf
||
function
(
e
){
for
(
var
t
=
0
,
n
=
this
.
length
;
t
<
n
;
t
++
)
if
(
t
in
this
&&
this
[
t
]
===
e
)
return
t
;
return
-
1
};
e
=
{},
String
.
prototype
.
trim
||
(
String
.
prototype
.
trim
=
function
(){
return
this
.
replace
(
/^
\s
+|
\s
+$/g
,
""
)}),
e
.
Binding
=
function
(){
function
t
(
t
,
n
,
r
,
i
,
o
){
var
u
,
a
,
f
,
l
;
this
.
el
=
t
,
this
.
type
=
n
,
this
.
model
=
r
,
this
.
keypath
=
i
,
this
.
options
=
o
!=
null
?
o
:{},
this
.
unbind
=
s
(
this
.
unbind
,
this
),
this
.
bind
=
s
(
this
.
bind
,
this
),
this
.
publish
=
s
(
this
.
publish
,
this
),
this
.
sync
=
s
(
this
.
sync
,
this
),
this
.
set
=
s
(
this
.
set
,
this
),
this
.
formattedValue
=
s
(
this
.
formattedValue
,
this
);
if
(
!
(
this
.
binder
=
e
.
binders
[
n
])){
l
=
e
.
binders
;
for
(
u
in
l
)
f
=
l
[
u
],
u
!==
"*"
&&
u
.
indexOf
(
"*"
)
!==-
1
&&
(
a
=
new
RegExp
(
"^"
+
u
.
replace
(
"*"
,
".+"
)
+
"$"
),
a
.
test
(
n
)
&&
(
this
.
binder
=
f
,
this
.
args
=
(
new
RegExp
(
"^"
+
u
.
replace
(
"*"
,
"(.+)"
)
+
"$"
)).
exec
(
n
),
this
.
args
.
shift
()))}
this
.
binder
||
(
this
.
binder
=
e
.
binders
[
"*"
]),
this
.
binder
instanceof
Function
&&
(
this
.
binder
=
{
routine
:
this
.
binder
}),
this
.
formatters
=
this
.
options
.
formatters
||
[]}
return
t
.
prototype
.
formattedValue
=
function
(
t
){
var
n
,
r
,
i
,
s
,
u
,
a
;
a
=
this
.
formatters
;
for
(
s
=
0
,
u
=
a
.
length
;
s
<
u
;
s
++
)
r
=
a
[
s
],
n
=
r
.
split
(
/
\s
+/
),
i
=
n
.
shift
(),
r
=
this
.
model
[
i
]
instanceof
Function
?
this
.
model
[
i
]:
e
.
formatters
[
i
],(
r
!=
null
?
r
.
read
:
void
0
)
instanceof
Function
?
t
=
r
.
read
.
apply
(
r
,[
t
].
concat
(
o
.
call
(
n
))):
r
instanceof
Function
&&
(
t
=
r
.
apply
(
null
,[
t
].
concat
(
o
.
call
(
n
))));
return
t
},
t
.
prototype
.
set
=
function
(
e
){
var
t
;
return
e
=
e
instanceof
Function
&&!
this
.
binder
[
"function"
]?
this
.
formattedValue
(
e
.
call
(
this
.
model
)):
this
.
formattedValue
(
e
),(
t
=
this
.
binder
.
routine
)
!=
null
?
t
.
call
(
this
,
this
.
el
,
e
):
void
0
},
t
.
prototype
.
sync
=
function
(){
return
this
.
set
(
this
.
options
.
bypass
?
this
.
model
[
this
.
keypath
]:
e
.
config
.
adapter
.
read
(
this
.
model
,
this
.
keypath
))},
t
.
prototype
.
publish
=
function
(){
var
t
,
n
,
i
,
s
,
u
,
a
,
f
,
l
,
c
;
s
=
r
(
this
.
el
),
f
=
this
.
formatters
.
slice
(
0
).
reverse
();
for
(
u
=
0
,
a
=
f
.
length
;
u
<
a
;
u
++
){
n
=
f
[
u
],
t
=
n
.
split
(
/
\s
+/
),
i
=
t
.
shift
();
if
((
l
=
e
.
formatters
[
i
])
!=
null
?
l
.
publish
:
void
0
)
s
=
(
c
=
e
.
formatters
[
i
]).
publish
.
apply
(
c
,[
s
].
concat
(
o
.
call
(
t
)))}
return
e
.
config
.
adapter
.
publish
(
this
.
model
,
this
.
keypath
,
s
)},
t
.
prototype
.
bind
=
function
(){
var
t
,
n
,
r
,
i
,
s
,
o
,
u
,
a
,
f
;(
o
=
this
.
binder
.
bind
)
!=
null
&&
o
.
call
(
this
,
this
.
el
),
this
.
options
.
bypass
?
this
.
sync
():(
e
.
config
.
adapter
.
subscribe
(
this
.
model
,
this
.
keypath
,
this
.
sync
),
e
.
config
.
preloadData
&&
this
.
sync
());
if
((
u
=
this
.
options
.
dependencies
)
!=
null
?
u
.
length
:
void
0
){
a
=
this
.
options
.
dependencies
,
f
=
[];
for
(
i
=
0
,
s
=
a
.
length
;
i
<
s
;
i
++
)
t
=
a
[
i
],
/^
\.
/
.
test
(
t
)?(
r
=
this
.
model
,
n
=
t
.
substr
(
1
)):(
t
=
t
.
split
(
"."
),
r
=
this
.
view
.
models
[
t
.
shift
()],
n
=
t
.
join
(
"."
)),
f
.
push
(
e
.
config
.
adapter
.
subscribe
(
r
,
n
,
this
.
sync
));
return
f
}},
t
.
prototype
.
unbind
=
function
(){
var
t
,
n
,
r
,
i
,
s
,
o
,
u
,
a
,
f
;(
o
=
this
.
binder
.
unbind
)
!=
null
&&
o
.
call
(
this
,
this
.
el
),
this
.
options
.
bypass
||
e
.
config
.
adapter
.
unsubscribe
(
this
.
model
,
this
.
keypath
,
this
.
sync
);
if
((
u
=
this
.
options
.
dependencies
)
!=
null
?
u
.
length
:
void
0
){
a
=
this
.
options
.
dependencies
,
f
=
[];
for
(
i
=
0
,
s
=
a
.
length
;
i
<
s
;
i
++
)
t
=
a
[
i
],
/^
\.
/
.
test
(
t
)?(
r
=
this
.
model
,
n
=
t
.
substr
(
1
)):(
t
=
t
.
split
(
"."
),
r
=
this
.
view
.
models
[
t
.
shift
()],
n
=
t
.
join
(
"."
)),
f
.
push
(
e
.
config
.
adapter
.
unsubscribe
(
r
,
n
,
this
.
sync
));
return
f
}},
t
}(),
e
.
View
=
function
(){
function
t
(
e
,
t
){
this
.
els
=
e
,
this
.
models
=
t
,
this
.
publish
=
s
(
this
.
publish
,
this
),
this
.
sync
=
s
(
this
.
sync
,
this
),
this
.
unbind
=
s
(
this
.
unbind
,
this
),
this
.
bind
=
s
(
this
.
bind
,
this
),
this
.
select
=
s
(
this
.
select
,
this
),
this
.
build
=
s
(
this
.
build
,
this
),
this
.
bindingRegExp
=
s
(
this
.
bindingRegExp
,
this
),
this
.
els
.
jquery
||
this
.
els
instanceof
Array
||
(
this
.
els
=
[
this
.
els
]),
this
.
build
()}
return
t
.
prototype
.
bindingRegExp
=
function
(){
var
t
;
return
t
=
e
.
config
.
prefix
,
t
?
new
RegExp
(
"^data-"
+
t
+
"-"
):
/^data-/
},
t
.
prototype
.
build
=
function
(){
var
t
,
n
,
r
,
i
,
s
,
o
,
a
,
f
,
l
,
c
,
h
,
p
=
this
;
this
.
bindings
=
[],
s
=
[],
t
=
this
.
bindingRegExp
(),
i
=
function
(
n
){
var
r
,
i
,
o
,
a
,
f
,
l
,
c
,
h
,
d
,
v
,
m
,
g
,
y
,
b
,
w
,
E
,
S
,
x
,
T
,
N
,
C
,
k
,
L
,
A
,
O
,
M
,
_
,
D
,
P
;
if
(
u
.
call
(
s
,
n
)
<
0
){
M
=
n
.
attributes
;
for
(
N
=
0
,
L
=
M
.
length
;
N
<
L
;
N
++
){
r
=
M
[
N
];
if
(
t
.
test
(
r
.
name
)){
x
=
r
.
name
.
replace
(
t
,
""
);
if
(
!
(
o
=
e
.
binders
[
x
])){
_
=
e
.
binders
;
for
(
h
in
_
)
T
=
_
[
h
],
h
!==
"*"
&&
h
.
indexOf
(
"*"
)
!==-
1
&&
(
E
=
new
RegExp
(
"^"
+
h
.
replace
(
"*"
,
".+"
)
+
"$"
),
E
.
test
(
x
)
&&
(
o
=
T
))}
o
||
(
o
=
e
.
binders
[
"*"
]);
if
(
o
.
block
){
D
=
n
.
getElementsByTagName
(
"*"
);
for
(
C
=
0
,
A
=
D
.
length
;
C
<
A
;
C
++
)
m
=
D
[
C
],
s
.
push
(
m
);
i
=
[
r
]}}}
P
=
i
||
n
.
attributes
;
for
(
k
=
0
,
O
=
P
.
length
;
k
<
O
;
k
++
){
r
=
P
[
k
];
if
(
t
.
test
(
r
.
name
)){
g
=
{},
x
=
r
.
name
.
replace
(
t
,
""
),
w
=
function
(){
var
e
,
t
,
n
,
i
;
n
=
r
.
value
.
split
(
"|"
),
i
=
[];
for
(
e
=
0
,
t
=
n
.
length
;
e
<
t
;
e
++
)
b
=
n
[
e
],
i
.
push
(
b
.
trim
());
return
i
}(),
f
=
function
(){
var
e
,
t
,
n
,
r
;
n
=
w
.
shift
().
split
(
"<"
),
r
=
[];
for
(
e
=
0
,
t
=
n
.
length
;
e
<
t
;
e
++
)
l
=
n
[
e
],
r
.
push
(
l
.
trim
());
return
r
}(),
y
=
f
.
shift
(),
S
=
y
.
split
(
/
\.
|:/
),
g
.
formatters
=
w
,
g
.
bypass
=
y
.
indexOf
(
":"
)
!==-
1
,
S
[
0
]?
v
=
p
.
models
[
S
.
shift
()]:(
v
=
p
.
models
,
S
.
shift
()),
d
=
S
.
join
(
"."
);
if
(
v
){
if
(
c
=
f
.
shift
())
g
.
dependencies
=
c
.
split
(
/
\s
+/
);
a
=
new
e
.
Binding
(
n
,
x
,
v
,
d
,
g
),
a
.
view
=
p
,
p
.
bindings
.
push
(
a
)}}}
i
&&
(
i
=
null
)}},
c
=
this
.
els
;
for
(
o
=
0
,
f
=
c
.
length
;
o
<
f
;
o
++
){
n
=
c
[
o
],
i
(
n
),
h
=
n
.
getElementsByTagName
(
"*"
);
for
(
a
=
0
,
l
=
h
.
length
;
a
<
l
;
a
++
)
r
=
h
[
a
],
r
.
attributes
!=
null
&&
i
(
r
)}},
t
.
prototype
.
select
=
function
(
e
){
var
t
,
n
,
r
,
i
,
s
;
i
=
this
.
bindings
,
s
=
[];
for
(
n
=
0
,
r
=
i
.
length
;
n
<
r
;
n
++
)
t
=
i
[
n
],
e
(
t
)
&&
s
.
push
(
t
);
return
s
},
t
.
prototype
.
bind
=
function
(){
var
e
,
t
,
n
,
r
,
i
;
r
=
this
.
bindings
,
i
=
[];
for
(
t
=
0
,
n
=
r
.
length
;
t
<
n
;
t
++
)
e
=
r
[
t
],
i
.
push
(
e
.
bind
());
return
i
},
t
.
prototype
.
unbind
=
function
(){
var
e
,
t
,
n
,
r
,
i
;
r
=
this
.
bindings
,
i
=
[];
for
(
t
=
0
,
n
=
r
.
length
;
t
<
n
;
t
++
)
e
=
r
[
t
],
i
.
push
(
e
.
unbind
());
return
i
},
t
.
prototype
.
sync
=
function
(){
var
e
,
t
,
n
,
r
,
i
;
r
=
this
.
bindings
,
i
=
[];
for
(
t
=
0
,
n
=
r
.
length
;
t
<
n
;
t
++
)
e
=
r
[
t
],
i
.
push
(
e
.
sync
());
return
i
},
t
.
prototype
.
publish
=
function
(){
var
e
,
t
,
n
,
r
,
i
;
r
=
this
.
select
(
function
(
e
){
return
e
.
binder
.
publishes
}),
i
=
[];
for
(
t
=
0
,
n
=
r
.
length
;
t
<
n
;
t
++
)
e
=
r
[
t
],
i
.
push
(
e
.
publish
());
return
i
},
t
}(),
t
=
function
(
e
,
t
,
n
,
r
){
var
i
;
return
i
=
function
(
e
){
return
n
.
call
(
r
,
e
)},
window
.
jQuery
!=
null
?(
e
=
jQuery
(
e
),
e
.
on
!=
null
?
e
.
on
(
t
,
i
):
e
.
bind
(
t
,
i
)):
window
.
addEventListener
!=
null
?
e
.
addEventListener
(
t
,
i
,
!
1
):(
t
=
"on"
+
t
,
e
.
attachEvent
(
t
,
i
)),
i
},
i
=
function
(
e
,
t
,
n
){
return
window
.
jQuery
!=
null
?(
e
=
jQuery
(
e
),
e
.
off
!=
null
?
e
.
off
(
t
,
n
):
e
.
unbind
(
t
,
n
)):
window
.
removeEventListener
?
e
.
removeEventListener
(
t
,
n
,
!
1
):(
t
=
"on"
+
t
,
e
.
detachEvent
(
t
,
n
))},
r
=
function
(
e
){
var
t
,
n
,
r
,
i
;
if
(
window
.
jQuery
!=
null
){
e
=
jQuery
(
e
);
switch
(
e
[
0
].
type
){
case
"checkbox"
:
return
e
.
is
(
":checked"
);
default
:
return
e
.
val
()}}
else
switch
(
e
.
type
){
case
"checkbox"
:
return
e
.
checked
;
case
"select-multiple"
:
i
=
[];
for
(
n
=
0
,
r
=
e
.
length
;
n
<
r
;
n
++
)
t
=
e
[
n
],
t
.
selected
&&
i
.
push
(
t
.
value
);
return
i
;
default
:
return
e
.
value
}},
e
.
binders
=
{
enabled
:
function
(
e
,
t
){
return
e
.
disabled
=!
t
},
disabled
:
function
(
e
,
t
){
return
e
.
disabled
=!!
t
},
checked
:{
publishes
:
!
0
,
bind
:
function
(
e
){
return
this
.
currentListener
=
t
(
e
,
"change"
,
this
.
publish
)},
unbind
:
function
(
e
){
return
i
(
e
,
"change"
,
this
.
currentListener
)},
routine
:
function
(
e
,
t
){
var
n
;
return
e
.
type
===
"radio"
?
e
.
checked
=
((
n
=
e
.
value
)
!=
null
?
n
.
toString
():
void
0
)
===
(
t
!=
null
?
t
.
toString
():
void
0
):
e
.
checked
=!!
t
}},
unchecked
:{
publishes
:
!
0
,
bind
:
function
(
e
){
return
this
.
currentListener
=
t
(
e
,
"change"
,
this
.
publish
)},
unbind
:
function
(
e
){
return
i
(
e
,
"change"
,
this
.
currentListener
)},
routine
:
function
(
e
,
t
){
var
n
;
return
e
.
type
===
"radio"
?
e
.
checked
=
((
n
=
e
.
value
)
!=
null
?
n
.
toString
():
void
0
)
!==
(
t
!=
null
?
t
.
toString
():
void
0
):
e
.
checked
=!
t
}},
show
:
function
(
e
,
t
){
return
e
.
style
.
display
=
t
?
""
:
"none"
},
hide
:
function
(
e
,
t
){
return
e
.
style
.
display
=
t
?
"none"
:
""
},
html
:
function
(
e
,
t
){
return
e
.
innerHTML
=
t
!=
null
?
t
:
""
},
value
:{
publishes
:
!
0
,
bind
:
function
(
e
){
return
this
.
currentListener
=
t
(
e
,
"change"
,
this
.
publish
)},
unbind
:
function
(
e
){
return
i
(
e
,
"change"
,
this
.
currentListener
)},
routine
:
function
(
e
,
t
){
var
n
,
r
,
i
,
s
,
o
,
a
,
f
;
if
(
window
.
jQuery
!=
null
){
e
=
jQuery
(
e
);
if
((
t
!=
null
?
t
.
toString
():
void
0
)
!==
((
s
=
e
.
val
())
!=
null
?
s
.
toString
():
void
0
))
return
e
.
val
(
t
!=
null
?
t
:
""
)}
else
if
(
e
.
type
===
"select-multiple"
){
if
(
t
!=
null
){
f
=
[];
for
(
r
=
0
,
i
=
e
.
length
;
r
<
i
;
r
++
)
n
=
e
[
r
],
f
.
push
(
n
.
selected
=
(
o
=
n
.
value
,
u
.
call
(
t
,
o
)
>=
0
));
return
f
}}
else
if
((
t
!=
null
?
t
.
toString
():
void
0
)
!==
((
a
=
e
.
value
)
!=
null
?
a
.
toString
():
void
0
))
return
e
.
value
=
t
!=
null
?
t
:
""
}},
text
:
function
(
e
,
t
){
return
e
.
innerText
!=
null
?
e
.
innerText
=
t
!=
null
?
t
:
""
:
e
.
textContent
=
t
!=
null
?
t
:
""
},
"on-*"
:{
"function"
:
!
0
,
routine
:
function
(
e
,
n
){
return
this
.
currentListener
&&
i
(
e
,
this
.
args
[
0
],
this
.
currentListener
),
this
.
currentListener
=
t
(
e
,
this
.
args
[
0
],
n
,
this
.
model
)}},
"each-*"
:{
block
:
!
0
,
bind
:
function
(
e
,
t
){
return
e
.
removeAttribute
([
"data"
,
rivets
.
config
.
prefix
,
this
.
type
].
join
(
"-"
).
replace
(
"--"
,
"-"
))},
routine
:
function
(
e
,
t
){
var
n
,
r
,
i
,
s
,
o
,
u
,
a
,
f
,
l
,
c
,
h
,
p
,
d
,
v
,
m
,
g
,
y
,
b
,
w
;
if
(
this
.
iterated
!=
null
){
m
=
this
.
iterated
;
for
(
l
=
0
,
p
=
m
.
length
;
l
<
p
;
l
++
){
f
=
m
[
l
],
f
.
unbind
(),
g
=
f
.
els
;
for
(
c
=
0
,
d
=
g
.
length
;
c
<
d
;
c
++
)
r
=
g
[
c
],
r
.
parentNode
.
removeChild
(
r
)}}
else
this
.
marker
=
document
.
createComment
(
" rivets: "
+
this
.
type
+
" "
),
e
.
parentNode
.
insertBefore
(
this
.
marker
,
e
),
e
.
parentNode
.
removeChild
(
e
);
this
.
iterated
=
[];
if
(
t
){
w
=
[];
for
(
h
=
0
,
v
=
t
.
length
;
h
<
v
;
h
++
){
i
=
t
[
h
],
n
=
{},
y
=
this
.
view
.
models
;
for
(
u
in
y
)
o
=
y
[
u
],
n
[
u
]
=
o
;
n
[
this
.
args
[
0
]]
=
i
,
s
=
e
.
cloneNode
(
!
0
),
this
.
iterated
.
length
>
0
?
a
=
this
.
iterated
[
this
.
iterated
.
length
-
1
].
els
[
0
]:
a
=
this
.
marker
,
this
.
marker
.
parentNode
.
insertBefore
(
s
,(
b
=
a
.
nextSibling
)
!=
null
?
b
:
null
),
w
.
push
(
this
.
iterated
.
push
(
rivets
.
bind
(
s
,
n
)))}
return
w
}}},
"class-*"
:
function
(
e
,
t
){
var
n
;
n
=
" "
+
e
.
className
+
" "
;
if
(
!
t
==
(
n
.
indexOf
(
" "
+
this
.
args
[
0
]
+
" "
)
!==-
1
))
return
e
.
className
=
t
?
""
+
e
.
className
+
" "
+
this
.
args
[
0
]:
n
.
replace
(
" "
+
this
.
args
[
0
]
+
" "
,
" "
).
trim
()},
"*"
:
function
(
e
,
t
){
return
t
?
e
.
setAttribute
(
this
.
type
,
t
):
e
.
removeAttribute
(
this
.
type
)}},
e
.
config
=
{
preloadData
:
!
0
},
e
.
formatters
=
{},
n
=
function
(
t
){
return
t
.
binders
=
e
.
binders
,
t
.
formatters
=
e
.
formatters
,
t
.
config
=
e
.
config
,
t
.
configure
=
function
(
t
){
var
n
,
r
;
t
==
null
&&
(
t
=
{});
for
(
n
in
t
)
r
=
t
[
n
],
e
.
config
[
n
]
=
r
},
t
.
bind
=
function
(
t
,
n
){
var
r
;
return
n
==
null
&&
(
n
=
{}),
r
=
new
e
.
View
(
t
,
n
),
r
.
bind
(),
r
}},
typeof
exports
==
"object"
?
n
(
exports
):
typeof
define
==
"function"
&&
define
.
amd
?
define
([
"exports"
],
function
(
e
){
return
n
(
this
.
rivets
=
e
),
e
}):
n
(
this
.
rivets
=
{})}).
call
(
this
);
\ No newline at end of file
...
...
package.json
View file @
a022aef
{
"name"
:
"rivets"
,
"description"
:
"Declarative data binding facility."
,
"version"
:
"0.4.
5
"
,
"version"
:
"0.4.
8
"
,
"author"
:
"Michael Richards"
,
"url"
:
"http://rivetsjs.com"
,
"main"
:
"./lib/rivets.js"
,
...
...
spec/rivets/routines.js
View file @
a022aef
describe
(
'Routines'
,
function
()
{
var
el
,
input
;
var
el
,
input
,
trueRadioInput
,
falseRadioInput
,
checkboxInput
;
var
createInputElement
=
function
(
type
,
value
)
{
var
elem
=
document
.
createElement
(
'input'
);
elem
.
setAttribute
(
'type'
,
type
);
if
(
value
!==
undefined
){
elem
.
setAttribute
(
'value'
,
value
);
}
document
.
body
.
appendChild
(
elem
);
return
elem
;
};
beforeEach
(
function
()
{
rivets
.
configure
({
...
...
@@ -12,8 +22,27 @@ describe('Routines', function() {
});
el
=
document
.
createElement
(
'div'
);
input
=
document
.
createElement
(
'input'
);
input
.
setAttribute
(
'type'
,
'text'
);
document
.
body
.
appendChild
(
el
);
input
=
createInputElement
(
'text'
);
// to test the radio input scenario when its value is "true"
trueRadioInput
=
createInputElement
(
'radio'
,
'true'
);
// to test the radio input scenario when its value is "false"
falseRadioInput
=
createInputElement
(
'radio'
,
'false'
);
// to test the checkbox input scenario
checkboxInput
=
createInputElement
(
'checkbox'
);
});
afterEach
(
function
(){
el
.
parentNode
.
removeChild
(
el
);
input
.
parentNode
.
removeChild
(
input
);
trueRadioInput
.
parentNode
.
removeChild
(
trueRadioInput
);
falseRadioInput
.
parentNode
.
removeChild
(
falseRadioInput
);
checkboxInput
.
parentNode
.
removeChild
(
checkboxInput
);
});
describe
(
'text'
,
function
()
{
...
...
@@ -126,33 +155,101 @@ describe('Routines', function() {
});
describe
(
'checked'
,
function
()
{
describe
(
'with a truthy value'
,
function
()
{
it
(
'checks the element'
,
function
()
{
rivets
.
binders
.
checked
.
routine
(
el
,
true
);
expect
(
el
.
checked
).
toBe
(
true
);
describe
(
'with a checkbox input'
,
function
()
{
describe
(
'and a truthy value'
,
function
()
{
it
(
'checks the checkbox input'
,
function
()
{
rivets
.
binders
.
checked
.
routine
(
checkboxInput
,
true
);
expect
(
checkboxInput
.
checked
).
toBe
(
true
);
});
});
describe
(
'with a falsey value'
,
function
()
{
it
(
'unchecks the element'
,
function
()
{
rivets
.
binders
.
checked
.
routine
(
el
,
false
);
expect
(
el
.
checked
).
toBe
(
false
);
it
(
'unchecks the checkbox input'
,
function
()
{
rivets
.
binders
.
checked
.
routine
(
checkboxInput
,
false
);
expect
(
checkboxInput
.
checked
).
toBe
(
false
);
});
});
});
describe
(
'with a radio input with value="true"'
,
function
()
{
describe
(
'and a truthy value'
,
function
()
{
it
(
'checks the radio input'
,
function
()
{
rivets
.
binders
.
checked
.
routine
(
trueRadioInput
,
true
);
expect
(
trueRadioInput
.
checked
).
toBe
(
true
);
});
});
describe
(
'with a falsey value'
,
function
()
{
it
(
'unchecks the radio input'
,
function
()
{
rivets
.
binders
.
checked
.
routine
(
trueRadioInput
,
false
);
expect
(
trueRadioInput
.
checked
).
toBe
(
false
);
});
});
});
describe
(
'with a radio input with value="false"'
,
function
()
{
describe
(
'and a truthy value'
,
function
()
{
it
(
'checks the radio input'
,
function
()
{
rivets
.
binders
.
checked
.
routine
(
falseRadioInput
,
true
);
expect
(
falseRadioInput
.
checked
).
toBe
(
false
);
});
});
describe
(
'with a falsey value'
,
function
()
{
it
(
'unchecks the radio input'
,
function
()
{
rivets
.
binders
.
checked
.
routine
(
falseRadioInput
,
false
);
expect
(
falseRadioInput
.
checked
).
toBe
(
true
);
});
});
});
});
describe
(
'unchecked'
,
function
()
{
describe
(
'with a truthy value'
,
function
()
{
it
(
'unchecks the element'
,
function
()
{
rivets
.
binders
.
unchecked
.
routine
(
el
,
true
);
expect
(
el
.
checked
).
toBe
(
false
);
describe
(
'and a truthy value'
,
function
()
{
describe
(
'and a truthy value'
,
function
()
{
it
(
'checks the checkbox input'
,
function
()
{
rivets
.
binders
.
unchecked
.
routine
(
checkboxInput
,
true
);
expect
(
checkboxInput
.
checked
).
toBe
(
false
);
});
});
describe
(
'with a falsey value'
,
function
()
{
it
(
'unchecks the checkbox input'
,
function
()
{
rivets
.
binders
.
unchecked
.
routine
(
checkboxInput
,
false
);
expect
(
checkboxInput
.
checked
).
toBe
(
true
);
});
});
});
describe
(
'with a radio input with value="true"'
,
function
()
{
describe
(
'and a truthy value'
,
function
()
{
it
(
'checks the radio input'
,
function
()
{
rivets
.
binders
.
unchecked
.
routine
(
trueRadioInput
,
true
);
expect
(
trueRadioInput
.
checked
).
toBe
(
false
);
});
});
describe
(
'with a falsey value'
,
function
()
{
it
(
'checks the element'
,
function
()
{
rivets
.
binders
.
unchecked
.
routine
(
el
,
false
);
expect
(
el
.
checked
).
toBe
(
true
);
it
(
'unchecks the radio input'
,
function
()
{
rivets
.
binders
.
unchecked
.
routine
(
trueRadioInput
,
false
);
expect
(
trueRadioInput
.
checked
).
toBe
(
true
);
});
});
});
describe
(
'with a radio input with value="false"'
,
function
()
{
describe
(
'and a truthy value'
,
function
()
{
it
(
'checks the radio input'
,
function
()
{
rivets
.
binders
.
unchecked
.
routine
(
falseRadioInput
,
true
);
expect
(
falseRadioInput
.
checked
).
toBe
(
true
);
});
});
describe
(
'with a falsey value'
,
function
()
{
it
(
'unchecks the radio input'
,
function
()
{
rivets
.
binders
.
unchecked
.
routine
(
falseRadioInput
,
false
);
expect
(
falseRadioInput
.
checked
).
toBe
(
false
);
});
});
});
});
...
...
src/rivets.coffee
View file @
a022aef
# rivets.js
# version : 0.4.
5
# version : 0.4.
8
# author : Michael Richards
# license : MIT
...
...
@@ -256,8 +256,15 @@ unbindEvent = (el, event, fn) ->
event
=
'on'
+
event
el
.
detachEvent
event
,
fn
#
Returns the current input value for the specified element
.
#
Cross-browser input value getter
.
getInputValue
=
(
el
)
->
if
window
.
jQuery
?
el
=
jQuery
el
switch
el
[
0
].
type
when
'checkbox'
then
el
.
is
':checked'
else
el
.
val
()
else
switch
el
.
type
when
'checkbox'
then
el
.
checked
when
'select-multiple'
then
o
.
value
for
o
in
el
when
o
.
selected
...
...
@@ -279,7 +286,7 @@ Rivets.binders =
unbindEvent
el
,
'change'
,
@
currentListener
routine
:
(
el
,
value
)
->
if
el
.
type
is
'radio'
el
.
checked
=
el
.
value
is
value
el
.
checked
=
el
.
value
?
.
toString
()
is
value
?
.
toString
()
else
el
.
checked
=
!!
value
...
...
@@ -291,7 +298,7 @@ Rivets.binders =
unbindEvent
el
,
'change'
,
@
currentListener
routine
:
(
el
,
value
)
->
if
el
.
type
is
'radio'
el
.
checked
=
el
.
value
isnt
value
el
.
checked
=
el
.
value
?
.
toString
()
isnt
value
?
.
toString
()
else
el
.
checked
=
!
value
...
...
@@ -311,9 +318,15 @@ Rivets.binders =
unbind
:
(
el
)
->
unbindEvent
el
,
'change'
,
@
currentListener
routine
:
(
el
,
value
)
->
if
window
.
jQuery
?
el
=
jQuery
el
if
value
?
.
toString
()
isnt
el
.
val
()
?
.
toString
()
el
.
val
if
value
?
then
value
else
''
else
if
el
.
type
is
'select-multiple'
o
.
selected
=
o
.
value
in
value
for
o
in
el
if
value
?
else
else
if
value
?
.
toString
()
isnt
el
.
value
?
.
toString
()
el
.
value
=
if
value
?
then
value
else
''
text
:
(
el
,
value
)
->
...
...
@@ -331,7 +344,7 @@ Rivets.binders =
"each-*"
:
block
:
true
bind
:
(
el
,
collection
)
->
el
.
removeAttribute
[
'data'
,
r
ivets
.
config
.
prefix
,
@
type
].
join
(
'-'
).
replace
'--'
,
'-'
el
.
removeAttribute
[
'data'
,
R
ivets
.
config
.
prefix
,
@
type
].
join
(
'-'
).
replace
'--'
,
'-'
routine
:
(
el
,
collection
)
->
if
@
iterated
?
for
view
in
@
iterated
...
...
@@ -350,12 +363,16 @@ Rivets.binders =
data
[
n
]
=
m
for
n
,
m
of
@
view
.
models
data
[
@
args
[
0
]]
=
item
itemEl
=
el
.
cloneNode
true
if
@
iterated
.
length
>
0
previous
=
@
iterated
[
@
iterated
.
length
-
1
].
els
[
0
]
previous
=
if
@
iterated
.
length
@
iterated
[
@
iterated
.
length
-
1
].
els
[
0
]
else
previous
=
@
marker
@
marker
@
marker
.
parentNode
.
insertBefore
itemEl
,
previous
.
nextSibling
?
null
@
iterated
.
push
rivets
.
bind
itemEl
,
data
view
=
new
Rivets
.
View
(
itemEl
,
data
)
view
.
bind
()
@
iterated
.
push
view
"class-*"
:
(
el
,
value
)
->
elClass
=
"
#{
el
.
className
}
"
...
...
@@ -380,32 +397,36 @@ Rivets.config =
Rivets
.
formatters
=
{}
# The rivets module. This is the public interface that gets exported.
rivets
=
factory
=
(
exports
)
->
# Exposes the core binding routines that can be extended or stripped down.
binders
:
Rivets
.
binders
exports
.
binders
=
Rivets
.
binders
# Exposes the formatters object to be extended.
formatters
:
Rivets
.
formatters
exports
.
formatters
=
Rivets
.
formatters
# Exposes the rivets configuration options. These can be set manually or from
# rivets.configure with an object literal.
config
:
Rivets
.
config
exports
.
config
=
Rivets
.
config
# Sets configuration options by merging an object literal.
configure
:
(
options
=
{})
->
exports
.
configure
=
(
options
=
{})
->
for
property
,
value
of
options
Rivets
.
config
[
property
]
=
value
return
# Binds a set of model objects to a parent DOM element. Returns a Rivets.View
# instance.
bind
:
(
el
,
models
=
{},
options
)
->
exports
.
bind
=
(
el
,
models
=
{},
options
=
{}
)
->
view
=
new
Rivets
.
View
(
el
,
models
,
options
)
view
.
bind
()
view
# Exports rivets for both CommonJS and the browser.
if
module
?
module
.
exports
=
rivets
# Exports rivets for CommonJS, AMD and the browser.
if
typeof
exports
==
'object'
factory
(
exports
)
else
if
typeof
define
==
'function'
&&
define
.
amd
define
[
'exports'
],
(
exports
)
->
factory
(
@
rivets
=
exports
)
return
exports
else
@
rivets
=
rivets
factory
(
@
rivets
=
{})
...
...
Please
register
or
sign in
to post a comment