Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
B
bootstrap
Project overview
Project overview
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
bootstrap
Commits
77ff3871
Commit
77ff3871
authored
Jan 12, 2014
by
XhmikosR
Committed by
Chris Rebert
Jan 12, 2014
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update holder.js to v2.3; refs #12196
parent
80c9c14a
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
227 additions
and
82 deletions
+227
-82
docs/assets/js/holder.js
docs/assets/js/holder.js
+227
-82
No files found.
docs/assets/js/holder.js
View file @
77ff3871
/*
Holder - 2.
2
- client side image placeholders
(c) 2012-201
3
Ivan Malopinsky / http://imsky.co
Holder - 2.
3
- client side image placeholders
(c) 2012-201
4
Ivan Malopinsky / http://imsky.co
Provided under the MIT License.
Commercial use requires attribution.
*/
var
Holder
=
Holder
||
{};
(
function
(
app
,
win
)
{
var
preempted
=
false
,
fallback
=
false
,
var
system_config
=
{
use_svg
:
false
,
use_canvas
:
false
,
use_fallback
:
false
};
var
instance_config
=
{};
var
preempted
=
false
;
canvas
=
document
.
createElement
(
'
canvas
'
);
var
dpr
=
1
,
bsr
=
1
;
var
resizable_images
=
[];
if
(
!
canvas
.
getContext
)
{
fallback
=
true
;
system_config
.
use_
fallback
=
true
;
}
else
{
if
(
canvas
.
toDataURL
(
"
image/png
"
)
.
indexOf
(
"
data:image/png
"
)
<
0
)
{
//Android doesn't support data URI
fallback
=
true
;
system_config
.
use_
fallback
=
true
;
}
else
{
var
ctx
=
canvas
.
getContext
(
"
2d
"
);
}
}
if
(
!
fallback
){
if
(
!!
document
.
createElementNS
&&
!!
document
.
createElementNS
(
'
http://www.w3.org/2000/svg
'
,
'
svg
'
).
createSVGRect
){
system_config
.
use_svg
=
true
;
system_config
.
use_canvas
=
false
;
}
if
(
!
system_config
.
use_fallback
){
dpr
=
window
.
devicePixelRatio
||
1
,
bsr
=
ctx
.
webkitBackingStorePixelRatio
||
ctx
.
mozBackingStorePixelRatio
||
ctx
.
msBackingStorePixelRatio
||
ctx
.
oBackingStorePixelRatio
||
ctx
.
backingStorePixelRatio
||
1
;
}
...
...
@@ -129,46 +138,6 @@ app.flags = {
}
}
//getElementsByClassName polyfill
document
.
getElementsByClassName
||
(
document
.
getElementsByClassName
=
function
(
e
){
var
t
=
document
,
n
,
r
,
i
,
s
=
[];
if
(
t
.
querySelectorAll
)
return
t
.
querySelectorAll
(
"
.
"
+
e
);
if
(
t
.
evaluate
){
r
=
"
.//*[contains(concat(' ', @class, ' '), '
"
+
e
+
"
')]
"
,
n
=
t
.
evaluate
(
r
,
t
,
null
,
0
,
null
);
while
(
i
=
n
.
iterateNext
())
s
.
push
(
i
)}
else
{
n
=
t
.
getElementsByTagName
(
"
*
"
),
r
=
new
RegExp
(
"
(^|
\\
s)
"
+
e
+
"
(
\\
s|$)
"
);
for
(
i
=
0
;
i
<
n
.
length
;
i
++
)
r
.
test
(
n
[
i
].
className
)
&&
s
.
push
(
n
[
i
])}
return
s
})
//getComputedStyle polyfill
window
.
getComputedStyle
||
(
window
.
getComputedStyle
=
function
(
e
){
return
this
.
el
=
e
,
this
.
getPropertyValue
=
function
(
t
){
var
n
=
/
(\-([
a-z
]){1})
/g
;
return
t
==
"
float
"
&&
(
t
=
"
styleFloat
"
),
n
.
test
(
t
)
&&
(
t
=
t
.
replace
(
n
,
function
(){
return
arguments
[
2
].
toUpperCase
()})),
e
.
currentStyle
[
t
]?
e
.
currentStyle
[
t
]:
null
},
this
})
//http://javascript.nwbox.com/ContentLoaded by Diego Perini with modifications
function
contentLoaded
(
n
,
t
){
var
l
=
"
complete
"
,
s
=
"
readystatechange
"
,
u
=!
1
,
h
=
u
,
c
=!
0
,
i
=
n
.
document
,
a
=
i
.
documentElement
,
e
=
i
.
addEventListener
?
"
addEventListener
"
:
"
attachEvent
"
,
v
=
i
.
addEventListener
?
"
removeEventListener
"
:
"
detachEvent
"
,
f
=
i
.
addEventListener
?
""
:
"
on
"
,
r
=
function
(
e
){(
e
.
type
!=
s
||
i
.
readyState
==
l
)
&&
((
e
.
type
==
"
load
"
?
n
:
i
)[
v
](
f
+
e
.
type
,
r
,
u
),
!
h
&&
(
h
=!
0
)
&&
t
.
call
(
n
,
null
))},
o
=
function
(){
try
{
a
.
doScroll
(
"
left
"
)}
catch
(
n
){
setTimeout
(
o
,
50
);
return
}
r
(
"
poll
"
)};
if
(
i
.
readyState
==
l
)
t
.
call
(
n
,
"
lazy
"
);
else
{
if
(
i
.
createEventObject
&&
a
.
doScroll
){
try
{
c
=!
n
.
frameElement
}
catch
(
y
){}
c
&&
o
()}
i
[
e
](
f
+
"
DOMContentLoaded
"
,
r
,
u
),
i
[
e
](
f
+
s
,
r
,
u
),
n
[
e
](
f
+
"
load
"
,
r
,
u
)}}
//https://gist.github.com/991057 by Jed Schmidt with modifications
function
selector
(
a
){
a
=
a
.
match
(
/^
(\W)?(
.*
)
/
);
var
b
=
document
[
"
getElement
"
+
(
a
[
1
]?
a
[
1
]
==
"
#
"
?
"
ById
"
:
"
sByClassName
"
:
"
sByTagName
"
)](
a
[
2
]);
var
ret
=
[];
b
!==
null
&&
(
b
.
length
?
ret
=
b
:
b
.
length
===
0
?
ret
=
b
:
ret
=
[
b
]);
return
ret
;
}
//shallow object property extend
function
extend
(
a
,
b
){
var
c
=
{};
for
(
var
i
in
a
){
if
(
a
.
hasOwnProperty
(
i
)){
c
[
i
]
=
a
[
i
];
}
}
for
(
var
i
in
b
){
if
(
b
.
hasOwnProperty
(
i
)){
c
[
i
]
=
b
[
i
];
}
}
return
c
}
//hasOwnProperty polyfill
if
(
!
Object
.
prototype
.
hasOwnProperty
)
/*jshint -W001, -W103 */
Object
.
prototype
.
hasOwnProperty
=
function
(
prop
)
{
var
proto
=
this
.
__proto__
||
this
.
constructor
.
prototype
;
return
(
prop
in
this
)
&&
(
!
(
prop
in
proto
)
||
proto
[
prop
]
!==
this
[
prop
]);
}
/*jshint +W001, +W103 */
function
text_size
(
width
,
height
,
template
)
{
height
=
parseInt
(
height
,
10
);
width
=
parseInt
(
width
,
10
);
...
...
@@ -181,20 +150,64 @@ function text_size(width, height, template) {
}
}
function
draw
(
args
)
{
var
ctx
=
args
.
ctx
;
var
dimensions
=
args
.
dimensions
;
var
template
=
args
.
template
;
var
ratio
=
args
.
ratio
;
var
holder
=
args
.
holder
;
var
literal
=
holder
.
textmode
==
"
literal
"
;
var
exact
=
holder
.
textmode
==
"
exact
"
;
var
svg_el
=
(
function
(){
var
serializer
=
new
XMLSerializer
();
var
svg_ns
=
"
http://www.w3.org/2000/svg
"
var
svg
=
document
.
createElementNS
(
svg_ns
,
"
svg
"
);
svg
.
setAttribute
(
"
xmlns
"
,
"
http://www.w3.org/2000/svg
"
)
svg
.
setAttribute
(
"
xmlns:xlink
"
,
"
http://www.w3.org/1999/xlink
"
);
var
bg_el
=
document
.
createElementNS
(
svg_ns
,
"
rect
"
)
var
text_el
=
document
.
createElementNS
(
svg_ns
,
"
text
"
)
var
textnode_el
=
document
.
createTextNode
(
null
)
text_el
.
setAttribute
(
"
text-anchor
"
,
"
middle
"
)
text_el
.
appendChild
(
textnode_el
)
svg
.
appendChild
(
bg_el
)
svg
.
appendChild
(
text_el
)
return
function
(
props
){
svg
.
setAttribute
(
"
width
"
,
props
.
width
);
svg
.
setAttribute
(
"
height
"
,
props
.
height
);
bg_el
.
setAttribute
(
"
width
"
,
props
.
width
);
bg_el
.
setAttribute
(
"
height
"
,
props
.
height
);
bg_el
.
setAttribute
(
"
fill
"
,
props
.
template
.
background
);
text_el
.
setAttribute
(
"
x
"
,
props
.
width
/
2
)
text_el
.
setAttribute
(
"
y
"
,
props
.
height
/
2
)
textnode_el
.
nodeValue
=
props
.
text
text_el
.
setAttribute
(
"
style
"
,
css_properties
({
"
fill
"
:
props
.
template
.
foreground
,
"
font-weight
"
:
"
bold
"
,
"
font-size
"
:
props
.
text_height
+
"
px
"
,
"
font-family
"
:
props
.
font
,
"
dominant-baseline
"
:
"
central
"
}))
return
serializer
.
serializeToString
(
svg
)
}
})()
function
css_properties
(
props
){
var
ret
=
[];
for
(
p
in
props
){
if
(
props
.
hasOwnProperty
(
p
)){
ret
.
push
(
p
+
"
:
"
+
props
[
p
])
}
}
return
ret
.
join
(
"
;
"
)
}
function
draw_canvas
(
args
)
{
var
ctx
=
args
.
ctx
,
dimensions
=
args
.
dimensions
,
template
=
args
.
template
,
ratio
=
args
.
ratio
,
holder
=
args
.
holder
,
literal
=
holder
.
textmode
==
"
literal
"
,
exact
=
holder
.
textmode
==
"
exact
"
;
var
ts
=
text_size
(
dimensions
.
width
,
dimensions
.
height
,
template
);
var
text_height
=
ts
.
height
;
var
width
=
dimensions
.
width
*
ratio
,
height
=
dimensions
.
height
*
ratio
;
var
font
=
template
.
font
?
template
.
font
:
"
sans-serif
"
;
var
font
=
template
.
font
?
template
.
font
:
"
Arial,Helvetica,
sans-serif
"
;
canvas
.
width
=
width
;
canvas
.
height
=
height
;
ctx
.
textAlign
=
"
center
"
;
...
...
@@ -222,8 +235,50 @@ function draw(args) {
return
canvas
.
toDataURL
(
"
image/png
"
);
}
function
render
(
mode
,
el
,
holder
,
src
)
{
function
draw_svg
(
args
){
var
dimensions
=
args
.
dimensions
,
template
=
args
.
template
,
holder
=
args
.
holder
,
literal
=
holder
.
textmode
==
"
literal
"
,
exact
=
holder
.
textmode
==
"
exact
"
;
var
ts
=
text_size
(
dimensions
.
width
,
dimensions
.
height
,
template
);
var
text_height
=
ts
.
height
;
var
width
=
dimensions
.
width
,
height
=
dimensions
.
height
;
var
font
=
template
.
font
?
template
.
font
:
"
Arial,Helvetica,sans-serif
"
;
var
text
=
template
.
text
?
template
.
text
:
(
Math
.
floor
(
dimensions
.
width
)
+
"
x
"
+
Math
.
floor
(
dimensions
.
height
));
if
(
literal
)
{
var
dimensions
=
holder
.
dimensions
;
text
=
dimensions
.
width
+
"
x
"
+
dimensions
.
height
;
}
else
if
(
exact
&&
holder
.
exact_dimensions
){
var
dimensions
=
holder
.
exact_dimensions
;
text
=
(
Math
.
floor
(
dimensions
.
width
)
+
"
x
"
+
Math
.
floor
(
dimensions
.
height
));
}
var
string
=
svg_el
({
text
:
text
,
width
:
width
,
height
:
height
,
text_height
:
text_height
,
font
:
font
,
template
:
template
})
return
"
data:image/svg+xml;base64,
"
+
btoa
(
string
);
}
function
draw
(
args
)
{
if
(
instance_config
.
use_canvas
&&
!
instance_config
.
use_svg
){
return
draw_canvas
(
args
);
}
else
{
return
draw_svg
(
args
);
}
}
function
render
(
mode
,
el
,
holder
,
src
)
{
var
dimensions
=
holder
.
dimensions
,
theme
=
holder
.
theme
,
text
=
holder
.
text
?
decodeURIComponent
(
holder
.
text
)
:
holder
.
text
;
...
...
@@ -240,11 +295,11 @@ function render(mode, el, holder, src) {
if
(
mode
==
"
image
"
)
{
el
.
setAttribute
(
"
alt
"
,
text
?
text
:
theme
.
text
?
theme
.
text
+
"
[
"
+
dimensions_caption
+
"
]
"
:
dimensions_caption
);
if
(
fallback
||
!
holder
.
auto
)
{
if
(
instance_config
.
use_
fallback
||
!
holder
.
auto
)
{
el
.
style
.
width
=
dimensions
.
width
+
"
px
"
;
el
.
style
.
height
=
dimensions
.
height
+
"
px
"
;
}
if
(
fallback
)
{
if
(
instance_config
.
use_
fallback
)
{
el
.
style
.
backgroundColor
=
theme
.
background
;
}
else
{
el
.
setAttribute
(
"
src
"
,
draw
({
ctx
:
ctx
,
dimensions
:
dimensions
,
template
:
theme
,
ratio
:
ratio
,
holder
:
holder
}));
...
...
@@ -256,7 +311,7 @@ function render(mode, el, holder, src) {
}
}
else
if
(
mode
==
"
background
"
)
{
if
(
!
fallback
)
{
if
(
!
instance_config
.
use_
fallback
)
{
el
.
style
.
backgroundImage
=
"
url(
"
+
draw
({
ctx
:
ctx
,
dimensions
:
dimensions
,
template
:
theme
,
ratio
:
ratio
,
holder
:
holder
})
+
"
)
"
;
el
.
style
.
backgroundSize
=
dimensions
.
width
+
"
px
"
+
dimensions
.
height
+
"
px
"
;
}
...
...
@@ -264,18 +319,21 @@ function render(mode, el, holder, src) {
el
.
setAttribute
(
"
alt
"
,
text
?
text
:
theme
.
text
?
theme
.
text
+
"
[
"
+
dimensions_caption
+
"
]
"
:
dimensions_caption
);
if
(
dimensions
.
height
.
slice
(
-
1
)
==
"
%
"
)
{
el
.
style
.
height
=
dimensions
.
height
}
else
{
}
else
if
(
holder
.
auto
==
null
||
!
holder
.
auto
)
{
el
.
style
.
height
=
dimensions
.
height
+
"
px
"
}
if
(
dimensions
.
width
.
slice
(
-
1
)
==
"
%
"
)
{
el
.
style
.
width
=
dimensions
.
width
}
else
{
}
else
if
(
holder
.
auto
==
null
||
!
holder
.
auto
)
{
el
.
style
.
width
=
dimensions
.
width
+
"
px
"
}
if
(
el
.
style
.
display
==
"
inline
"
||
el
.
style
.
display
===
""
||
el
.
style
.
display
==
"
none
"
)
{
el
.
style
.
display
=
"
block
"
;
}
if
(
fallback
)
{
set_initial_dimensions
(
el
)
if
(
instance_config
.
use_fallback
)
{
el
.
style
.
backgroundColor
=
theme
.
background
;
}
else
{
resizable_images
.
push
(
el
);
...
...
@@ -290,19 +348,36 @@ function dimension_check(el, callback) {
width
:
el
.
clientWidth
};
if
(
!
dimensions
.
height
&&
!
dimensions
.
width
)
{
if
(
el
.
hasAttribute
(
"
data-holder-invisible
"
))
{
throw
new
Error
(
"
Holder: placeholder is not visible
"
);
}
else
{
el
.
setAttribute
(
"
data-holder-invisible
"
,
true
)
setTimeout
(
function
()
{
callback
.
call
(
this
,
el
)
},
1
)
return
null
;
}
}
else
{
el
.
setAttribute
(
"
data-holder-invisible
"
,
true
)
callback
.
call
(
this
,
el
)
}
else
{
el
.
removeAttribute
(
"
data-holder-invisible
"
)
return
dimensions
;
}
}
function
set_initial_dimensions
(
el
){
if
(
el
.
holder_data
){
var
dimensions
=
dimension_check
(
el
,
app
.
invisible_error_fn
(
set_initial_dimensions
))
if
(
dimensions
){
var
holder
=
el
.
holder_data
;
holder
.
initial_dimensions
=
dimensions
;
holder
.
fluid_data
=
{
fluid_height
:
holder
.
dimensions
.
height
.
slice
(
-
1
)
==
"
%
"
,
fluid_width
:
holder
.
dimensions
.
width
.
slice
(
-
1
)
==
"
%
"
,
mode
:
null
}
if
(
holder
.
fluid_data
.
fluid_width
&&
!
holder
.
fluid_data
.
fluid_height
){
holder
.
fluid_data
.
mode
=
"
width
"
holder
.
fluid_data
.
ratio
=
holder
.
initial_dimensions
.
width
/
parseFloat
(
holder
.
dimensions
.
height
)
}
else
if
(
!
holder
.
fluid_data
.
fluid_width
&&
holder
.
fluid_data
.
fluid_height
){
holder
.
fluid_data
.
mode
=
"
height
"
;
holder
.
fluid_data
.
ratio
=
parseFloat
(
holder
.
dimensions
.
width
)
/
holder
.
initial_dimensions
.
height
}
}
}
return
dimensions
;
}
function
resizable_update
(
element
)
{
...
...
@@ -319,9 +394,19 @@ function resizable_update(element) {
var
el
=
images
[
i
]
if
(
el
.
holder_data
)
{
var
holder
=
el
.
holder_data
;
var
dimensions
=
dimension_check
(
el
,
resizable_update
)
var
dimensions
=
dimension_check
(
el
,
app
.
invisible_error_fn
(
resizable_update
)
)
if
(
dimensions
){
if
(
holder
.
fluid
){
if
(
holder
.
auto
){
switch
(
holder
.
fluid_data
.
mode
){
case
"
width
"
:
dimensions
.
height
=
dimensions
.
width
/
holder
.
fluid_data
.
ratio
;
break
;
case
"
height
"
:
dimensions
.
width
=
dimensions
.
height
*
holder
.
fluid_data
.
ratio
;
break
;
}
}
el
.
setAttribute
(
"
src
"
,
draw
({
ctx
:
ctx
,
dimensions
:
dimensions
,
...
...
@@ -350,7 +435,7 @@ function parse_flags(flags, options) {
theme
:
extend
(
settings
.
themes
.
gray
,
{})
};
var
render
=
false
;
for
(
sl
=
flags
.
length
,
j
=
0
;
j
<
s
l
;
j
++
)
{
for
(
var
fl
=
flags
.
length
,
j
=
0
;
j
<
f
l
;
j
++
)
{
var
flag
=
flags
[
j
];
if
(
app
.
flags
.
dimensions
.
match
(
flag
))
{
render
=
true
;
...
...
@@ -385,10 +470,20 @@ for (var flag in app.flags) {
return
val
.
match
(
this
.
regex
)
}
}
app
.
invisible_error_fn
=
function
(
fn
){
return
function
(
el
){
if
(
el
.
hasAttribute
(
"
data-holder-invisible
"
)){
throw
new
Error
(
"
Holder: invisible placeholder
"
)
}
}
}
app
.
add_theme
=
function
(
name
,
theme
)
{
name
!=
null
&&
theme
!=
null
&&
(
settings
.
themes
[
name
]
=
theme
);
return
app
;
};
app
.
add_image
=
function
(
src
,
el
)
{
var
node
=
selector
(
el
);
if
(
node
.
length
)
{
...
...
@@ -400,21 +495,31 @@ app.add_image = function (src, el) {
}
return
app
;
};
app
.
run
=
function
(
o
)
{
instance_config
=
extend
({},
system_config
)
preempted
=
true
;
var
options
=
extend
(
settings
,
o
),
images
=
[],
imageNodes
=
[],
bgnodes
=
[];
if
(
options
.
use_canvas
!=
null
&&
options
.
use_canvas
){
instance_config
.
use_canvas
=
true
;
instance_config
.
use_svg
=
false
;
}
if
(
typeof
(
options
.
images
)
==
"
string
"
)
{
imageNodes
=
selector
(
options
.
images
);
}
else
if
(
window
.
NodeList
&&
options
.
images
instanceof
window
.
NodeList
)
{
imageNodes
=
options
.
images
;
}
else
if
(
window
.
Node
&&
options
.
images
instanceof
window
.
Node
)
{
imageNodes
=
[
options
.
images
];
}
else
if
(
window
.
HTMLCollection
&&
options
.
images
instanceof
window
.
HTMLCollection
){
imageNodes
=
options
.
images
}
if
(
typeof
(
options
.
bgnodes
)
==
"
string
"
)
{
bgnodes
=
selector
(
options
.
bgnodes
);
}
else
if
(
window
.
NodeList
&&
options
.
elements
instanceof
window
.
NodeList
)
{
...
...
@@ -469,8 +574,7 @@ app.run = function (o) {
src
=
attr_datasrc
;
}
if
(
src
)
{
var
holder
=
parse_flags
(
src
.
substr
(
src
.
lastIndexOf
(
options
.
domain
)
+
options
.
domain
.
length
+
1
)
.
split
(
"
/
"
),
options
);
var
holder
=
parse_flags
(
src
.
substr
(
src
.
lastIndexOf
(
options
.
domain
)
+
options
.
domain
.
length
+
1
).
split
(
"
/
"
),
options
);
if
(
holder
)
{
if
(
holder
.
fluid
)
{
render
(
"
fluid
"
,
images
[
i
],
holder
,
src
)
...
...
@@ -482,6 +586,7 @@ app.run = function (o) {
}
return
app
;
};
contentLoaded
(
win
,
function
()
{
if
(
window
.
addEventListener
)
{
window
.
addEventListener
(
"
resize
"
,
resizable_update
,
false
);
...
...
@@ -489,7 +594,7 @@ contentLoaded(win, function () {
}
else
{
window
.
attachEvent
(
"
onresize
"
,
resizable_update
)
}
preempted
||
app
.
run
();
preempted
||
app
.
run
(
{}
);
});
if
(
typeof
define
===
"
function
"
&&
define
.
amd
)
{
define
([],
function
()
{
...
...
@@ -497,4 +602,44 @@ if (typeof define === "function" && define.amd) {
});
}
//github.com/davidchambers/Base64.js
(
function
(){
function
t
(
t
){
this
.
message
=
t
}
var
e
=
"
undefined
"
!=
typeof
exports
?
exports
:
this
,
r
=
"
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
"
;
t
.
prototype
=
Error
(),
t
.
prototype
.
name
=
"
InvalidCharacterError
"
,
e
.
btoa
||
(
e
.
btoa
=
function
(
e
){
for
(
var
o
,
n
,
a
=
0
,
i
=
r
,
c
=
""
;
e
.
charAt
(
0
|
a
)
||
(
i
=
"
=
"
,
a
%
1
);
c
+=
i
.
charAt
(
63
&
o
>>
8
-
8
*
(
a
%
1
))){
if
(
n
=
e
.
charCodeAt
(
a
+=
.
75
),
n
>
255
)
throw
new
t
(
"
'btoa' failed
"
);
o
=
o
<<
8
|
n
}
return
c
}),
e
.
atob
||
(
e
.
atob
=
function
(
e
){
if
(
e
=
e
.
replace
(
/=+$/
,
""
),
1
==
e
.
length
%
4
)
throw
new
t
(
"
'atob' failed
"
);
for
(
var
o
,
n
,
a
=
0
,
i
=
0
,
c
=
""
;
n
=
e
.
charAt
(
i
++
);
~
n
&&
(
o
=
a
%
4
?
64
*
o
+
n
:
n
,
a
++%
4
)?
c
+=
String
.
fromCharCode
(
255
&
o
>>
(
6
&-
2
*
a
)):
0
)
n
=
r
.
indexOf
(
n
);
return
c
})})();
//getElementsByClassName polyfill
document
.
getElementsByClassName
||
(
document
.
getElementsByClassName
=
function
(
e
){
var
t
=
document
,
n
,
r
,
i
,
s
=
[];
if
(
t
.
querySelectorAll
)
return
t
.
querySelectorAll
(
"
.
"
+
e
);
if
(
t
.
evaluate
){
r
=
"
.//*[contains(concat(' ', @class, ' '), '
"
+
e
+
"
')]
"
,
n
=
t
.
evaluate
(
r
,
t
,
null
,
0
,
null
);
while
(
i
=
n
.
iterateNext
())
s
.
push
(
i
)}
else
{
n
=
t
.
getElementsByTagName
(
"
*
"
),
r
=
new
RegExp
(
"
(^|
\\
s)
"
+
e
+
"
(
\\
s|$)
"
);
for
(
i
=
0
;
i
<
n
.
length
;
i
++
)
r
.
test
(
n
[
i
].
className
)
&&
s
.
push
(
n
[
i
])}
return
s
})
//getComputedStyle polyfill
window
.
getComputedStyle
||
(
window
.
getComputedStyle
=
function
(
e
){
return
this
.
el
=
e
,
this
.
getPropertyValue
=
function
(
t
){
var
n
=
/
(\-([
a-z
]){1})
/g
;
return
t
==
"
float
"
&&
(
t
=
"
styleFloat
"
),
n
.
test
(
t
)
&&
(
t
=
t
.
replace
(
n
,
function
(){
return
arguments
[
2
].
toUpperCase
()})),
e
.
currentStyle
[
t
]?
e
.
currentStyle
[
t
]:
null
},
this
})
//http://javascript.nwbox.com/ContentLoaded by Diego Perini with modifications
function
contentLoaded
(
n
,
t
){
var
l
=
"
complete
"
,
s
=
"
readystatechange
"
,
u
=!
1
,
h
=
u
,
c
=!
0
,
i
=
n
.
document
,
a
=
i
.
documentElement
,
e
=
i
.
addEventListener
?
"
addEventListener
"
:
"
attachEvent
"
,
v
=
i
.
addEventListener
?
"
removeEventListener
"
:
"
detachEvent
"
,
f
=
i
.
addEventListener
?
""
:
"
on
"
,
r
=
function
(
e
){(
e
.
type
!=
s
||
i
.
readyState
==
l
)
&&
((
e
.
type
==
"
load
"
?
n
:
i
)[
v
](
f
+
e
.
type
,
r
,
u
),
!
h
&&
(
h
=!
0
)
&&
t
.
call
(
n
,
null
))},
o
=
function
(){
try
{
a
.
doScroll
(
"
left
"
)}
catch
(
n
){
setTimeout
(
o
,
50
);
return
}
r
(
"
poll
"
)};
if
(
i
.
readyState
==
l
)
t
.
call
(
n
,
"
lazy
"
);
else
{
if
(
i
.
createEventObject
&&
a
.
doScroll
){
try
{
c
=!
n
.
frameElement
}
catch
(
y
){}
c
&&
o
()}
i
[
e
](
f
+
"
DOMContentLoaded
"
,
r
,
u
),
i
[
e
](
f
+
s
,
r
,
u
),
n
[
e
](
f
+
"
load
"
,
r
,
u
)}}
//https://gist.github.com/991057 by Jed Schmidt with modifications
function
selector
(
a
,
b
){
var
a
=
a
.
match
(
/^
(\W)?(
.*
)
/
),
b
=
b
||
document
,
c
=
b
[
"
getElement
"
+
(
a
[
1
]?
"
#
"
==
a
[
1
]?
"
ById
"
:
"
sByClassName
"
:
"
sByTagName
"
)],
d
=
c
.
call
(
b
,
a
[
2
]),
e
=
[];
return
null
!==
d
&&
(
e
=
d
.
length
||
0
===
d
.
length
?
d
:[
d
]),
e
}
//shallow object property extend
function
extend
(
a
,
b
){
var
c
=
{};
for
(
var
i
in
a
){
if
(
a
.
hasOwnProperty
(
i
)){
c
[
i
]
=
a
[
i
];
}
}
for
(
var
i
in
b
){
if
(
b
.
hasOwnProperty
(
i
)){
c
[
i
]
=
b
[
i
];
}
}
return
c
}
//hasOwnProperty polyfill
if
(
!
Object
.
prototype
.
hasOwnProperty
)
/*jshint -W001, -W103 */
Object
.
prototype
.
hasOwnProperty
=
function
(
prop
)
{
var
proto
=
this
.
__proto__
||
this
.
constructor
.
prototype
;
return
(
prop
in
this
)
&&
(
!
(
prop
in
proto
)
||
proto
[
prop
]
!==
this
[
prop
]);
}
/*jshint +W001, +W103 */
})(
Holder
,
window
);
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