1318 |
alexandre_ |
1 |
/*
|
|
|
2 |
Copyright (c) 2004-2006, The Dojo Foundation
|
|
|
3 |
All Rights Reserved.
|
|
|
4 |
|
|
|
5 |
Licensed under the Academic Free License version 2.1 or above OR the
|
|
|
6 |
modified BSD license. For more information on Dojo licensing, see:
|
|
|
7 |
|
|
|
8 |
http://dojotoolkit.org/community/licensing.shtml
|
|
|
9 |
*/
|
|
|
10 |
|
1422 |
alexandre_ |
11 |
|
|
|
12 |
|
1318 |
alexandre_ |
13 |
dojo.provide("dojo.widget.Show");
|
|
|
14 |
dojo.require("dojo.widget.*");
|
|
|
15 |
dojo.require("dojo.widget.HtmlWidget");
|
|
|
16 |
dojo.require("dojo.uri.Uri");
|
|
|
17 |
dojo.require("dojo.event.*");
|
|
|
18 |
dojo.require("dojo.lfx.*");
|
|
|
19 |
dojo.require("dojo.math.curves");
|
|
|
20 |
dojo.require("dojo.lang.common");
|
|
|
21 |
dojo.require("dojo.lang.func");
|
|
|
22 |
dojo.widget.defineWidget("dojo.widget.Show", dojo.widget.HtmlWidget, function () {
|
|
|
23 |
this._slides = [];
|
|
|
24 |
}, {isContainer:true, _slide:-1, body:null, nav:null, hider:null, select:null, option:null, inNav:false, debugPane:null, noClick:false, templateString:"<div class=\"dojoShow\">\n\t<div dojoAttachPoint=\"contentNode\"></div>\n\t<div class=\"dojoShowNav\" dojoAttachPoint=\"nav\">\n\t\t<div class=\"dojoShowHider\" dojoAttachPoint=\"hider\"></div>\n\t\t<span unselectable=\"on\" style=\"cursor: default;\" dojoAttachEvent=\"onClick:previousSlide\"><</span>\n\t\t<select dojoAttachEvent=\"onClick:gotoSlideByEvent\" dojoAttachPoint=\"select\">\n\t\t\t<option dojoAttachPoint=\"option\">Title</option>\n\t\t</select>\n\t\t<span unselectable=\"on\" style=\"cursor: default;\" dojoAttachEvent=\"onClick:nextSlide\">></span>\n\t</div>\n</div>\n", templateCssString:"@media screen {\n\thtml, body {\n\t\tmargin: 0px;\n\t\tpadding: 0px;\n\t\twidth: 100%;\n\t}\n\th1 {\n\t\tfont-size: 50px;\n\t}\n\tp, li {\n\t\tfont-size: 30px;\n\t}\n\t.dojoShowNav {\n\t\tbackground: #369;\n\t\toverflow: hidden;\n\t\tposition: absolute;\n\t\theight: 5px;\n\t\tbottom: 0px;\n\t\tleft: 0px;\n\t\twidth: 100%;\n\t\ttext-align: center;\n\t}\n\t.dojoShowNav input {\n\t\tmargin: 0px;\n\t}\n\t.dojoShowHider {\n\t\theight: 5px;\n\t\toverflow: hidden;\n\t\twidth: 100%;\n\t}\n\t.dojoShowPrint {\n\t\tposition: absolute;\n\t\tleft: 5px;\n\t\ttop: 0px;\n\t}\n\t.dojoShow {\n\t\tdisplay: none;\n\t}\n}\n@media print {\n\t.dojoShow {\n\t\tdisplay: none !important;\n\t}\n\t.dojoShowPrint {\n\t\tdisplay: block !important;\n\t}\n\t.dojoShowPrintSlide {\n\t\tborder: 1px solid #aaa;\n\t\tpadding: 10px;\n\t\tmargin-bottom: 15px;\n\t}\n\t.dojoShowPrintSlide, ul {\n\tpage-break-inside: avoid;\n\t}\n\th1 {\n\t\tmargin-top: 0;\n\t\tpage-break-after: avoid;\n\t}\n}\n", templateCssPath:dojo.uri.moduleUri("dojo.widget", "templates/Show.css"), fillInTemplate:function (args, frag) {
|
|
|
25 |
if (args.debugPane) {
|
|
|
26 |
var dp = this.debugPane = dojo.widget.byId(args.debugPane);
|
|
|
27 |
dp.hide();
|
|
|
28 |
dojo.event.connect(dp, "closeWindow", dojo.lang.hitch(this, function () {
|
|
|
29 |
this.debugPane = false;
|
|
|
30 |
}));
|
|
|
31 |
}
|
|
|
32 |
var source = this.getFragNodeRef(frag);
|
|
|
33 |
this.sourceNode = dojo.body().appendChild(source.cloneNode(true));
|
|
|
34 |
for (var i = 0, child; child = this.sourceNode.childNodes[i]; i++) {
|
|
|
35 |
if (child.tagName && child.getAttribute("dojotype").toLowerCase() == "showslide") {
|
|
|
36 |
child.className = "dojoShowPrintSlide";
|
|
|
37 |
child.innerHTML = "<h1>" + child.title + "</h1>" + child.innerHTML;
|
|
|
38 |
}
|
|
|
39 |
}
|
|
|
40 |
this.sourceNode.className = "dojoShowPrint";
|
|
|
41 |
this.sourceNode.style.display = "none";
|
|
|
42 |
dojo.event.connect(document, "onclick", this, "gotoSlideByEvent");
|
|
|
43 |
if (dojo.render.html.ie) {
|
|
|
44 |
dojo.event.connect(document, "onkeydown", this, "gotoSlideByEvent");
|
|
|
45 |
} else {
|
|
|
46 |
dojo.event.connect(document, "onkeypress", this, "gotoSlideByEvent");
|
|
|
47 |
}
|
|
|
48 |
dojo.event.connect(window, "onresize", this, "resizeWindow");
|
|
|
49 |
dojo.event.connect(this.nav, "onmousemove", this, "popUpNav");
|
|
|
50 |
}, postCreate:function () {
|
|
|
51 |
this._slides = [];
|
|
|
52 |
for (var i = 0, child; child = this.children[i]; i++) {
|
|
|
53 |
if (child.widgetType == "ShowSlide") {
|
|
|
54 |
this._slides.push(child);
|
|
|
55 |
this.option.text = child.title + " (" + (i + 1) + ")";
|
|
|
56 |
this.option.parentNode.insertBefore(this.option.cloneNode(true), this.option);
|
|
|
57 |
}
|
|
|
58 |
}
|
|
|
59 |
this.option.parentNode.removeChild(this.option);
|
|
|
60 |
this.domNode.style.display = "block";
|
|
|
61 |
this.resizeWindow();
|
|
|
62 |
this.gotoSlide(0, true);
|
|
|
63 |
dojo.addOnLoad(dojo.lang.hitch(this, function () {
|
|
|
64 |
var th = window.location.hash;
|
|
|
65 |
if (th.length) {
|
|
|
66 |
var parts = ("" + window.location).split(this.widgetId + "_SlideNo_");
|
|
|
67 |
if (parts.length > 1) {
|
|
|
68 |
setTimeout(dojo.lang.hitch(this, function () {
|
|
|
69 |
this.gotoSlide(parseInt(parts[1]), true);
|
|
|
70 |
}), 300);
|
|
|
71 |
}
|
|
|
72 |
}
|
|
|
73 |
}));
|
|
|
74 |
}, gotoSlide:function (slide, preventSetHash) {
|
|
|
75 |
if (slide == this._slide) {
|
|
|
76 |
return;
|
|
|
77 |
}
|
|
|
78 |
if (!this._slides[slide]) {
|
|
|
79 |
for (var i = 0, child; child = this._slides[i]; i++) {
|
|
|
80 |
if (child.title == slide) {
|
|
|
81 |
slide = i;
|
|
|
82 |
break;
|
|
|
83 |
}
|
|
|
84 |
}
|
|
|
85 |
}
|
|
|
86 |
if (!this._slides[slide]) {
|
|
|
87 |
return;
|
|
|
88 |
}
|
|
|
89 |
if (this.debugPane) {
|
|
|
90 |
if (this._slides[slide].debug) {
|
|
|
91 |
this.debugPane.show();
|
|
|
92 |
} else {
|
|
|
93 |
this.debugPane.hide();
|
|
|
94 |
}
|
|
|
95 |
}
|
|
|
96 |
if (this._slide != -1) {
|
|
|
97 |
while (this._slides[this._slide].previousAction()) {
|
|
|
98 |
}
|
|
|
99 |
}
|
|
|
100 |
if (!preventSetHash) {
|
|
|
101 |
window.location.href = "#" + this.widgetId + "_SlideNo_" + slide;
|
|
|
102 |
}
|
|
|
103 |
if (this._slides[this._slide]) {
|
|
|
104 |
this._slides[this._slide].hide();
|
|
|
105 |
}
|
|
|
106 |
this._slide = slide;
|
|
|
107 |
this.select.selectedIndex = slide;
|
|
|
108 |
var cn = this.contentNode;
|
|
|
109 |
while (cn.firstChild) {
|
|
|
110 |
cn.removeChild(cn.firstChild);
|
|
|
111 |
}
|
|
|
112 |
cn.appendChild(this._slides[slide].domNode);
|
|
|
113 |
this._slides[slide].show();
|
|
|
114 |
}, gotoSlideByEvent:function (event) {
|
|
|
115 |
var node = event.target;
|
|
|
116 |
var type = event.type;
|
|
|
117 |
if (type == "click") {
|
|
|
118 |
if (node.tagName == "OPTION" && node.parentNode == this.select) {
|
|
|
119 |
this.gotoSlide(node.index);
|
|
|
120 |
} else {
|
|
|
121 |
if (node == this.select) {
|
|
|
122 |
this.gotoSlide(node.selectedIndex);
|
|
|
123 |
} else {
|
|
|
124 |
this.nextSlide(event);
|
|
|
125 |
}
|
|
|
126 |
}
|
|
|
127 |
} else {
|
|
|
128 |
if (type == "keydown" || type == "keypress") {
|
|
|
129 |
var key = event.keyCode;
|
|
|
130 |
var ch = event.charCode;
|
|
|
131 |
if (key == 63234 || key == 37) {
|
|
|
132 |
this.previousSlide(event);
|
|
|
133 |
} else {
|
|
|
134 |
if (key == 63235 || key == 39 || ch == 32) {
|
|
|
135 |
this.nextSlide(event);
|
|
|
136 |
}
|
|
|
137 |
}
|
|
|
138 |
}
|
|
|
139 |
}
|
|
|
140 |
}, nextSlide:function (event) {
|
|
|
141 |
if (!this.stopEvent(event)) {
|
|
|
142 |
return false;
|
|
|
143 |
}
|
|
|
144 |
if (!this._slides[this._slide].nextAction(event)) {
|
|
|
145 |
if ((this._slide + 1) != this._slides.length) {
|
|
|
146 |
this.gotoSlide(this._slide + 1);
|
|
|
147 |
return true;
|
|
|
148 |
}
|
|
|
149 |
return false;
|
|
|
150 |
}
|
|
|
151 |
}, previousSlide:function (event) {
|
|
|
152 |
if (!this.stopEvent(event)) {
|
|
|
153 |
return false;
|
|
|
154 |
}
|
|
|
155 |
if (!this._slides[this._slide].previousAction(event)) {
|
|
|
156 |
if ((this._slide - 1) != -1) {
|
|
|
157 |
this.gotoSlide(this._slide - 1);
|
|
|
158 |
return true;
|
|
|
159 |
}
|
|
|
160 |
return false;
|
|
|
161 |
}
|
|
|
162 |
}, stopEvent:function (ev) {
|
|
|
163 |
if (!ev) {
|
|
|
164 |
return true;
|
|
|
165 |
}
|
|
|
166 |
if (ev.type == "click" && (this._slides[this._slide].noClick || this.noClick)) {
|
|
|
167 |
return false;
|
|
|
168 |
}
|
|
|
169 |
var target = ev.target;
|
|
|
170 |
while (target != null) {
|
|
|
171 |
if (target == this.domNode) {
|
|
|
172 |
target = ev.target;
|
|
|
173 |
break;
|
|
|
174 |
}
|
|
|
175 |
target = target.parentNode;
|
|
|
176 |
}
|
|
|
177 |
if (!dojo.dom.isDescendantOf(target, this.nav)) {
|
|
|
178 |
while (target && target != this.domNode) {
|
|
|
179 |
if (target.tagName == "A" || target.tagName == "INPUT" || target.tagName == "TEXTAREA" || target.tagName == "SELECT") {
|
|
|
180 |
return false;
|
|
|
181 |
}
|
|
|
182 |
if (typeof target.onclick == "function" || typeof target.onkeypress == "function") {
|
|
|
183 |
return false;
|
|
|
184 |
}
|
|
|
185 |
target = target.parentNode;
|
|
|
186 |
}
|
|
|
187 |
}
|
|
|
188 |
if (window.event) {
|
|
|
189 |
ev.returnValue = false;
|
|
|
190 |
ev.cancelBubble = true;
|
|
|
191 |
} else {
|
|
|
192 |
ev.preventDefault();
|
|
|
193 |
ev.stopPropagation();
|
|
|
194 |
}
|
|
|
195 |
return true;
|
|
|
196 |
}, popUpNav:function () {
|
|
|
197 |
if (!this.inNav) {
|
|
|
198 |
dojo.lfx.propertyAnimation(this.nav, {"height":{start:5, end:30}}, 250).play();
|
|
|
199 |
}
|
|
|
200 |
clearTimeout(this.inNav);
|
|
|
201 |
this.inNav = setTimeout(dojo.lang.hitch(this, "hideNav"), 2000);
|
|
|
202 |
}, hideNav:function () {
|
|
|
203 |
clearTimeout(this.inNav);
|
|
|
204 |
this.inNav = false;
|
|
|
205 |
dojo.lfx.propertyAnimation(this.nav, {"height":{start:30, end:5}}, 250).play();
|
|
|
206 |
}, resizeWindow:function (ev) {
|
|
|
207 |
dojo.body().style.height = "auto";
|
|
|
208 |
var h = Math.max(document.documentElement.scrollHeight || dojo.body().scrollHeight, dojo.html.getViewport().height);
|
|
|
209 |
dojo.body().style.height = h + "px";
|
|
|
210 |
}});
|
|
|
211 |
|