Skip to content
GitLab
Explore
Projects
Groups
Snippets
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Bootstrap
bootstrap
Commits
7b9c0a38
Commit
7b9c0a38
authored
11 years ago
by
XhmikosR
Browse files
Options
Download
Email Patches
Plain Diff
Downgrade holder.js to v2.2.0.
Fixes
#12440
.
parent
2c6b099f
4 merge requests
!28721
Hot test
,
!22103
test
,
!25326
Adjust examples
,
!12463
Downgrade holder.js to v2.2.0.
Changes
2
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
docs/assets/js/docs.min.js
+3
-3
docs/assets/js/docs.min.js
docs/assets/js/vendor/holder.js
+82
-227
docs/assets/js/vendor/holder.js
with
85 additions
and
230 deletions
+85
-230
docs/assets/js/docs.min.js
+
3
-
3
View file @
7b9c0a38
This diff is collapsed.
Click to expand it.
docs/assets/js/vendor/holder.js
+
82
-
227
View file @
7b9c0a38
/*!
Holder - 2.
3
- client side image placeholders
(c) 2012-201
4
Ivan Malopinsky / http://imsky.co
Holder - 2.
2
- client side image placeholders
(c) 2012-201
3
Ivan Malopinsky / http://imsky.co
Provided under the MIT License.
Commercial use requires attribution.
*/
var
Holder
=
Holder
||
{};
(
function
(
app
,
win
)
{
var
system_config
=
{
use_svg
:
false
,
use_canvas
:
false
,
use_fallback
:
false
};
var
instance_config
=
{};
var
preempted
=
false
;
var
preempted
=
false
,
fallback
=
false
,
canvas
=
document
.
createElement
(
'
canvas
'
);
var
dpr
=
1
,
bsr
=
1
;
var
resizable_images
=
[];
if
(
!
canvas
.
getContext
)
{
system_config
.
use_
fallback
=
true
;
fallback
=
true
;
}
else
{
if
(
canvas
.
toDataURL
(
"
image/png
"
)
.
indexOf
(
"
data:image/png
"
)
<
0
)
{
//Android doesn't support data URI
system_config
.
use_
fallback
=
true
;
fallback
=
true
;
}
else
{
var
ctx
=
canvas
.
getContext
(
"
2d
"
);
}
}
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
){
if
(
!
fallback
){
dpr
=
window
.
devicePixelRatio
||
1
,
bsr
=
ctx
.
webkitBackingStorePixelRatio
||
ctx
.
mozBackingStorePixelRatio
||
ctx
.
msBackingStorePixelRatio
||
ctx
.
oBackingStorePixelRatio
||
ctx
.
backingStorePixelRatio
||
1
;
}
...
...
@@ -138,6 +129,46 @@ 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
);
...
...
@@ -150,64 +181,20 @@ function text_size(width, height, template) {
}
}
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
"
;
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
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
:
"
Arial,Helvetica,
sans-serif
"
;
var
font
=
template
.
font
?
template
.
font
:
"
sans-serif
"
;
canvas
.
width
=
width
;
canvas
.
height
=
height
;
ctx
.
textAlign
=
"
center
"
;
...
...
@@ -235,50 +222,8 @@ function draw_canvas(args) {
return
canvas
.
toDataURL
(
"
image/png
"
);
}
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
;
...
...
@@ -295,11 +240,11 @@ function render(mode, el, holder, src) {
if
(
mode
==
"
image
"
)
{
el
.
setAttribute
(
"
alt
"
,
text
?
text
:
theme
.
text
?
theme
.
text
+
"
[
"
+
dimensions_caption
+
"
]
"
:
dimensions_caption
);
if
(
instance_config
.
use_
fallback
||
!
holder
.
auto
)
{
if
(
fallback
||
!
holder
.
auto
)
{
el
.
style
.
width
=
dimensions
.
width
+
"
px
"
;
el
.
style
.
height
=
dimensions
.
height
+
"
px
"
;
}
if
(
instance_config
.
use_
fallback
)
{
if
(
fallback
)
{
el
.
style
.
backgroundColor
=
theme
.
background
;
}
else
{
el
.
setAttribute
(
"
src
"
,
draw
({
ctx
:
ctx
,
dimensions
:
dimensions
,
template
:
theme
,
ratio
:
ratio
,
holder
:
holder
}));
...
...
@@ -311,7 +256,7 @@ function render(mode, el, holder, src) {
}
}
else
if
(
mode
==
"
background
"
)
{
if
(
!
instance_config
.
use_
fallback
)
{
if
(
!
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
"
;
}
...
...
@@ -319,21 +264,18 @@ 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
if
(
holder
.
auto
==
null
||
!
holder
.
auto
)
{
}
else
{
el
.
style
.
height
=
dimensions
.
height
+
"
px
"
}
if
(
dimensions
.
width
.
slice
(
-
1
)
==
"
%
"
)
{
el
.
style
.
width
=
dimensions
.
width
}
else
if
(
holder
.
auto
==
null
||
!
holder
.
auto
)
{
}
else
{
el
.
style
.
width
=
dimensions
.
width
+
"
px
"
}
if
(
el
.
style
.
display
==
"
inline
"
||
el
.
style
.
display
===
""
||
el
.
style
.
display
==
"
none
"
)
{
el
.
style
.
display
=
"
block
"
;
}
set_initial_dimensions
(
el
)
if
(
instance_config
.
use_fallback
)
{
if
(
fallback
)
{
el
.
style
.
backgroundColor
=
theme
.
background
;
}
else
{
resizable_images
.
push
(
el
);
...
...
@@ -348,36 +290,19 @@ function dimension_check(el, callback) {
width
:
el
.
clientWidth
};
if
(
!
dimensions
.
height
&&
!
dimensions
.
width
)
{
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
}
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
.
removeAttribute
(
"
data-holder-invisible
"
)
}
return
dimensions
;
}
function
resizable_update
(
element
)
{
...
...
@@ -394,19 +319,9 @@ function resizable_update(element) {
var
el
=
images
[
i
]
if
(
el
.
holder_data
)
{
var
holder
=
el
.
holder_data
;
var
dimensions
=
dimension_check
(
el
,
app
.
invisible_error_fn
(
resizable_update
)
)
var
dimensions
=
dimension_check
(
el
,
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
,
...
...
@@ -435,7 +350,7 @@ function parse_flags(flags, options) {
theme
:
extend
(
settings
.
themes
.
gray
,
{})
};
var
render
=
false
;
for
(
var
f
l
=
flags
.
length
,
j
=
0
;
j
<
f
l
;
j
++
)
{
for
(
s
l
=
flags
.
length
,
j
=
0
;
j
<
s
l
;
j
++
)
{
var
flag
=
flags
[
j
];
if
(
app
.
flags
.
dimensions
.
match
(
flag
))
{
render
=
true
;
...
...
@@ -470,20 +385,10 @@ 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
)
{
...
...
@@ -495,31 +400,21 @@ 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
)
{
...
...
@@ -574,7 +469,8 @@ 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
)
...
...
@@ -586,7 +482,6 @@ app.run = function (o) {
}
return
app
;
};
contentLoaded
(
win
,
function
()
{
if
(
window
.
addEventListener
)
{
window
.
addEventListener
(
"
resize
"
,
resizable_update
,
false
);
...
...
@@ -594,7 +489,7 @@ contentLoaded(win, function () {
}
else
{
window
.
attachEvent
(
"
onresize
"
,
resizable_update
)
}
preempted
||
app
.
run
(
{}
);
preempted
||
app
.
run
();
});
if
(
typeof
define
===
"
function
"
&&
define
.
amd
)
{
define
([],
function
()
{
...
...
@@ -602,44 +497,4 @@ 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
);
This diff is collapsed.
Click to expand it.
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new 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
Menu
Explore
Projects
Groups
Snippets