Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cloud-quote
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
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
cloud-quote
Commits
4f62489e
Commit
4f62489e
authored
Apr 18, 2013
by
Sven Franck
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
refactor - autonomize
parent
c9aeaf90
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
12565 additions
and
181 deletions
+12565
-181
gadgets/about.html
gadgets/about.html
+0
-1
gadgets/header.html
gadgets/header.html
+7
-33
gadgets/index_wrapper.html
gadgets/index_wrapper.html
+3
-7
gadgets/legal_wrapper.html
gadgets/legal_wrapper.html
+0
-3
gadgets/translate.html
gadgets/translate.html
+110
-115
js/controller.js
js/controller.js
+16
-16
js/libs/jqm/jqm.js
js/libs/jqm/jqm.js
+11486
-4
js/plugins/renderjs/_renderjs.js
js/plugins/renderjs/_renderjs.js
+4
-0
js/plugins/renderjs/renderjs.js
js/plugins/renderjs/renderjs.js
+939
-1
p/index.html
p/index.html
+0
-1
No files found.
gadgets/about.html
View file @
4f62489e
...
...
@@ -14,7 +14,6 @@
@media
all
and
(
min-width
:
60em
)
{
#about_info
.about_element_wrapper
{
max-width
:
70%
;}
}
</style>
</head>
<body>
...
...
gadgets/header.html
View file @
4f62489e
...
...
@@ -24,43 +24,17 @@
<script
type=
"text/javascript"
>
//
<!
[
CDATA
[
(
function
()
{
var
gadget
=
RenderJs
.
getSelfGadget
(),
recursive_gadgets
=
gadget
.
dom
.
find
(
"
[data-gadget]
"
).
not
(
"
.main-interactor
"
),
len
=
recursive_gadgets
.
length
;
/* initialize translation */
var
gadget
=
RenderJs
.
getSelfGadget
();
recursive_gadgets
.
each
(
function
(
i
)
{
var
passJSON
=
gadget
[
$
(
this
).
attr
(
'
id
'
)],
string
,
new_string
,
current_id
=
$
(
this
).
attr
(
'
id
'
),
new_id
=
current_id
+
"
__
"
+
gadget
.
dom
.
attr
(
'
id
'
);
// pass on JSON if present BEFORE modifying gadget-id
if
(
passJSON
!==
undefined
)
{
$
(
this
).
attr
(
'
data-gadget-property
'
,
'
{"self":
'
+
JSON
.
stringify
(
passJSON
)
+
'
}
'
);
RenderJs
.
bindReady
(
function
()
{
// trigger create
if
(
gadget
.
isEnhanced
()
===
undefined
||
gadget
.
isEnhanced
()
===
false
)
{
gadget
.
dom
.
trigger
(
"
create
"
);
}
// dynamic gadget-id
$
(
this
).
attr
(
'
id
'
,
new_id
);
// update interactions
string
=
gadget
.
dom
.
find
(
"
.main-interactor
"
).
attr
(
"
data-gadget-connection
"
);
new_string
=
string
.
replace
(
current_id
,
new_id
);
gadget
.
dom
.
find
(
"
.main-interactor
"
).
attr
(
"
data-gadget-connection
"
,
new_string
);
});
// modify gadget
if
(
gadget
.
self
!==
undefined
)
{
for
(
key
in
gadget
.
self
)
{
if
(
gadget
.
self
.
hasOwnProperty
(
key
))
{
gadget
.
dom
.
find
(
key
).
attr
(
gadget
.
self
[
key
][
0
],
gadget
.
self
[
key
][
1
]);
}
}
}
$
(
document
).
ready
(
function
()
{
// trigger enhancement
$
(
this
).
trigger
(
"
render_enhance
"
,
{
gadget
:
gadget
.
dom
});
});
$
(
document
).
ready
(
function
()
{
});
})();
//]]>
</script>
...
...
gadgets/index_wrapper.html
View file @
4f62489e
...
...
@@ -4,13 +4,9 @@
<head>
</head>
<body>
<div
id=
"
index_
configure"
data-gadget=
"../gadgets/configure.html"
></div>
<div
id=
"
index_
social"
data-gadget=
"../gadgets/social.html"
></div>
<div
id=
"
index_
nav"
data-gadget=
"../gadgets/navigation.html"
></div>
<div
id=
"configure"
data-gadget=
"../gadgets/configure.html"
></div>
<div
id=
"social"
data-gadget=
"../gadgets/social.html"
></div>
<div
id=
"nav"
data-gadget=
"../gadgets/navigation.html"
></div>
<p
class=
"mini t"
data-i18n=
"gen.disclaimer"
></p>
<!-- interactions -->
<div
data-gadget=
""
class=
"main-interactor"
data-gadget-connection=
"[]"
>
</body>
</html>
\ No newline at end of file
gadgets/legal_wrapper.html
View file @
4f62489e
...
...
@@ -13,8 +13,5 @@
<div
id=
"legal_info"
data-gadget=
"../gadgets/legal.html"
></div>
<div
id=
"legal_social"
data-gadget=
"../gadgets/social.html"
></div>
<div
id=
"legal_nav"
data-gadget=
"../gadgets/navigation.html"
></div>
<!-- interactions -->
<div
data-gadget=
""
class=
"main-interactor"
data-gadget-connection=
"[]"
>
</body>
</html>
\ No newline at end of file
gadgets/translate.html
View file @
4f62489e
<!DOCTYPE html>
<head>
<meta
charset=
"utf-8"
>
<title></title>
<title>
Translation Gadget
</title>
<style
type=
"text/css"
scoped
>
/*
saftey
,
as
older
devices
ignore
both
inline
and
linked
stylesheets
/*
*
older
devices
ignore
both
inline
and
linked
stylesheets
*
this
CSS
is
also
available
as
separate
style
sheet
"translate.css"
*
for
old
browsers
how
can
'
t
handle
inline
<
style
>,
fails
on
*
Android
2
.3.6
,
iOS
4
.1
*
for
old
browsers
that
can
'
t
handle
inline
<
style
>
*
failed
on
Android
2
.3.6
,
iOS
4
.1
*/
.el
{
width
:
1px
;}
.setIcon
{
top
:
-7px
!important
;}
.ui-icon-lang
{
background-image
:
url(../img/custom-lang-18.png)
;
}
#translator
.el
{
width
:
1px
!important
;}
#translator
.setIcon
{
top
:
-7px
!important
;}
/* EU flag icons normal/retina resolution */
#translator
.ui-icon-lang
{
background-image
:
url(../img/custom-lang-18.png)
;
}
@media
only
screen
and
(
-webkit-min-device-pixel-ratio
:
1.5
),
only
screen
and
(
min--moz-device-pixel-ratio
:
1.5
),
only
screen
and
(
min-resolution
:
240dpi
)
{
.ui-icon-lang
{
#translator
.ui-icon-lang
{
-moz-background-size
:
1200px
18px
;
-o-background-size
:
1200px
18px
;
-webkit-background-size
:
1200px
18px
;
background-size
:
1200px
18px
;
}
.ui-icon-lang
{
#translator
.ui-icon-lang
{
background-image
:
url(../img/custom-lang-36.png)
;
}
}
.ui-fake-icon.AT
,
.AT
{
background-position
:
0px
-50%
;}
.ui-fake-icon.BE
,
.BE
{
background-position
:
-36px
-50%
;}
.ui-fake-icon.BG
,
.BG
{
background-position
:
-72px
-50%
;}
.ui-fake-icon.CH
,
.CH
{
background-position
:
-108px
-50%
;}
.ui-fake-icon.CZ
,
.CZ
{
background-position
:
-144px
-50%
;}
.ui-fake-icon.DE
,
.DE
{
background-position
:
-180px
-50%
;}
.ui-fake-icon.DK
,
.DK
{
background-position
:
-216px
-50%
;}
.ui-fake-icon.EE
,
.EE
{
background-position
:
-252px
-50%
;}
.ui-fake-icon.ES
,
.ES
{
background-position
:
-288px
-50%
;}
.ui-fake-icon.FI
,
.FI
{
background-position
:
-324px
-50%
;}
.ui-fake-icon.FR
,
.FR
{
background-position
:
-360px
-50%
;}
.ui-fake-icon.global
,
.global
{
background-position
:
-396px
-50%
;}
.ui-fake-icon.GR
,
.GR
{
background-position
:
-432px
-50%
;}
.ui-fake-icon.HU
,
.HU
{
background-position
:
-468px
-50%
;}
.ui-fake-icon.IE
,
.IE
{
background-position
:
-504px
-50%
;}
.ui-fake-icon.IS
,
.IS
{
background-position
:
-540px
-50%
;}
.ui-fake-icon.IT
,
.IT
{
background-position
:
-576px
-50%
;}
.ui-fake-icon.LT
,
.LT
{
background-position
:
-612px
-50%
;}
.ui-fake-icon.LV
,
.LV
{
background-position
:
-648px
-50%
;}
.ui-fake-icon.MT
,
.MT
{
background-position
:
-684px
-50%
;}
.ui-fake-icon.NL
,
.NL
{
background-position
:
-720px
-50%
;}
.ui-fake-icon.NO
,
.NO
{
background-position
:
-756px
-50%
;}
.ui-fake-icon.PL
,
.PL
{
background-position
:
-792px
-50%
;}
.ui-fake-icon.PT
,
.PT
{
background-position
:
-828px
-50%
;}
.ui-fake-icon.RO
,
.RO
{
background-position
:
-864px
-50%
;}
.ui-fake-icon.RU
,
.RU
{
background-position
:
-900px
-50%
;}
.ui-fake-icon.SCO
,
.SCO
{
background-position
:
-936px
-50%
;}
.ui-fake-icon.SE
,
.SE
{
background-position
:
-973px
-50%
;}
.ui-fake-icon.SK
,
.SK
{
background-position
:
-1008px
-50%
;}
.ui-fake-icon.UA
,
.UA
{
background-position
:
-1044px
-50%
;}
.ui-fake-icon.EN
,
.EN
{
background-position
:
-1080px
-50%
;}
.ui-fake-icon.WAL
,
.WAL
{
background-position
:
-1116px
-50%
;}
/* make some space */
.ui-li-text
{
padding-left
:
40px
;
padding-left
:
15px
;
}
.ui-li-divider
{
text-align
:
center
;}
#translator
.ui-fake-icon.AT
,
#translator
.AT
{
background-position
:
0px
-50%
;}
#translator
.ui-fake-icon.BE
,
#translator
.BE
{
background-position
:
-36px
-50%
;}
#translator
.ui-fake-icon.BG
,
#translator
.BG
{
background-position
:
-72px
-50%
;}
#translator
.ui-fake-icon.CH
,
#translator
.CH
{
background-position
:
-108px
-50%
;}
#translator
.ui-fake-icon.CZ
,
#translator
.CZ
{
background-position
:
-144px
-50%
;}
#translator
.ui-fake-icon.DE
,
#translator
.DE
{
background-position
:
-180px
-50%
;}
#translator
.ui-fake-icon.DK
,
#translator
.DK
{
background-position
:
-216px
-50%
;}
#translator
.ui-fake-icon.EE
,
#translator
.EE
{
background-position
:
-252px
-50%
;}
#translator
.ui-fake-icon.ES
,
#translator
.ES
{
background-position
:
-288px
-50%
;}
#translator
.ui-fake-icon.FI
,
#translator
.FI
{
background-position
:
-324px
-50%
;}
#translator
.ui-fake-icon.FR
,
#translator
.FR
{
background-position
:
-360px
-50%
;}
#translator
.ui-fake-icon.global
,
#translator
.global
{
background-position
:
-396px
-50%
;}
#translator
.ui-fake-icon.GR
,
#translator
.GR
{
background-position
:
-432px
-50%
;}
#translator
.ui-fake-icon.HU
,
#translator
.HU
{
background-position
:
-468px
-50%
;}
#translator
.ui-fake-icon.IE
,
#translator
.IE
{
background-position
:
-504px
-50%
;}
#translator
.ui-fake-icon.IS
,
#translator
.IS
{
background-position
:
-540px
-50%
;}
#translator
.ui-fake-icon.IT
,
#translator
.IT
{
background-position
:
-576px
-50%
;}
#translator
.ui-fake-icon.LT
,
#translator
.LT
{
background-position
:
-612px
-50%
;}
#translator
.ui-fake-icon.LV
,
#translator
.LV
{
background-position
:
-648px
-50%
;}
#translator
.ui-fake-icon.MT
,
#translator
.MT
{
background-position
:
-684px
-50%
;}
#translator
.ui-fake-icon.NL
,
#translator
.NL
{
background-position
:
-720px
-50%
;}
#translator
.ui-fake-icon.NO
,
#translator
.NO
{
background-position
:
-756px
-50%
;}
#translator
.ui-fake-icon.PL
,
#translator
.PL
{
background-position
:
-792px
-50%
;}
#translator
.ui-fake-icon.PT
,
#translator
.PT
{
background-position
:
-828px
-50%
;}
#translator
.ui-fake-icon.RO
,
#translator
.RO
{
background-position
:
-864px
-50%
;}
#translator
.ui-fake-icon.RU
,
#translator
.RU
{
background-position
:
-900px
-50%
;}
#translator
.ui-fake-icon.SCO
,
#translator
.SCO
{
background-position
:
-936px
-50%
;}
#translator
.ui-fake-icon.SE
,
#translator
.SE
{
background-position
:
-973px
-50%
;}
#translator
.ui-fake-icon.SK
,
#translator
.SK
{
background-position
:
-1008px
-50%
;}
#translator
.ui-fake-icon.UA
,
#translator
.UA
{
background-position
:
-1044px
-50%
;}
#translator
.ui-fake-icon.EN
,
#translator
.EN
{
background-position
:
-1080px
-50%
;}
#translator
.ui-fake-icon.WAL
,
#translator
.WAL
{
background-position
:
-1116px
-50%
;}
#translator
.ui-li-text
{
padding-left
:
40px
;
padding-left
:
15px
;
}
#translator
.ui-li-divider
{
text-align
:
center
;}
</style>
</head>
<body>
<!-- span for CSS-testing old browsers -->
<span
class=
"ui-hidden-accessible el"
>
</span>
<a
data-role=
"button"
class=
"setIcon"
href=
""
data-rel=
"popup"
data-position-to=
"origin"
data-icon=
"lang"
data-iconpos=
"notext"
>
Languages
</a>
<div
data-role=
"popup"
class=
"all_popups"
>
<ul
data-role=
"listview"
data-inset=
"true"
data-divider-theme=
"f"
>
<li
data-role=
"list-divider"
class=
"t"
data-i18n=
"gen.language"
></li>
<li
data-icon=
"false"
><a
class=
"t change_language"
href=
"?lang=fr-FR"
data-i18n-target=
".ui-li-text"
data-i18n=
"[title]gen.language_info;[html]gen.lang.fr"
><span
class=
"ui-icon ui-fake-icon ui-li-icon ui-icon-lang ui-li-thumb FR"
>
</span><span
class=
"ui-li-text"
></span></a></li>
<li
data-icon=
"false"
><a
class=
"t change_language"
href=
"?lang=de-DE"
data-i18n-target=
".ui-li-text"
data-i18n=
"[title]gen.language_info;[html]gen.lang.de"
><span
class=
"ui-icon ui-fake-icon ui-li-icon ui-icon-lang ui-li-thumb DE"
>
</span><span
class=
"ui-li-text"
></span></a></li>
<li
data-icon=
"false"
><a
class=
"t change_language"
href=
"?lang=en-EN"
data-i18n-target=
".ui-li-text"
data-i18n=
"[title]gen.language_info;[html]gen.lang.en"
><span
class=
"ui-icon ui-fake-icon ui-li-icon ui-icon-lang ui-li-thumb EN"
>
</span><span
class=
"ui-li-text"
></span></a></li>
<li
data-role=
"list-divider"
class=
"t
ranslate
"
data-i18n=
"gen.language"
></li>
<li
data-icon=
"false"
><a
class=
"t
ranslate
change_language"
href=
"?lang=fr-FR"
data-i18n-target=
".ui-li-text"
data-i18n=
"[title]gen.language_info;[html]gen.lang.fr"
><span
class=
"ui-icon ui-fake-icon ui-li-icon ui-icon-lang ui-li-thumb FR"
>
</span><span
class=
"ui-li-text"
></span></a></li>
<li
data-icon=
"false"
><a
class=
"t
ranslate
change_language"
href=
"?lang=de-DE"
data-i18n-target=
".ui-li-text"
data-i18n=
"[title]gen.language_info;[html]gen.lang.de"
><span
class=
"ui-icon ui-fake-icon ui-li-icon ui-icon-lang ui-li-thumb DE"
>
</span><span
class=
"ui-li-text"
></span></a></li>
<li
data-icon=
"false"
><a
class=
"t
ranslate
change_language"
href=
"?lang=en-EN"
data-i18n-target=
".ui-li-text"
data-i18n=
"[title]gen.language_info;[html]gen.lang.en"
><span
class=
"ui-icon ui-fake-icon ui-li-icon ui-icon-lang ui-li-thumb EN"
>
</span><span
class=
"ui-li-text"
></span></a></li>
</ul>
</div>
...
...
@@ -82,13 +84,16 @@
i
,
list
=
RenderJs
.
GadgetIndex
.
getGadgetList
(),
current_gadget
,
recursive_gadgets
=
gadget
.
dom
.
find
(
"
[data-gadget]
"
).
not
(
"
.main-interactor
"
),
len
=
recursive_gadgets
.
length
,
lang
=
$
.
fn
.
fauna
.
i18n_current_lang
,
// recursive_gadgets = gadget.dom.find("[data-gadget]").not(".main-interactor"),
// len = recursive_gadgets.length,
lang
=
RenderJs
.
properties
.
current_languageuage
,
set_attribute
,
/* swap icon depending on language */
switchIcon
=
function
(
id
,
icon
)
{
var
current_gadget
,
elem
,
gadget_to_translate
;
// not possible without, because JQM will not be done enhancing
window
.
setTimeout
(
function
(){
setTimeout
(
function
(){
current_gadget
=
RenderJs
.
GadgetIndex
.
getGadgetById
(
id
),
elem
=
current_gadget
.
dom
.
find
(
"
.setIcon .ui-icon
"
);
elem
=
$
(
"
.setIcon .ui-icon
"
)
...
...
@@ -98,8 +103,9 @@
}
},
50
);
},
// set language
set_lang
=
function
(
language
)
{
/* set application language */
setLanguage
=
function
(
language
)
{
var
set_icon
,
elem
,
override
=
false
,
remote
;
switch
(
language
)
{
...
...
@@ -114,15 +120,7 @@
break
;
};
// trigger create
if
(
gadget
.
isEnhanced
()
===
false
)
{
$
(
document
).
trigger
(
"
render_enhance
"
,
{
"
gadget
"
:
gadget
.
dom
});
// no other way to translate popups, because the popup will be moved to the end of the DOM
remote
=
gadget
.
dom
.
find
(
"
a
"
).
attr
(
'
href
'
);
$
(
remote
+
'
-popup
'
).
find
(
"
.t
"
).
i18n
()
}
if
(
$
.
fn
.
fauna
.
i18n_current_lang
!==
language
)
{
if
(
RenderJs
.
properties
.
current_languageuage
!==
language
)
{
override
=
true
;
}
// translate all gadgets in the gadget list (dom available)
...
...
@@ -130,7 +128,7 @@
gadget_to_translate
=
list
[
i
];
if
(
gadget_to_translate
.
isEnhanced
()
===
false
||
override
)
{
gadget_to_translate
.
dom
.
find
(
"
.t
"
)
.
find
(
"
.t
, .translate
"
)
.
i18n
()
.
end
()
// in JQM, we also need to update all widgets with "artificial"
...
...
@@ -141,13 +139,14 @@
gadget_to_translate
.
setEnhanced
(
true
);
}
}
$
.
fn
.
fauna
.
i18n_current_lang
=
language
;
RenderJs
.
properties
.
current_languageuage
=
language
;
switchIcon
(
gadget
.
id
,
set_icon
);
},
// i18n handler
lang
=
function
(
lang
)
{
/* initialize i18n translation plugin */
initializeTranslations
=
function
(
language
)
{
// init
if
(
$
.
fn
.
fauna
.
i18n
_set
===
undefined
)
{
if
(
RenderJs
.
properties
.
language
_set
===
undefined
)
{
$
.
i18n
.
init
({
lng
:
'
en-EN
'
,
load
:
'
current
'
,
...
...
@@ -159,50 +158,53 @@
// , useLocalStorage: true
// , localStorageExpirationTime: 86400000 // in ms, default 1 week
},
function
()
{
set
_lang
(
$
.
i18n
.
lng
());
set
Language
(
$
.
i18n
.
lng
());
});
$
.
fn
.
fauna
.
i18n
_set
=
true
;
RenderJs
.
properties
.
language
_set
=
true
;
}
else
{
set
_lang
(
lang
);
set
Language
(
language
);
}
};
// customize gadget
if
(
gadget
.
self
!==
undefined
)
{
for
(
key
in
gadget
.
self
)
{
if
(
gadget
.
self
.
hasOwnProperty
(
key
))
{
gadget
.
dom
.
find
(
key
).
attr
(
gadget
.
self
[
key
][
0
],
gadget
.
self
[
key
][
1
]);
}
}
}
recursive_gadgets
.
each
(
function
(
i
)
{
var
passJSON
=
gadget
[
$
(
this
).
attr
(
'
id
'
)],
string
,
new_string
,
current_id
=
$
(
this
).
attr
(
'
id
'
),
new_id
=
current_id
+
"
__
"
+
gadget
.
dom
.
attr
(
'
id
'
);
// pass on JSON if present BEFORE modifying gadget-id
if
(
passJSON
!==
undefined
)
{
$
(
this
).
attr
(
'
data-gadget-property
'
,
'
{"self":
'
+
JSON
.
stringify
(
passJSON
)
+
'
}
'
);
}
// dynamic gadget-id
$
(
this
).
attr
(
'
id
'
,
new_id
);
});
// does not work when navigating between multiple pages
// moved to docReady
/* initialize translation */
RenderJs
.
bindReady
(
function
()
{
var
current_lang
=
$
.
fn
.
fauna
.
i18n_current_lang
;
lang
(
current_lang
);
var
current_lang
uage
=
RenderJs
.
properties
.
current_languageuage
;
initializeTranslations
(
current_language
);
});
$
(
document
).
ready
(
function
()
{
// fallback for old devices which cannot load
<
style
>
css
gadget
=
RenderJs
.
getSelfGadget
()
var
gadget
=
RenderJs
.
getSelfGadget
();
// trigger create
if
(
gadget
.
isEnhanced
()
===
undefined
||
gadget
.
isEnhanced
()
===
false
)
{
gadget
.
dom
.
trigger
(
"
create
"
);
// no other way to translate popups, because the popup will be moved to the end of the DOM
remote
=
gadget
.
dom
.
find
(
"
a
"
).
attr
(
'
href
'
);
console
.
log
(
gadget
)
console
.
log
(
gadget
.
dom
)
console
.
log
(
gadget
.
dom
.
find
(
"
a
"
))
console
.
log
(
gadget
.
dom
.
find
(
"
a
"
).
attr
(
'
href
'
))
console
.
log
(
gadget
.
dom
.
find
(
"
a
"
)[
0
]);
console
.
log
(
gadget
.
dom
.
find
(
"
a
"
).
attr
(
'
href
'
)
+
'
-popup
'
)
console
.
log
(
$
(
remote
+
'
-popup
'
).
find
(
"
.t, .translate
"
))
$
(
remote
+
'
-popup
'
).
find
(
"
.t, .translate
"
).
i18n
()
}
// fallback for old devices which cannot load
<
style
>
css
console
.
log
(
"
HELLO
"
);
console
.
log
(
gadget
.
dom
.
find
(
"
.el
"
))
console
.
log
(
gadget
.
dom
.
find
(
"
.el
"
).
css
(
'
width
'
))
if
(
gadget
.
dom
.
find
(
"
.el
"
).
css
(
'
width
'
)
!==
"
1px
"
)
{
console
.
log
(
"
requiring
"
);
require
([
'
text!../css/translate.css
'
],
function
(
t
)
{
var
x
=
'
<style>
'
+
t
+
'
</style>
'
;
// why does this not updat the DOM, too?
gadget
.
dom
.
append
(
x
);
});
}
$
(
this
)
$
(
this
)
.
filter
(
function
()
{
return
$
(
this
).
jqmData
(
"
i18n
"
)
!==
true
;
})
.
jqmData
(
'
i18n
'
,
true
)
.
on
(
'
click
'
,
'
.change_language
'
,
function
(
e
)
{
...
...
@@ -210,21 +212,14 @@
e
.
preventDefault
();
e
.
stopPropagation
();
$
(
'
.all_popups
'
).
popup
(
"
close
"
);
// switch to new language
$
.
i18n
.
setLng
(
new_language
,
function
()
{
// switch to new language
lang
(
new_language
);
});
});
// fallback for old devices which cannot load
<
style
>
css
if
(
gadget
.
dom
.
find
(
"
.el
"
).
css
(
'
width
'
)
!==
"
1px
"
)
{
require
([
'
text!../css/translate.css
'
],
function
(
t
)
{
var
x
=
'
<style>
'
+
t
+
'
</style>
'
;
// why does this not updat the DOM, too?
gadget
.
dom
.
append
(
x
);
});
}
initializeTranslations
(
new_language
);
}
);
});
});
})();
//]]>
...
...
js/controller.js
View file @
4f62489e
...
...
@@ -178,22 +178,22 @@ define([], function () {
// enhancing gadgets when everyone else is done
.
on
(
'
render_enhance
'
,
function
(
e
,
data
)
{
var
timer
;
data
.
gadget
.
trigger
(
"
create
"
);
// controlgroups inside popups
// this is a JQM controlgroup problem. Controlgroups include other widgets,
// so they are enhanced last after everything else has been enhanced.
// when inserting items dynamically and calling create, all widgets get
// enhanced, except for controlgroups which somestimes do, sometimes don't
// work. This is to make sure they work
// TODO: Find a better way
if
(
data
.
pops
)
{
timer
=
window
.
setTimeout
(
function
()
{
$
(
'
fieldset:jqmData(role="controlgroup")
'
).
parent
().
trigger
(
"
create
"
);
window
.
clearTimeout
(
timer
);
},
1000
);
}
//
var timer;
// //
data.gadget.trigger("create");
//
// controlgroups inside popups
//
// this is a JQM controlgroup problem. Controlgroups include other widgets,
//
// so they are enhanced last after everything else has been enhanced.
//
// when inserting items dynamically and calling create, all widgets get
//
// enhanced, except for controlgroups which somestimes do, sometimes don't
//
// work. This is to make sure they work
//
// TODO: Find a better way
//
if (data.pops) {
//
timer = window.setTimeout(function () {
//
$('fieldset:jqmData(role="controlgroup")').parent().trigger("create");
//
window.clearTimeout(timer);
//
},1000);
//
}
//
// when first gadget is ready, remove the splash scren
$
(
window
).
trigger
(
'
initLoaded
'
);
});
...
...
js/libs/jqm/jqm.js
View file @
4f62489e
This source diff could not be displayed because it is too large. You can
view the blob
instead.
js/plugins/renderjs/_renderjs.js
View file @
4f62489e
...
...
@@ -691,6 +691,10 @@ var RenderJs = (function () {
};
}()),
Properties
:
{
foo
:
"
bar
"
},
InteractionGadget
:
(
function
()
{
/*
* Basic gadget interaction gadget implementation.
...
...
js/plugins/renderjs/renderjs.js
View file @
4f62489e
/*! RenderJs v0.2 */
"
use strict
"
;
var
RENDERJS_ENABLE_IMPLICIT_GADGET_RENDERING
=
true
;
var
RENDERJS_ENABLE_IMPLICIT_INTERACTION_BIND
=
true
;
var
RENDERJS_ENABLE_IMPLICIT_ROUTE_CREATE
=
true
;
if
(
console
===
undefined
||
console
.
log
===
undefined
){
var
console
=
{};
console
.
log
=
function
(){}}
var
RenderJs
=
(
function
(){
var
is_ready
=
false
,
current_gadget
;
function
setSelfGadget
(
gadget
){
current_gadget
=
gadget
}
return
{
init
:
function
(){
if
(
RENDERJS_ENABLE_IMPLICIT_GADGET_RENDERING
){
RenderJs
.
bootstrap
(
$
(
"
body
"
))}
var
root_gadget
=
RenderJs
.
GadgetIndex
.
getRootGadget
();
if
(
RENDERJS_ENABLE_IMPLICIT_INTERACTION_BIND
||
RENDERJS_ENABLE_IMPLICIT_ROUTE_CREATE
){
if
(
root_gadget
!==
undefined
){
RenderJs
.
bindReady
(
function
(){
if
(
RENDERJS_ENABLE_IMPLICIT_INTERACTION_BIND
){
RenderJs
.
InteractionGadget
.
init
()}
if
(
RENDERJS_ENABLE_IMPLICIT_ROUTE_CREATE
){
RenderJs
.
RouteGadget
.
init
()}})}}},
bootstrap
:
function
(
root
){
var
gadget_id
,
is_gadget
;
gadget_id
=
root
.
attr
(
"
id
"
);
is_gadget
=
root
.
attr
(
"
data-gadget
"
)
!==
undefined
;
RenderJs
.
setReady
(
false
);
if
(
is_gadget
&&
gadget_id
!==
undefined
){
RenderJs
.
loadGadget
(
root
)}
RenderJs
.
loadRecursiveGadget
(
root
)},
loadRecursiveGadget
:
function
(
root
){
var
gadget_list
,
gadget
,
gadget_id
,
gadget_js
;
gadget_list
=
root
.
find
(
"
[data-gadget]
"
);
gadget_list
.
each
(
function
(){
gadget
=
$
(
this
);
gadget_id
=
gadget
.
attr
(
"
id
"
);
gadget_js
=
new
RenderJs
.
Gadget
(
gadget_id
,
gadget
);
RenderJs
.
GadgetIndex
.
registerGadget
(
gadget_js
)});
gadget_list
.
each
(
function
(){
RenderJs
.
loadGadget
(
$
(
this
))})},
setGadgetAndRecurse
:
function
(
gadget
,
data
){
setSelfGadget
(
RenderJs
.
GadgetIndex
.
getGadgetById
(
gadget
.
attr
(
"
id
"
)));
gadget
.
append
(
data
);
setSelfGadget
(
undefined
);
RenderJs
.
loadRecursiveGadget
(
gadget
)},
getSelfGadget
:
function
(){
return
current_gadget
},
loadGadget
:
function
(
gadget
){
var
url
,
gadget_id
,
gadget_property
,
cacheable
,
cache_id
,
i
,
gadget_index
,
gadget_index_id
,
app_cache
,
data
,
gadget_js
,
is_update_gadget_data_running
;
url
=
gadget
.
attr
(
"
data-gadget
"
);
gadget_id
=
gadget
.
attr
(
"
id
"
);
gadget_js
=
RenderJs
.
GadgetIndex
.
getGadgetById
(
gadget_id
);
gadget_index
=
RenderJs
.
GadgetIndex
.
getGadgetList
();
if
(
gadget_js
===
undefined
){
gadget_js
=
new
RenderJs
.
Gadget
(
gadget_id
,
gadget
);
RenderJs
.
GadgetIndex
.
registerGadget
(
gadget_js
)}
if
(
gadget_js
.
isReady
()){
return
}
gadget_property
=
gadget
.
attr
(
"
data-gadget-property
"
);
if
(
gadget_property
!==
undefined
){
gadget_property
=
$
.
parseJSON
(
gadget_property
);
$
.
each
(
gadget_property
,
function
(
key
,
value
){
gadget_js
[
key
]
=
value
})}
if
(
url
!==
undefined
&&
url
!==
""
){
cacheable
=
gadget
.
attr
(
"
data-gadget-cacheable
"
);
cache_id
=
gadget
.
attr
(
"
data-gadget-cache-id
"
);
if
(
cacheable
!==
undefined
&&
cache_id
!==
undefined
){
cacheable
=
Boolean
(
parseInt
(
cacheable
,
10
))}
if
(
cacheable
){
app_cache
=
RenderJs
.
Cache
.
get
(
cache_id
,
undefined
);
if
(
app_cache
===
undefined
||
app_cache
===
null
){
$
.
ajax
({
url
:
url
,
yourCustomData
:{
gadget_id
:
gadget_id
,
cache_id
:
cache_id
},
success
:
function
(
data
){
cache_id
=
this
.
yourCustomData
.
cache_id
;
gadget_id
=
this
.
yourCustomData
.
gadget_id
;
RenderJs
.
Cache
.
set
(
cache_id
,
data
);
RenderJs
.
GadgetIndex
.
getGadgetById
(
gadget_id
).
setReady
();
RenderJs
.
setGadgetAndRecurse
(
gadget
,
data
);
RenderJs
.
checkAndTriggerReady
();
RenderJs
.
updateGadgetData
(
gadget
)}})}
else
{
data
=
app_cache
;
gadget_js
.
setReady
();
this
.
setGadgetAndRecurse
(
gadget
,
data
);
this
.
checkAndTriggerReady
();
RenderJs
.
updateGadgetData
(
gadget
)}}
else
{
$
.
ajax
({
url
:
url
,
yourCustomData
:{
gadget_id
:
gadget_id
},
success
:
function
(
data
){
gadget_id
=
this
.
yourCustomData
.
gadget_id
;
RenderJs
.
GadgetIndex
.
getGadgetById
(
gadget_id
).
setReady
();
RenderJs
.
setGadgetAndRecurse
(
gadget
,
data
);
RenderJs
.
checkAndTriggerReady
();
RenderJs
.
updateGadgetData
(
gadget
)}})}}
else
{
is_update_gadget_data_running
=
RenderJs
.
updateGadgetData
(
gadget
);
if
(
!
is_update_gadget_data_running
){
gadget_js
.
setReady
()}
RenderJs
.
checkAndTriggerReady
()}},
isReady
:
function
(){
return
is_ready
},
setReady
:
function
(
value
){
is_ready
=
value
},
bindReady
:
function
(
ready_function
){
$
(
"
body
"
).
one
(
"
ready
"
,
ready_function
)},
checkAndTriggerReady
:
function
(){
var
is_gadget_list_loaded
;
is_gadget_list_loaded
=
RenderJs
.
GadgetIndex
.
isGadgetListLoaded
();
if
(
is_gadget_list_loaded
){
if
(
!
RenderJs
.
isReady
()){
RenderJs
.
GadgetIndex
.
getRootGadget
().
getDom
().
trigger
(
"
ready
"
);
$
(
"
body
"
).
trigger
(
"
ready
"
);
RenderJs
.
setReady
(
true
)}}
return
is_gadget_list_loaded
},
updateGadgetData
:
function
(
gadget
){
var
data_source
,
data_handler
;
data_source
=
gadget
.
attr
(
"
data-gadget-source
"
);
data_handler
=
gadget
.
attr
(
"
data-gadget-handler
"
);
if
(
data_source
!==
undefined
&&
data_source
!==
""
){
$
.
ajax
({
url
:
data_source
,
dataType
:
"
json
"
,
yourCustomData
:{
data_handler
:
data_handler
,
gadget_id
:
gadget
.
attr
(
"
id
"
)},
success
:
function
(
result
){
var
data_handler
,
gadget_id
;
data_handler
=
this
.
yourCustomData
.
data_handler
;
gadget_id
=
this
.
yourCustomData
.
gadget_id
;
if
(
data_handler
!==
undefined
){
eval
(
data_handler
+
"
(result)
"
);
gadget
=
RenderJs
.
GadgetIndex
.
getGadgetById
(
gadget_id
);
gadget
.
setReady
();
RenderJs
.
checkAndTriggerReady
()}}});
return
true
}
return
false
},
addGadget
:
function
(
dom_id
,
gadget_id
,
gadget
,
gadget_data_handler
,
gadget_data_source
){
var
html_string
,
tab_container
,
tab_gadget
;
tab_container
=
$
(
"
#
"
+
dom_id
);
tab_container
.
empty
();
html_string
=
[
'
<div id="
'
+
gadget_id
+
'
"
'
,
'
data-gadget="
'
+
gadget
+
'
"
'
,
'
data-gadget-handler="
'
+
gadget_data_handler
+
'
"
'
,
'
data-gadget-source="
'
+
gadget_data_source
+
'
"></div>
'
].
join
(
"
\n
"
);
tab_container
.
append
(
html_string
);
tab_gadget
=
tab_container
.
find
(
"
.gadget
"
);
RenderJs
.
bootstrap
(
tab_container
);
return
tab_gadget
},
Cache
:(
function
(){
return
{
ROOT_CACHE_ID
:
"
APP_CACHE
"
,
getCacheId
:
function
(
cache_id
){
return
this
.
ROOT_CACHE_ID
+
cache_id
},
hasLocalStorage
:
function
(){
var
mod
;
mod
=
"
localstorage_test_12345678
"
;
try
{
localStorage
.
setItem
(
mod
,
mod
);
localStorage
.
removeItem
(
mod
);
return
true
}
catch
(
e
){
return
false
}},
get
:
function
(
cache_id
,
default_value
){
cache_id
=
this
.
getCacheId
(
cache_id
);
if
(
this
.
hasLocalStorage
()){
return
this
.
LocalStorageCachePlugin
.
get
(
cache_id
,
default_value
)}
return
this
.
NameSpaceStorageCachePlugin
.
get
(
cache_id
,
default_value
)},
set
:
function
(
cache_id
,
data
){
cache_id
=
this
.
getCacheId
(
cache_id
);
if
(
this
.
hasLocalStorage
()){
this
.
LocalStorageCachePlugin
.
set
(
cache_id
,
data
)}
else
{
this
.
NameSpaceStorageCachePlugin
.
set
(
cache_id
,
data
)}},
LocalStorageCachePlugin
:(
function
(){
return
{
get
:
function
(
cache_id
,
default_value
){
if
(
localStorage
.
getItem
(
cache_id
)
!==
null
){
return
JSON
.
parse
(
localStorage
.
getItem
(
cache_id
))}
return
default_value
},
set
:
function
(
cache_id
,
data
){
localStorage
.
setItem
(
cache_id
,
JSON
.
stringify
(
data
))}}}()),
NameSpaceStorageCachePlugin
:(
function
(){
var
namespace
=
{};
return
{
get
:
function
(
cache_id
,
default_value
){
return
namespace
[
cache_id
]},
set
:
function
(
cache_id
,
data
){
namespace
[
cache_id
]
=
data
}}}())}}()),
Gadget
:
function
(
gadget_id
,
dom
){
this
.
id
=
gadget_id
;
this
.
dom
=
dom
;
this
.
is_ready
=
false
;
this
.
is_enhanced
=
false
;
this
.
getId
=
function
(){
return
this
.
id
};
this
.
getDom
=
function
(){
return
this
.
dom
};
this
.
isReady
=
function
(){
return
this
.
is_ready
};
this
.
setReady
=
function
(
value
){
this
.
is_ready
=
value
===
undefined
?
true
:
value
};
this
.
isEnhanced
=
function
(){
return
this
.
is_enhanced
};
this
.
setEnhanced
=
function
(
value
){
this
.
is_enhanced
=
value
};
this
.
remove
=
function
(){
RenderJs
.
GadgetIndex
.
unregisterGadget
(
this
);
$
(
this
.
getDom
()).
remove
()}},
TabbularGadget
:(
function
(){
return
{
toggleVisibility
:
function
(
visible_dom
){
$
(
"
.selected
"
).
addClass
(
"
not_selected
"
);
$
(
"
.selected
"
).
removeClass
(
"
selected
"
);
visible_dom
.
addClass
(
"
selected
"
);
visible_dom
.
removeClass
(
"
not_selected
"
)},
addNewTabGadget
:
function
(
dom_id
,
gadget_id
,
gadget
,
gadget_data_handler
,
gadget_data_source
){
var
tab_gadget
;
tab_gadget
=
RenderJs
.
addGadget
(
dom_id
,
gadget_id
,
gadget
,
gadget_data_handler
,
gadget_data_source
)}}}()),
GadgetIndex
:(
function
(){
var
gadget_list
=
[];
return
{
getGadgetIdListFromDom
:
function
(
dom
){
var
gadget_id_list
=
[];
$
.
each
(
dom
.
find
(
"
[data-gadget]
"
),
function
(
index
,
value
){
gadget_id_list
.
push
(
$
(
value
).
attr
(
"
id
"
))});
return
gadget_id_list
},
setGadgetList
:
function
(
gadget_list_value
){
gadget_list
=
gadget_list_value
},
getGadgetList
:
function
(){
return
gadget_list
},
registerGadget
:
function
(
gadget
){
if
(
RenderJs
.
GadgetIndex
.
getGadgetById
(
gadget
.
id
)
===
undefined
){
gadget_list
.
push
(
gadget
)}},
unregisterGadget
:
function
(
gadget
){
var
index
=
$
.
inArray
(
gadget
,
gadget_list
);
if
(
index
!==-
1
){
gadget_list
.
splice
(
index
,
1
)}},
getGadgetById
:
function
(
gadget_id
){
var
gadget
;
gadget
=
undefined
;
$
(
RenderJs
.
GadgetIndex
.
getGadgetList
()).
each
(
function
(
index
,
value
){
if
(
value
.
getId
()
===
gadget_id
){
gadget
=
value
}});
return
gadget
},
getRootGadget
:
function
(){
return
this
.
getGadgetList
()[
0
]},
isGadgetListLoaded
:
function
(){
var
result
;
result
=
true
;
$
(
this
.
getGadgetList
()).
each
(
function
(
index
,
value
){
if
(
value
.
isReady
()
===
false
){
result
=
false
}});
return
result
}}}()),
GadgetCatalog
:(
function
(){
var
cache_id
=
"
setGadgetIndexUrlList
"
;
function
updateGadgetIndexFromURL
(
url
){
var
url_list
=
url
.
split
(
"
/
"
),
document_url
=
url_list
[
url_list
.
length
-
1
],
d
=
url_list
.
splice
(
$
.
inArray
(
document_url
,
url_list
),
1
),
base_url
=
url_list
.
join
(
"
/
"
),
web_dav
=
jIO
.
newJio
({
type
:
"
dav
"
,
username
:
""
,
password
:
""
,
url
:
base_url
});
web_dav
.
get
(
document_url
,
function
(
err
,
response
){
RenderJs
.
Cache
.
set
(
url
,
response
)})}
return
{
updateGadgetIndex
:
function
(){
$
.
each
(
RenderJs
.
GadgetCatalog
.
getGadgetIndexUrlList
(),
function
(
index
,
value
){
updateGadgetIndexFromURL
(
value
)})},
setGadgetIndexUrlList
:
function
(
url_list
){
RenderJs
.
Cache
.
set
(
cache_id
,
url_list
)},
getGadgetIndexUrlList
:
function
(){
return
RenderJs
.
Cache
.
get
(
cache_id
,
undefined
)},
getGadgetListThatProvide
:
function
(
service
){
var
gadget_list
=
[];
$
.
each
(
RenderJs
.
GadgetCatalog
.
getGadgetIndexUrlList
(),
function
(
index
,
url
){
var
cached_repo
=
RenderJs
.
Cache
.
get
(
url
);
$
.
each
(
cached_repo
.
gadget_list
,
function
(
index
,
gadget
){
if
(
$
.
inArray
(
service
,
gadget
.
service_list
)
>-
1
){
gadget_list
.
push
(
gadget
)}})});
return
gadget_list
},
registerServiceList
:
function
(
gadget
,
service_list
){}}}()),
InteractionGadget
:(
function
(){
return
{
init
:
function
(
force
){
var
dom_list
,
gadget_id
;
if
(
force
===
1
){
dom_list
=
$
(
"
div[data-gadget-connection]
"
)}
else
{
dom_list
=
$
(
"
div[data-gadget-connection]
"
).
filter
(
function
(){
return
$
(
this
).
data
(
"
bound
"
)
!==
true
}).
data
(
"
bound
"
,
true
)}
dom_list
.
each
(
function
(
index
,
element
){
RenderJs
.
InteractionGadget
.
bind
(
$
(
element
))})},
bind
:
function
(
gadget_dom
){
var
gadget_id
,
gadget_connection_list
,
createMethodInteraction
=
function
(
original_source_method_id
,
source_gadget_id
,
source_method_id
,
destination_gadget_id
,
destination_method_id
){
var
interaction
=
function
(){
RenderJs
.
GadgetIndex
.
getGadgetById
(
source_gadget_id
)[
original_source_method_id
].
apply
(
null
,
arguments
);
RenderJs
.
GadgetIndex
.
getGadgetById
(
destination_gadget_id
).
dom
.
trigger
(
source_method_id
)};
return
interaction
},
createTriggerInteraction
=
function
(
destination_gadget_id
,
destination_method_id
){
var
interaction
=
function
(){
RenderJs
.
GadgetIndex
.
getGadgetById
(
destination_gadget_id
)[
destination_method_id
].
apply
(
null
,
arguments
)};
return
interaction
};
gadget_id
=
gadget_dom
.
attr
(
"
id
"
);
gadget_connection_list
=
gadget_dom
.
attr
(
"
data-gadget-connection
"
);
gadget_connection_list
=
$
.
parseJSON
(
gadget_connection_list
);
$
.
each
(
gadget_connection_list
,
function
(
key
,
value
){
var
source
,
source_gadget_id
,
source_method_id
,
source_gadget
,
destination
,
destination_gadget_id
,
destination_method_id
,
destination_gadget
,
original_source_method_id
;
source
=
value
.
source
.
split
(
"
.
"
);
source_gadget_id
=
source
[
0
];
source_method_id
=
source
[
1
];
source_gadget
=
RenderJs
.
GadgetIndex
.
getGadgetById
(
source_gadget_id
);
destination
=
value
.
destination
.
split
(
"
.
"
);
destination_gadget_id
=
destination
[
0
];
destination_method_id
=
destination
[
1
];
destination_gadget
=
RenderJs
.
GadgetIndex
.
getGadgetById
(
destination_gadget_id
);
if
(
source_gadget
.
hasOwnProperty
(
source_method_id
)){
original_source_method_id
=
"
original_
"
+
source_method_id
;
source_gadget
[
original_source_method_id
]
=
source_gadget
[
source_method_id
];
source_gadget
[
source_method_id
]
=
createMethodInteraction
(
original_source_method_id
,
source_gadget_id
,
source_method_id
,
destination_gadget_id
,
destination_method_id
);
destination_gadget
.
dom
.
bind
(
source_method_id
,
createTriggerInteraction
(
destination_gadget_id
,
destination_method_id
))}
else
{
source_gadget
.
dom
.
bind
(
source_method_id
,
createTriggerInteraction
(
destination_gadget_id
,
destination_method_id
))}})}}}()),
RouteGadget
:(
function
(){
var
route_list
=
[];
return
{
init
:
function
(){
$
(
"
div[data-gadget-route]
"
).
each
(
function
(
index
,
element
){
RenderJs
.
RouteGadget
.
route
(
$
(
element
))})},
route
:
function
(
gadget_dom
){
var
body
=
$
(
"
body
"
),
handler_func
,
priority
,
gadget_route_list
=
gadget_dom
.
attr
(
"
data-gadget-route
"
);
gadget_route_list
=
$
.
parseJSON
(
gadget_route_list
);
$
.
each
(
gadget_route_list
,
function
(
key
,
gadget_route
){
handler_func
=
function
(){
var
gadget_id
=
gadget_route
.
destination
.
split
(
"
.
"
)[
0
],
method_id
=
gadget_route
.
destination
.
split
(
"
.
"
)[
1
],
gadget
=
RenderJs
.
GadgetIndex
.
getGadgetById
(
gadget_id
);
setSelfGadget
(
gadget
);
gadget
[
method_id
].
apply
(
null
,
arguments
);
setSelfGadget
(
undefined
)};
priority
=
gadget_route
.
priority
;
if
(
priority
===
undefined
){
priority
=
1
}
RenderJs
.
RouteGadget
.
add
(
gadget_route
.
source
,
handler_func
,
priority
)})},
add
:
function
(
path
,
handler_func
,
priority
){
var
body
=
$
(
"
body
"
);
body
.
route
(
"
add
"
,
path
,
1
).
done
(
handler_func
);
route_list
.
push
({
path
:
path
,
handler_func
:
handler_func
,
priority
:
priority
})},
go
:
function
(
path
,
handler_func
,
priority
){
var
body
=
$
(
"
body
"
);
body
.
route
(
"
go
"
,
path
,
priority
).
fail
(
handler_func
)},
remove
:
function
(
path
){},
getRouteList
:
function
(){
return
route_list
}}}())}}());
\ No newline at end of file
/*global console, require, $, localStorage, document, jIO */
/*jslint evil: true, white: true */
"
use strict
"
;
/*
* RenderJs - Generic Gadget library renderer.
* http://www.renderjs.org/documentation
*/
// by default RenderJs will render all gadgets when page is loaded
// still it's possible to override this and use explicit gadget rendering
var
RENDERJS_ENABLE_IMPLICIT_GADGET_RENDERING
=
true
;
// by default RenderJs will examine and bind all interaction gadgets
// available
var
RENDERJS_ENABLE_IMPLICIT_INTERACTION_BIND
=
true
;
// by default RenderJs will examine and create all routes
var
RENDERJS_ENABLE_IMPLICIT_ROUTE_CREATE
=
true
;
// fallback for IE
if
(
console
===
undefined
||
console
.
log
===
undefined
)
{
var
console
=
{};
console
.
log
=
function
()
{};
}
var
RenderJs
=
(
function
()
{
// a variable indicating if current gadget loading is over or not
var
is_ready
=
false
,
current_gadget
;
function
setSelfGadget
(
gadget
)
{
/*
* Only used internally to set current gadget being executed.
*/
current_gadget
=
gadget
;
}
return
{
init
:
function
()
{
/*
* Do all initialization
*/
if
(
RENDERJS_ENABLE_IMPLICIT_GADGET_RENDERING
)
{
RenderJs
.
bootstrap
(
$
(
'
body
'
));
}
var
root_gadget
=
RenderJs
.
GadgetIndex
.
getRootGadget
();
if
(
RENDERJS_ENABLE_IMPLICIT_INTERACTION_BIND
||
RENDERJS_ENABLE_IMPLICIT_ROUTE_CREATE
)
{
// We might have a page without gadgets.
// Be careful, right now we can be in this case because
// asynchronous gadget loading is not finished
if
(
root_gadget
!==
undefined
)
{
RenderJs
.
bindReady
(
function
()
{
if
(
RENDERJS_ENABLE_IMPLICIT_INTERACTION_BIND
)
{
// examine all Intaction Gadgets and bind accordingly
RenderJs
.
InteractionGadget
.
init
();
}
if
(
RENDERJS_ENABLE_IMPLICIT_ROUTE_CREATE
)
{
// create all routes between gadgets
RenderJs
.
RouteGadget
.
init
();
}
});
}
}
},
bootstrap
:
function
(
root
)
{
/*
* Load all gadgets for this DOM element
* (including recursively contained ones)
*/
var
gadget_id
,
is_gadget
;
gadget_id
=
root
.
attr
(
"
id
"
);
is_gadget
=
root
.
attr
(
"
data-gadget
"
)
!==
undefined
;
// this will make RenderJs fire "ready" event when all gadgets are loaded.
RenderJs
.
setReady
(
false
);
if
(
is_gadget
&&
gadget_id
!==
undefined
)
{
// bootstart root gadget only if it is indeed a gadget
RenderJs
.
loadGadget
(
root
);
}
RenderJs
.
loadRecursiveGadget
(
root
);
},
loadRecursiveGadget
:
function
(
root
)
{
/*
* Load all contained gadgets inside passed DOM element.
*/
var
gadget_list
,
gadget
,
gadget_id
,
gadget_js
,
gadget_properties
,
properties_to_pass
;
gadget_list
=
root
.
find
(
"
[data-gadget]
"
);
gadget_properties
=
root
.
attr
(
'
data-gadget-property
'
);
// register all gadget in advance so checkAndTriggerReady
// can have accurate information for list of all gadgets
gadget_list
.
each
(
function
()
{
var
value
;
gadget
=
$
(
this
);
gadget_id
=
gadget
.
attr
(
"
id
"
);
if
(
gadget_id
!==
undefined
&&
root
.
attr
(
'
id
'
)
!==
undefined
)
{
gadget_id
=
root
.
attr
(
'
id
'
)
+
"
__
"
+
gadget_id
;
gadget
.
attr
(
'
id
'
,
gadget_id
);
}
gadget_js
=
new
RenderJs
.
Gadget
(
gadget_id
,
gadget
);
RenderJs
.
GadgetIndex
.
registerGadget
(
gadget_js
);
if
(
gadget_properties
!==
undefined
)
{
properties_to_pass
=
$
.
parseJSON
(
gadget_properties
);
// pass properties if set and it's not the interaction gadget
if
(
gadget_id
!==
undefined
)
{
for
(
value
in
properties_to_pass
)
{
if
(
properties_to_pass
.
hasOwnProperty
(
value
))
{
if
(
properties_to_pass
[
value
]
!==
undefined
&&
value
!==
"
self
"
)
{
$
(
this
).
attr
(
'
data-gadget-property
'
,
'
{"self":
'
+
JSON
.
stringify
(
properties_to_pass
[
value
])
+
'
}
'
);
}
}
}
}
}
});
// Load chilren
gadget_list
.
each
(
function
()
{
RenderJs
.
loadGadget
(
$
(
this
));
});
},
setGadgetAndRecurse
:
function
(
gadget
,
data
)
{
/*
* Set gadget data and recursively load it in case it holds another
* gadgets.
*/
// set current gadget as being loaded so gadget instance itself knows which gadget it is
var
gadget_property
,
gadget_js
=
RenderJs
.
GadgetIndex
.
getGadgetById
(
gadget
.
attr
(
"
id
"
));
setSelfGadget
(
gadget_js
);
gadget
.
append
(
data
.
replace
(
/<title>
[\s\S]
*
?
<
\/
title>/g
,
''
).
replace
(
/<meta
[\s\S]
*
?
>/g
,
''
)
);
// update Gadget's instance with contents of "data-gadget-property"
gadget_property
=
gadget
.
attr
(
"
data-gadget-property
"
);
if
(
gadget_property
!==
undefined
)
{
gadget_property
=
$
.
parseJSON
(
gadget_property
);
$
.
each
(
gadget_property
,
function
(
key
,
value
)
{
gadget_js
[
key
]
=
value
;
if
(
key
===
"
self
"
)
{
$
.
each
(
gadget_js
[
key
],
function
(
element
,
setter
)
{
gadget_js
.
dom
.
find
(
element
).
attr
(
setter
[
0
],
setter
[
1
]);
});
}
});
}
// reset as no longer current gadget
setSelfGadget
(
undefined
);
// a gadget may contain sub gadgets
RenderJs
.
loadRecursiveGadget
(
gadget
);
},
getSelfGadget
:
function
()
{
/*
* Get current gadget being loaded
* This function must be used with care as it relies on Javascript nature of being a single
* threaded application. Currently current gadget is set in a global RenderJs variable
* before its HTML is inserted into DOM and if multiple threads were running (which is not the case currently)
* this could lead to reace conditions and unreliable getSelfGadget results.
* Additionally this function is available only at gadget's script load time - i.e.
* it can't be used in after that calls. In this case gagdget can save this value internally.
*/
return
current_gadget
;
},
loadGadget
:
function
(
gadget
)
{
/*
* Load gadget's SPECs from URL
*/
var
url
,
gadget_id
,
cacheable
,
cache_id
,
i
,
gadget_index
,
gadget_index_id
,
app_cache
,
data
,
gadget_js
,
is_update_gadget_data_running
;
url
=
gadget
.
attr
(
"
data-gadget
"
);
gadget_id
=
gadget
.
attr
(
"
id
"
);
gadget_js
=
RenderJs
.
GadgetIndex
.
getGadgetById
(
gadget_id
);
gadget_index
=
RenderJs
.
GadgetIndex
.
getGadgetList
();
if
(
gadget_js
===
undefined
)
{
// register gadget in javascript namespace if not already registered
gadget_js
=
new
RenderJs
.
Gadget
(
gadget_id
,
gadget
);
RenderJs
.
GadgetIndex
.
registerGadget
(
gadget_js
);
}
if
(
gadget_js
.
isReady
())
{
// avoid loading again gadget which was loaded before in same page
return
;
}
if
(
url
!==
undefined
&&
url
!==
""
)
{
cacheable
=
gadget
.
attr
(
"
data-gadget-cacheable
"
);
cache_id
=
gadget
.
attr
(
"
data-gadget-cache-id
"
);
if
(
cacheable
!==
undefined
&&
cache_id
!==
undefined
)
{
cacheable
=
Boolean
(
parseInt
(
cacheable
,
10
));
}
//cacheable = false ; // to develop faster
if
(
cacheable
)
{
// get from cache if possible, use last part from URL as
// cache_key
app_cache
=
RenderJs
.
Cache
.
get
(
cache_id
,
undefined
);
if
(
app_cache
===
undefined
||
app_cache
===
null
)
{
// not in cache so we pull from network and cache
$
.
ajax
({
url
:
url
,
yourCustomData
:
{
"
gadget_id
"
:
gadget_id
,
"
cache_id
"
:
cache_id
},
success
:
function
(
data
)
{
cache_id
=
this
.
yourCustomData
.
cache_id
;
gadget_id
=
this
.
yourCustomData
.
gadget_id
;
RenderJs
.
Cache
.
set
(
cache_id
,
data
);
RenderJs
.
GadgetIndex
.
getGadgetById
(
gadget_id
).
setReady
();
RenderJs
.
setGadgetAndRecurse
(
gadget
,
data
);
RenderJs
.
checkAndTriggerReady
();
RenderJs
.
updateGadgetData
(
gadget
);
}
});
}
else
{
// get from cache
data
=
app_cache
;
gadget_js
.
setReady
();
this
.
setGadgetAndRecurse
(
gadget
,
data
);
this
.
checkAndTriggerReady
();
RenderJs
.
updateGadgetData
(
gadget
);
}
}
else
{
// not to be cached
$
.
ajax
({
url
:
url
,
yourCustomData
:
{
"
gadget_id
"
:
gadget_id
},
success
:
function
(
data
)
{
gadget_id
=
this
.
yourCustomData
.
gadget_id
;
RenderJs
.
GadgetIndex
.
getGadgetById
(
gadget_id
).
setReady
();
RenderJs
.
setGadgetAndRecurse
(
gadget
,
data
);
RenderJs
.
checkAndTriggerReady
();
RenderJs
.
updateGadgetData
(
gadget
);
}
});
}
}
else
{
// gadget is an inline (InteractorGadget or one using
// data-gadget-source / data-gadget-handler) so no need
// to load it from network
is_update_gadget_data_running
=
RenderJs
.
updateGadgetData
(
gadget
);
if
(
!
is_update_gadget_data_running
)
{
// no update is running so gadget is basically ready
// if update is running then it should take care and set status
gadget_js
.
setReady
();
}
RenderJs
.
checkAndTriggerReady
();
}
},
isReady
:
function
()
{
/*
* Get rendering status
*/
return
is_ready
;
},
setReady
:
function
(
value
)
{
/*
* Update rendering status
*/
is_ready
=
value
;
},
bindReady
:
function
(
ready_function
)
{
/*
* Bind a function on ready gadget loading.
*/
$
(
"
body
"
).
one
(
"
ready
"
,
ready_function
);
},
checkAndTriggerReady
:
function
()
{
/*
* Trigger "ready" event only if all gadgets were marked as "ready"
*/
var
is_gadget_list_loaded
;
is_gadget_list_loaded
=
RenderJs
.
GadgetIndex
.
isGadgetListLoaded
();
if
(
is_gadget_list_loaded
)
{
if
(
!
RenderJs
.
isReady
())
{
// backwards compatability with already written code
RenderJs
.
GadgetIndex
.
getRootGadget
().
getDom
().
trigger
(
"
ready
"
);
// trigger ready on root body element
$
(
"
body
"
).
trigger
(
"
ready
"
);
// this set will make sure we fire this event only once
RenderJs
.
setReady
(
true
);
}
}
return
is_gadget_list_loaded
;
},
updateGadgetData
:
function
(
gadget
)
{
/*
* Gadget can be updated from "data-gadget-source" (i.e. a json)
* and "data-gadget-handler" attributes (i.e. a namespace Javascript)
*/
var
data_source
,
data_handler
;
data_source
=
gadget
.
attr
(
"
data-gadget-source
"
);
data_handler
=
gadget
.
attr
(
"
data-gadget-handler
"
);
// acquire data and pass it to method handler
if
(
data_source
!==
undefined
&&
data_source
!==
""
)
{
$
.
ajax
({
url
:
data_source
,
dataType
:
"
json
"
,
yourCustomData
:
{
"
data_handler
"
:
data_handler
,
"
gadget_id
"
:
gadget
.
attr
(
"
id
"
)},
success
:
function
(
result
)
{
var
data_handler
,
gadget_id
;
data_handler
=
this
.
yourCustomData
.
data_handler
;
gadget_id
=
this
.
yourCustomData
.
gadget_id
;
if
(
data_handler
!==
undefined
)
{
// eval is not nice to use
eval
(
data_handler
+
"
(result)
"
);
gadget
=
RenderJs
.
GadgetIndex
.
getGadgetById
(
gadget_id
);
// mark gadget as loaded and fire a check
// to see if all gadgets are loaded
gadget
.
setReady
();
RenderJs
.
checkAndTriggerReady
();
}
}
});
// asynchronous update happens and respective thread will update status
return
true
;
}
return
false
;
},
addGadget
:
function
(
dom_id
,
gadget_id
,
gadget
,
gadget_data_handler
,
gadget_data_source
)
{
/*
* add new gadget and render it
*/
var
html_string
,
tab_container
,
tab_gadget
;
tab_container
=
$
(
'
#
'
+
dom_id
);
tab_container
.
empty
();
html_string
=
[
'
<div id="
'
+
gadget_id
+
'
"
'
,
'
data-gadget="
'
+
gadget
+
'
"
'
,
'
data-gadget-handler="
'
+
gadget_data_handler
+
'
"
'
,
'
data-gadget-source="
'
+
gadget_data_source
+
'
"></div>
'
].
join
(
'
\n
'
);
tab_container
.
append
(
html_string
);
tab_gadget
=
tab_container
.
find
(
"
.gadget
"
);
// render new gadget
RenderJs
.
bootstrap
(
tab_container
);
return
tab_gadget
;
},
Cache
:
(
function
()
{
/*
* Generic cache implementation that can fall back to local
* namespace storage if no "modern" storage like localStorage
* is available
*/
return
{
ROOT_CACHE_ID
:
'
APP_CACHE
'
,
getCacheId
:
function
(
cache_id
)
{
/*
* We should have a way to 'purge' localStorage by setting a
* ROOT_CACHE_ID in all browser instances
*/
return
this
.
ROOT_CACHE_ID
+
cache_id
;
},
hasLocalStorage
:
function
()
{
/*
* Feature test if localStorage is supported
*/
var
mod
;
mod
=
'
localstorage_test_12345678
'
;
try
{
localStorage
.
setItem
(
mod
,
mod
);
localStorage
.
removeItem
(
mod
);
return
true
;
}
catch
(
e
)
{
return
false
;
}
},
get
:
function
(
cache_id
,
default_value
)
{
/* Get cache key value */
cache_id
=
this
.
getCacheId
(
cache_id
);
if
(
this
.
hasLocalStorage
())
{
return
this
.
LocalStorageCachePlugin
.
get
(
cache_id
,
default_value
);
}
//fallback to javscript namespace cache
return
this
.
NameSpaceStorageCachePlugin
.
get
(
cache_id
,
default_value
);
},
set
:
function
(
cache_id
,
data
)
{
/* Set cache key value */
cache_id
=
this
.
getCacheId
(
cache_id
);
if
(
this
.
hasLocalStorage
())
{
this
.
LocalStorageCachePlugin
.
set
(
cache_id
,
data
);
}
else
{
this
.
NameSpaceStorageCachePlugin
.
set
(
cache_id
,
data
);
}
},
LocalStorageCachePlugin
:
(
function
()
{
/*
* This plugin saves using HTML5 localStorage.
*/
return
{
get
:
function
(
cache_id
,
default_value
)
{
/* Get cache key value */
if
(
localStorage
.
getItem
(
cache_id
)
!==
null
)
{
return
JSON
.
parse
(
localStorage
.
getItem
(
cache_id
));
}
return
default_value
;
},
set
:
function
(
cache_id
,
data
)
{
/* Set cache key value */
localStorage
.
setItem
(
cache_id
,
JSON
.
stringify
(
data
));
}
};
}()),
NameSpaceStorageCachePlugin
:
(
function
()
{
/*
* This plugin saves within current page namespace.
*/
var
namespace
=
{};
return
{
get
:
function
(
cache_id
,
default_value
)
{
/* Get cache key value */
return
namespace
[
cache_id
];
},
set
:
function
(
cache_id
,
data
)
{
/* Set cache key value */
namespace
[
cache_id
]
=
data
;
}
};
}())
};
}()),
Gadget
:
function
(
gadget_id
,
dom
)
{
/*
* Javascript Gadget representation
*/
this
.
id
=
gadget_id
;
this
.
dom
=
dom
;
this
.
is_ready
=
false
;
this
.
is_enhanced
=
false
;
this
.
getId
=
function
()
{
return
this
.
id
;
};
this
.
getDom
=
function
()
{
return
this
.
dom
;
};
this
.
isReady
=
function
()
{
/*
* Return True if remote gadget is loaded into DOM.
*/
return
this
.
is_ready
;
};
this
.
setReady
=
function
(
value
)
{
/*
* Return True if remote gadget is loaded into DOM.
*/
this
.
is_ready
=
value
===
undefined
?
true
:
value
;
};
this
.
isEnhanced
=
function
()
{
/*
* Return True if remote gadget has been enhanced
*/
return
this
.
is_enhanced
;
};
this
.
setEnhanced
=
function
(
value
)
{
/*
* Update enhancment status
*/
this
.
is_enhanced
=
value
;
};
this
.
remove
=
function
()
{
/*
* Remove gadget (including its DOM element).
*/
// unregister from GadgetIndex
RenderJs
.
GadgetIndex
.
unregisterGadget
(
this
);
// remove its DOM element
$
(
this
.
getDom
()).
remove
();
};
},
TabbularGadget
:
(
function
()
{
/*
* Generic tabular gadget
*/
return
{
toggleVisibility
:
function
(
visible_dom
)
{
/*
* Set tab as active visually and mark as not active rest.
*/
$
(
"
.selected
"
).
addClass
(
"
not_selected
"
);
$
(
"
.selected
"
).
removeClass
(
"
selected
"
);
visible_dom
.
addClass
(
"
selected
"
);
visible_dom
.
removeClass
(
"
not_selected
"
);
},
addNewTabGadget
:
function
(
dom_id
,
gadget_id
,
gadget
,
gadget_data_handler
,
gadget_data_source
)
{
/*
* add new gadget and render it
*/
var
tab_gadget
;
tab_gadget
=
RenderJs
.
addGadget
(
dom_id
,
gadget_id
,
gadget
,
gadget_data_handler
,
gadget_data_source
);
// XXX: we should unregister all gadgets (if any we replace now in DOM)
}
};
}()),
GadgetIndex
:
(
function
()
{
/*
* Generic gadget index placeholder
*/
var
gadget_list
=
[];
return
{
getGadgetIdListFromDom
:
function
(
dom
)
{
/*
* Get list of all gadget's ID from DOM
*/
var
gadget_id_list
=
[];
$
.
each
(
dom
.
find
(
'
[data-gadget]
'
),
function
(
index
,
value
)
{
gadget_id_list
.
push
(
$
(
value
).
attr
(
"
id
"
));}
);
return
gadget_id_list
;
},
setGadgetList
:
function
(
gadget_list_value
)
{
/*
* Set list of registered gadgets
*/
gadget_list
=
gadget_list_value
;
},
getGadgetList
:
function
()
{
/*
* Return list of registered gadgets
*/
return
gadget_list
;
},
registerGadget
:
function
(
gadget
)
{
/*
* Register gadget
*/
if
(
RenderJs
.
GadgetIndex
.
getGadgetById
(
gadget
.
id
)
===
undefined
)
{
// register only if not already added
gadget_list
.
push
(
gadget
);
}
},
unregisterGadget
:
function
(
gadget
)
{
/*
* Unregister gadget
*/
var
index
=
$
.
inArray
(
gadget
,
gadget_list
);
if
(
index
!==
-
1
)
{
gadget_list
.
splice
(
index
,
1
);
}
},
getGadgetById
:
function
(
gadget_id
)
{
/*
* Get gadget javascript representation by its Id
*/
var
gadget
;
gadget
=
undefined
;
$
(
RenderJs
.
GadgetIndex
.
getGadgetList
()).
each
(
function
(
index
,
value
)
{
if
(
value
.
getId
()
===
gadget_id
)
{
gadget
=
value
;
}
}
);
return
gadget
;
},
getRootGadget
:
function
()
{
/*
* Return root gadget (always first one in list)
*/
return
this
.
getGadgetList
()[
0
];
},
isGadgetListLoaded
:
function
()
{
/*
* Return True if all gadgets were loaded from network or
* cache
*/
var
result
;
result
=
true
;
$
(
this
.
getGadgetList
()).
each
(
function
(
index
,
value
)
{
if
(
value
.
isReady
()
===
false
)
{
result
=
false
;
}
}
);
return
result
;
}
};
}()),
GadgetCatalog
:
(
function
()
{
/*
* Gadget catalog provides API to get list of gadgets from a repository
*/
var
cache_id
=
"
setGadgetIndexUrlList
"
;
function
updateGadgetIndexFromURL
(
url
)
{
// split to base and document url
var
url_list
=
url
.
split
(
'
/
'
),
document_url
=
url_list
[
url_list
.
length
-
1
],
d
=
url_list
.
splice
(
$
.
inArray
(
document_url
,
url_list
),
1
),
base_url
=
url_list
.
join
(
'
/
'
),
web_dav
=
jIO
.
newJio
({
"
type
"
:
"
dav
"
,
"
username
"
:
""
,
"
password
"
:
""
,
"
url
"
:
base_url
});
web_dav
.
get
(
document_url
,
function
(
err
,
response
)
{
RenderJs
.
Cache
.
set
(
url
,
response
);
});
}
return
{
updateGadgetIndex
:
function
()
{
/*
* Update gadget index from all configured remote repositories.
*/
$
.
each
(
RenderJs
.
GadgetCatalog
.
getGadgetIndexUrlList
(),
function
(
index
,
value
)
{
updateGadgetIndexFromURL
(
value
);
});
},
setGadgetIndexUrlList
:
function
(
url_list
)
{
/*
* Set list of Gadget Index repositories.
*/
// store in Cache (html5 storage)
RenderJs
.
Cache
.
set
(
cache_id
,
url_list
);
},
getGadgetIndexUrlList
:
function
()
{
/*
* Get list of Gadget Index repositories.
*/
// get from Cache (html5 storage)
return
RenderJs
.
Cache
.
get
(
cache_id
,
undefined
);
},
getGadgetListThatProvide
:
function
(
service
)
{
/*
* Return list of all gadgets that providen a given service.
* Read this list from data structure created in HTML5 local
* storage by updateGadgetIndexFromURL
*/
// get from Cache stored index and itterate over it
// to find matching ones
var
gadget_list
=
[];
$
.
each
(
RenderJs
.
GadgetCatalog
.
getGadgetIndexUrlList
(),
function
(
index
,
url
)
{
// get repos from cache
var
cached_repo
=
RenderJs
.
Cache
.
get
(
url
);
$
.
each
(
cached_repo
.
gadget_list
,
function
(
index
,
gadget
)
{
if
(
$
.
inArray
(
service
,
gadget
.
service_list
)
>
-
1
)
{
// gadget provides a service, add to list
gadget_list
.
push
(
gadget
);
}
}
);
});
return
gadget_list
;
},
registerServiceList
:
function
(
gadget
,
service_list
)
{
/*
* Register a service provided by a gadget.
*/
}
};
}()),
properties
:
{
/*
* RenderJs accessible property object
*/
},
InteractionGadget
:
(
function
()
{
/*
* Basic gadget interaction gadget implementation.
*/
return
{
init
:
function
(
force
)
{
/*
* Inspect DOM and initialize this gadget
*/
var
dom_list
,
gadget_id
;
if
(
force
===
1
)
{
// we explicitly want to re-init elements even if already this is done before
dom_list
=
$
(
"
div[data-gadget-connection]
"
);
}
else
{
// XXX: improve and save 'bound' on javascript representation of a gadget not DOM
dom_list
=
$
(
"
div[data-gadget-connection]
"
)
.
filter
(
function
()
{
return
$
(
this
).
data
(
"
bound
"
)
!==
true
;
})
.
data
(
'
bound
'
,
true
);
}
dom_list
.
each
(
function
(
index
,
element
)
{
RenderJs
.
InteractionGadget
.
bind
(
$
(
element
));});
},
bind
:
function
(
gadget_dom
)
{
/*
* Bind event between gadgets.
*/
var
gadget_id
,
gadget_connection_list
,
createMethodInteraction
=
function
(
original_source_method_id
,
source_gadget_id
,
source_method_id
,
destination_gadget_id
,
destination_method_id
)
{
var
interaction
=
function
()
{
// execute source method
RenderJs
.
GadgetIndex
.
getGadgetById
(
source_gadget_id
)[
original_source_method_id
].
apply
(
null
,
arguments
);
// call trigger so bind can be asynchronously called
RenderJs
.
GadgetIndex
.
getGadgetById
(
destination_gadget_id
).
dom
.
trigger
(
source_method_id
);
};
return
interaction
;
},
createTriggerInteraction
=
function
(
destination_gadget_id
,
destination_method_id
)
{
var
interaction
=
function
()
{
RenderJs
.
GadgetIndex
.
getGadgetById
(
destination_gadget_id
)[
destination_method_id
].
apply
(
null
,
arguments
);
};
return
interaction
;
};
gadget_id
=
gadget_dom
.
attr
(
"
id
"
);
gadget_connection_list
=
gadget_dom
.
attr
(
"
data-gadget-connection
"
);
gadget_connection_list
=
$
.
parseJSON
(
gadget_connection_list
);
$
.
each
(
gadget_connection_list
,
function
(
key
,
value
)
{
var
source
,
source_gadget_id
,
source_method_id
,
source_gadget
,
destination
,
destination_gadget_id
,
destination_method_id
,
destination_gadget
,
original_source_method_id
;
source
=
value
.
source
.
split
(
"
.
"
);
source_gadget_id
=
source
[
0
];
source_method_id
=
source
[
1
];
source_gadget
=
RenderJs
.
GadgetIndex
.
getGadgetById
(
source_gadget_id
);
destination
=
value
.
destination
.
split
(
"
.
"
);
destination_gadget_id
=
destination
[
0
];
destination_method_id
=
destination
[
1
];
destination_gadget
=
RenderJs
.
GadgetIndex
.
getGadgetById
(
destination_gadget_id
);
if
(
source_gadget
.
hasOwnProperty
(
source_method_id
))
{
// direct javascript use case
original_source_method_id
=
"
original_
"
+
source_method_id
;
source_gadget
[
original_source_method_id
]
=
source_gadget
[
source_method_id
];
source_gadget
[
source_method_id
]
=
createMethodInteraction
(
original_source_method_id
,
source_gadget_id
,
source_method_id
,
destination_gadget_id
,
destination_method_id
);
// we use html custom events for asyncronous method call so
// bind destination_gadget to respective event
destination_gadget
.
dom
.
bind
(
source_method_id
,
createTriggerInteraction
(
destination_gadget_id
,
destination_method_id
)
);
}
else
{
// this is a custom event attached to HTML gadget
// representation
source_gadget
.
dom
.
bind
(
source_method_id
,
createTriggerInteraction
(
destination_gadget_id
,
destination_method_id
)
);
}
});
}
};
}()),
RouteGadget
:
(
function
()
{
/*
* A gadget that defines possible routes (i.e. URL changes) between gadgets.
*/
var
route_list
=
[];
return
{
init
:
function
()
{
/*
* Inspect DOM and initialize this gadget
*/
$
(
"
div[data-gadget-route]
"
).
each
(
function
(
index
,
element
)
{
RenderJs
.
RouteGadget
.
route
(
$
(
element
));
});
},
route
:
function
(
gadget_dom
)
{
/*
* Create routes between gadgets.
*/
var
body
=
$
(
"
body
"
),
handler_func
,
priority
,
gadget_route_list
=
gadget_dom
.
attr
(
"
data-gadget-route
"
);
gadget_route_list
=
$
.
parseJSON
(
gadget_route_list
);
$
.
each
(
gadget_route_list
,
function
(
key
,
gadget_route
)
{
handler_func
=
function
()
{
var
gadget_id
=
gadget_route
.
destination
.
split
(
'
.
'
)[
0
],
method_id
=
gadget_route
.
destination
.
split
(
'
.
'
)[
1
],
gadget
=
RenderJs
.
GadgetIndex
.
getGadgetById
(
gadget_id
);
// set gadget value so getSelfGadget can work
setSelfGadget
(
gadget
);
gadget
[
method_id
].
apply
(
null
,
arguments
);
// reset as no longer needed
setSelfGadget
(
undefined
);
};
// add route itself
priority
=
gadget_route
.
priority
;
if
(
priority
===
undefined
)
{
// default is 1 -i.e.first level
priority
=
1
;
}
RenderJs
.
RouteGadget
.
add
(
gadget_route
.
source
,
handler_func
,
priority
);
});
},
add
:
function
(
path
,
handler_func
,
priority
)
{
/*
* Add a route between path (hashable) and a handler function (part of Gadget's API).
*/
var
body
=
$
(
"
body
"
);
body
.
route
(
"
add
"
,
path
,
1
)
.
done
(
handler_func
);
// save locally
route_list
.
push
({
"
path
"
:
path
,
"
handler_func
"
:
handler_func
,
"
priority
"
:
priority
});
},
go
:
function
(
path
,
handler_func
,
priority
)
{
/*
* Go a route.
*/
var
body
=
$
(
"
body
"
);
body
.
route
(
"
go
"
,
path
,
priority
)
.
fail
(
handler_func
);
},
remove
:
function
(
path
)
{
/*
* Remove a route.
*/
// XXX: implement remove a route when route.js supports it
},
getRouteList
:
function
()
{
/*
* Get list of all router
*/
return
route_list
;
}
};
}())
};
}());
p/index.html
View file @
4f62489e
...
...
@@ -15,7 +15,6 @@
<div
id=
"index_header"
data-gadget=
"../gadgets/header.html"
data-gadget-property=
'{"self": {"h1": ["data-i18n", "pages.titles.main"]}, "translator": {"a.setIcon": ["href", "#popup_index_lang"], "div.all_popups": ["id","popup_index_lang"]}}'
></div>
<div
data-role=
"content"
>
<div
id=
"index_wrapper"
data-gadget=
"../gadgets/index_wrapper.html"
></div>
<div
data-gadget=
""
class=
"main-interactor"
data-gadget-connection=
"[{"source": "index_header.translate", "destination": "index_wrapper.translate"}]"
></div>
</div>
</div>
</body>
...
...
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