1 |
// -------------------------------------------------------------------------- |
2 |
/// IWF - Interactive Website Framework. Javascript library for creating |
3 |
/// responsive thin client interfaces. |
4 |
/// |
5 |
/// Copyright (C) 2005 Brock Weaver brockweaver@users.sourceforge.net |
6 |
/// |
7 |
/// This library is free software; you can redistribute it and/or modify |
8 |
/// it under the terms of the GNU Lesser General Public License as published |
9 |
/// by the Free Software Foundation; either version 2.1 of the License, or |
10 |
/// (at your option) any later version. |
11 |
/// |
12 |
/// This library is distributed in the hope that it will be useful, but |
13 |
/// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY |
14 |
/// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public |
15 |
/// License for more details. |
16 |
/// |
17 |
/// You should have received a copy of the GNU Lesser General Public License |
18 |
/// along with this library; if not, write to the Free Software Foundation, |
19 |
/// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
20 |
/// |
21 |
/// Brock Weaver |
22 |
/// brockweaver@users.sourceforge.net |
23 |
/// 1605 NW Maple Pl |
24 |
/// Ankeny, IA 50021 |
25 |
/// |
26 |
//! http://iwf.sourceforge.net/ |
27 |
// -------------------------------------------------------------------------- |
28 |
//! NOTE: To minimize file size, strip all fluffy comments (except the LGPL, of course!) |
29 |
//! using the following regex (global flag and multiline on): |
30 |
//! ^\t*//([^/!].*|$) |
31 |
// |
32 |
// This reduces file size by about 30%, give or take. |
33 |
// |
34 |
//! To rip out only logging statements (commented or uncommented): |
35 |
//! ^/{0,2}iwfLog.* |
36 |
// -------------------------------------------------------------------------- |
37 |
|
38 |
// -------------------------------------------------------------------------- |
39 |
//! iwfgui.js |
40 |
// |
41 |
// GUI inspection and manipulation functions |
42 |
// |
43 |
//! Dependencies: |
44 |
//! iwfcore.js |
45 |
// |
46 |
//! Brock Weaver - brockweaver@users.sourceforge.net |
47 |
//! v 0.2 - 2005-11-14 |
48 |
//! core bug patch |
49 |
// -------------------------------------------------------------------------- |
50 |
//! v 0.1 - 2005-06-05 |
51 |
//! Initial release. |
52 |
// -------------------------------------------------------------------------- |
53 |
// Issues: |
54 |
// Timeouts have hiccups sometimes when they begin to overlap |
55 |
// Not tested on Safari -- I need a Mac! |
56 |
// _iwfMoveTo() has some calculation problems with certain motionType values |
57 |
// -------------------------------------------------------------------------- |
58 |
|
59 |
// ----------------------------------- |
60 |
// Dependency Check |
61 |
if (!window.iwfGetById){ |
62 |
iwfLog("IWF Dependency Error: you must set a reference to the iwfcore.js file *before* iwfgui.js! I.E.:\n\n<script type='text/javascript' src='iwfcore.js'></script>\n<script type='text/javascript' src='iwfgui.js'></script>", true); |
63 |
} |
64 |
// ----------------------------------- |
65 |
|
66 |
|
67 |
|
68 |
// ----------------------------------- |
69 |
// Begin: Visibility |
70 |
// ----------------------------------- |
71 |
|
72 |
function iwfShow(id, reserveSpace){ |
73 |
var el = iwfGetById(id); |
74 |
if (reserveSpace){ |
75 |
if (iwfExists(el) && iwfExists(el.style) && iwfExists(el.style.visibility)) el.style.visibility = 'visible'; |
76 |
} else { |
77 |
if (iwfExists(el) && iwfExists(el.style) && iwfExists(el.style.display)) el.style.display = 'inline'; |
78 |
} |
79 |
} |
80 |
|
81 |
function iwfHide(id, reserveSpace){ |
82 |
var el = iwfGetById(id); |
83 |
if (reserveSpace){ |
84 |
if (el && iwfExists(el.style) && iwfExists(el.style.visibility)) el.style.visibility = 'hidden'; |
85 |
} else { |
86 |
if (el && iwfExists(el.style) && iwfExists(el.style.display)) el.style.display = 'none'; |
87 |
} |
88 |
} |
89 |
|
90 |
function iwfHideDelay(id, ms, reserveSpace){ |
91 |
var el = iwfGetById(id); |
92 |
if (!el) return; |
93 |
|
94 |
// wipeout any other re-visibling timeouts we have (nice spelling, eh?) |
95 |
_iwfClearTimeout(el, "hidedelay", "visible", true); |
96 |
|
97 |
if (ms < 1){ |
98 |
iwfHide(el, reserveSpace); |
99 |
} else { |
100 |
_iwfSetTimeout(el, "hidedelay", "visible", "iwfHideDelay('" + el.id + "', 0, " + reserveSpace + ")", ms); |
101 |
} |
102 |
} |
103 |
|
104 |
function iwfShowDelay(id, ms, reserveSpace){ |
105 |
var el = iwfGetById(id); |
106 |
if (!el) return; |
107 |
|
108 |
// wipeout any other re-visibling timeouts we have (nice spelling, eh?) |
109 |
_iwfClearTimeout(el, "showdelay", "visible", true); |
110 |
|
111 |
if (ms < 1){ |
112 |
iwfShow(el, reserveSpace); |
113 |
} else { |
114 |
_iwfSetTimeout(el, "showdelay", "visible", "iwfShowDelay('" + el.id + "', 0, " + reserveSpace + ")", ms); |
115 |
} |
116 |
} |
117 |
|
118 |
function iwfShowGently(id, pct, reserveSpace){ |
119 |
|
120 |
var el = iwfGetById(id); |
121 |
if (!el) return; |
122 |
|
123 |
// wipeout any other re-visibling timeouts we have (nice spelling, eh?) |
124 |
_iwfClearTimeout(el, "showgently", "visible", true); |
125 |
|
126 |
var opacity = iwfOpacity(el); |
127 |
if (iwfIsHidden(el)){ |
128 |
// set opacity to 0 |
129 |
iwfOpacity(el, 0, false, false); |
130 |
|
131 |
// show it |
132 |
iwfShow(el, reserveSpace); |
133 |
} |
134 |
|
135 |
// adjust opacity up by the given percentage |
136 |
opacity = iwfOpacity(el, pct, true); |
137 |
|
138 |
if (opacity < 100) { |
139 |
// set a timeout |
140 |
_iwfSetTimeout(el, "showgently", "visible", "iwfShowGently('" + el.id + "'," + pct + ", " + reserveSpace + ")", 50); |
141 |
} |
142 |
} |
143 |
|
144 |
function iwfHideGently(id, pct, reserveSpace){ |
145 |
var el = iwfGetById(id); |
146 |
if (!el) return; |
147 |
|
148 |
if (iwfIsHidden(el)) return; |
149 |
|
150 |
// wipeout any other re-visibling timeouts we have (nice spelling, eh?) |
151 |
_iwfClearTimeout(el, "hidegently", "visible", true); |
152 |
|
153 |
var opacity = iwfOpacity(el); |
154 |
if (opacity <= 0){ |
155 |
|
156 |
// hide it |
157 |
iwfHide(el, reserveSpace); |
158 |
|
159 |
// set opacity back to fully opaque, so when they iwfShow() it, |
160 |
// the element isn't fully transparent and looks like iwfShow() didn't work |
161 |
iwfOpacity(el, 100, false, true); |
162 |
|
163 |
|
164 |
} else { |
165 |
// make it less opaque... |
166 |
iwfOpacity(el, -pct, true); |
167 |
|
168 |
// set our timeout |
169 |
_iwfSetTimeout(el, "hidegently", "visible", "iwfHideGently('" + el.id + "'," + pct + ", " + reserveSpace + ")", 50); |
170 |
} |
171 |
} |
172 |
|
173 |
function iwfHideGentlyDelay(id, pct, ms, reserveSpace){ |
174 |
var el = iwfGetById(id); |
175 |
if (!el) return; |
176 |
|
177 |
if (iwfIsHidden(el)) return; |
178 |
|
179 |
// wipeout any other re-visibling timeouts we have (nice spelling, eh?) |
180 |
_iwfClearTimeout(el, "hidegentlydelay", "visible", true); |
181 |
|
182 |
|
183 |
if (ms < 1){ |
184 |
iwfHideGently(el, pct, reserveSpace); |
185 |
} else { |
186 |
_iwfSetTimeout(el, "hidegentlydelay", "visible", "iwfHideGentlyDelay('" + el.id + "'," + pct + ", 0, " + reserveSpace + ")", ms); |
187 |
} |
188 |
|
189 |
} |
190 |
|
191 |
function iwfShowGentlyDelay(id, pct, ms, reserveSpace){ |
192 |
var el = iwfGetById(id); |
193 |
if (!el) return; |
194 |
|
195 |
|
196 |
// wipeout any other re-visibling timeouts we have (nice spelling, eh?) |
197 |
_iwfClearTimeout(el, "showgentlydelay", "visible", true); |
198 |
|
199 |
if (ms < 1){ |
200 |
iwfShowGently(el, pct, reserveSpace); |
201 |
} else { |
202 |
_iwfSetTimeout(el, "showgentlydelay", "visible", "iwfShowGentlyDelay('" + el.id + "'," + pct + ", 0, " + reserveSpace + ")", ms); |
203 |
} |
204 |
} |
205 |
|
206 |
function iwfOpacity(id, pct, relative, keepHiddenIfAlreadyHidden){ |
207 |
var el = iwfGetById(id); |
208 |
if (el){ |
209 |
if (iwfExists(pct) && pct != null){ |
210 |
// set opacity |
211 |
var newPct = iwfToFloat(pct, true); |
212 |
if (relative){ |
213 |
// lookup current opacity |
214 |
newPct = iwfOpacity(id, null, false); |
215 |
|
216 |
// modify pct by that much |
217 |
newPct += pct; |
218 |
} |
219 |
|
220 |
if (newPct < 0){ |
221 |
newPct = 0; |
222 |
} else if (newPct > 100){ |
223 |
newPct = 100; |
224 |
} |
225 |
|
226 |
if (iwfExists(el.style.opacity)) el.style.opacity = newPct/100; |
227 |
else if (iwfExists(el.style.filter)) el.style.filter = "alpha(opacity=" + newPct + ")"; |
228 |
else if (iwfExists(el.style.mozOpacity)) el.style.mozOpacity = newPct/100; |
229 |
|
230 |
// also display it if opacity > 0 and !keepHidden |
231 |
if (newPct > 0 && !keepHiddenIfAlreadyHidden){ |
232 |
if (iwfIsHidden(id)){ |
233 |
iwfShow(id); |
234 |
} |
235 |
} |
236 |
|
237 |
return newPct; |
238 |
|
239 |
} else { |
240 |
// get current opacity |
241 |
var val = null; |
242 |
if (iwfExists(el.style.opacity)){ |
243 |
if (el.style.opacity == ''){ |
244 |
val = 100; |
245 |
} else { |
246 |
val = iwfToFloat(el.style.opacity, 2, true) * 100; |
247 |
} |
248 |
} else if (iwfExists(el.style.filter)) { |
249 |
if (el.style.filter){ |
250 |
if (el.style.filter.indexOf("opacity") == 0){ |
251 |
val = 100; |
252 |
} else { |
253 |
val = iwfToFloat(el.style.filter, 2, true); |
254 |
} |
255 |
} else { |
256 |
val = 100; |
257 |
} |
258 |
} else if (iwfExists(el.style.mozOpacity)) { |
259 |
if (el.style.mozOpacity == ''){ |
260 |
val = 100; |
261 |
} else { |
262 |
val = iwfToFloat(el.style.mozOpacity, 2, true) * 100; |
263 |
} |
264 |
} |
265 |
|
266 |
return val; |
267 |
} |
268 |
} |
269 |
} |
270 |
|
271 |
function iwfIsShown(id){ |
272 |
return !iwfIsHidden(id); |
273 |
} |
274 |
|
275 |
function iwfIsHidden(id){ |
276 |
var el = iwfGetById(id); |
277 |
// if (!el) return false; |
278 |
|
279 |
var hidden = false; |
280 |
if (iwfExists(el.style) && iwfExists(el.style.visibility)) { |
281 |
hidden = el.style.visibility == 'hidden'; |
282 |
} |
283 |
if (iwfExists(el.style) && iwfExists(el.style.display)) { |
284 |
hidden = hidden || el.style.display == 'none'; |
285 |
} |
286 |
return hidden; |
287 |
} |
288 |
|
289 |
function iwfToggle(id, reserveSpace){ |
290 |
if (iwfIsHidden(id)) iwfShow(id, reserveSpace); |
291 |
else iwfHide(id, reserveSpace); |
292 |
} |
293 |
|
294 |
|
295 |
|
296 |
// ----------------------------------- |
297 |
// End: Visibility |
298 |
// ----------------------------------- |
299 |
|
300 |
// ----------------------------------- |
301 |
// Begin: Timers |
302 |
// ----------------------------------- |
303 |
|
304 |
function _iwfSetTimeout(id, name, category, fn, ms){ |
305 |
var el = iwfGetById(id); |
306 |
if (!el) return; |
307 |
|
308 |
var att = iwfAttribute(el, 'iwfTimeoutCategory' + category); |
309 |
if (!att){ |
310 |
// that attribute doesn't exist yet, or is null |
311 |
} else if (att != name){ |
312 |
// attribute exists but doesn't match our name. |
313 |
// clear out the existing one, since the category matches. |
314 |
_iwfClearTimeout(el.id, att, category); |
315 |
} else { |
316 |
// attribute matches our name. |
317 |
} |
318 |
|
319 |
iwfAttribute(el, 'iwfTimeoutCategory' + category, name); |
320 |
//iwfLog('setting timeout for ' + name + ' to ' + fn); |
321 |
var timeoutid = setTimeout(fn, ms); |
322 |
iwfAttribute(el, 'iwfTimeoutId' + category, timeoutid); |
323 |
return true; |
324 |
} |
325 |
|
326 |
function _iwfCheckTimeout(id, name, category){ |
327 |
//return true; |
328 |
|
329 |
var el = iwfGetById(id); |
330 |
if (!el) return false; |
331 |
|
332 |
var att = iwfAttribute(el, 'iwfTimeoutCategory' + category); |
333 |
if (!att || att == name){ |
334 |
return true; |
335 |
} else { |
336 |
return false; |
337 |
} |
338 |
|
339 |
} |
340 |
|
341 |
function _iwfClearTimeout(id, name, category, forceful){ |
342 |
var el = iwfGetById(id); |
343 |
if (!el) return; |
344 |
|
345 |
var att = iwfAttribute(el, 'iwfTimeoutCategory' + category); |
346 |
|
347 |
if (att == name || forceful){ |
348 |
// iwfLog('clearing timeout for ' + att); |
349 |
clearTimeout(iwfAttribute(el, 'iwfTimeoutId' + category)); |
350 |
iwfRemoveAttribute(el, 'iwfTimeoutId' + category); |
351 |
iwfRemoveAttribute(el, 'iwfTimeoutCategory' + category); |
352 |
} |
353 |
|
354 |
} |
355 |
|
356 |
function iwfDelay(ms, fpOrString){ |
357 |
// note this inner function creates a closure... |
358 |
function _iwfDelayExpired(){ |
359 |
if (localIsString){ |
360 |
// passed a string. eval it. |
361 |
//iwfLog("_iwfDelayExpired: calling string of:\n" + localFpOrString, true); |
362 |
eval(localFpOrString); |
363 |
} else { |
364 |
// they passed a function pointer. |
365 |
// call it, passing any args we were given. |
366 |
if (!localArgs || localArgs.length == 0){ |
367 |
localFpOrString(); |
368 |
} else if (localArgs.length == 1){ |
369 |
localFpOrString(localArgs[0]); |
370 |
} else { |
371 |
var s = 'localFpOrString('; |
372 |
for(var i=0;i<localArgs.length;i++){ |
373 |
if (i > 0){ |
374 |
s += ', '; |
375 |
} |
376 |
if(localArgs[i] == null){ |
377 |
s += 'null'; |
378 |
} else if(iwfIsString(localArgs[i])){ |
379 |
s += '"' + localArgs[i].replace(/"/gi, '\\"') + '"'; |
380 |
} else { |
381 |
s += localArgs[i]; |
382 |
} |
383 |
} |
384 |
s += ')'; |
385 |
//iwfLog("_iwfDelayExpired: calling fp of:\n" + s, true); |
386 |
eval(s); |
387 |
} |
388 |
} |
389 |
delete localFpOrString; |
390 |
delete localIsString; |
391 |
delete localArgs; |
392 |
} |
393 |
|
394 |
var localFpOrString = fpOrString; |
395 |
var localIsString = iwfIsString(fpOrString); |
396 |
var localArgs = null; |
397 |
|
398 |
if (!iwfIsString(fpOrString)){ |
399 |
if (arguments && arguments.length > 0){ |
400 |
localArgs = new Array(); |
401 |
for(var i=2;i<arguments.length;i++){ |
402 |
//iwfLog('args[' + i + '] = ' + arguments[i], true); |
403 |
localArgs.push(arguments[i]); |
404 |
} |
405 |
} |
406 |
} |
407 |
setTimeout(_iwfDelayExpired, ms); |
408 |
} |
409 |
|
410 |
// ----------------------------------- |
411 |
// End: Timers |
412 |
// ----------------------------------- |
413 |
|
414 |
|
415 |
// ----------------------------------- |
416 |
// Begin: Positioning |
417 |
// ----------------------------------- |
418 |
|
419 |
function iwfX1(id, newx){ |
420 |
return iwfX(id, newx); |
421 |
} |
422 |
|
423 |
|
424 |
function iwfFocusSelect(id, promptmsg){ |
425 |
var el = iwfGetById(id); |
426 |
if (promptmsg){ |
427 |
alert(promptmsg); |
428 |
} |
429 |
if (!iwfIsHidden(id)){ |
430 |
try { |
431 |
el.focus(); |
432 |
el.select(); |
433 |
} catch(e) { } |
434 |
} |
435 |
return false; |
436 |
} |
437 |
|
438 |
function iwfFocus(id, promptmsg){ |
439 |
var el = iwfGetById(id); |
440 |
if (promptmsg){ |
441 |
alert(promptmsg); |
442 |
} |
443 |
if (!iwfIsHidden(id)){ |
444 |
try { |
445 |
el.focus(); |
446 |
} catch(e) { } |
447 |
} |
448 |
return false; |
449 |
} |
450 |
|
451 |
|
452 |
|
453 |
function iwfX(id, newx){ |
454 |
var absx = 0; |
455 |
|
456 |
if (iwfIsNumber(newx)) { |
457 |
absx = iwfSetX(id, newx); |
458 |
} else { |
459 |
var el = iwfGetById(id); |
460 |
if (!el) return 0; |
461 |
if (iwfIsString(el.style.left) && el.style.left.length > 0){ |
462 |
absx = iwfToInt(el.style.left, true); |
463 |
if (isNaN(absx)) { |
464 |
absx = 0; |
465 |
} |
466 |
} else if (iwfExists(el.style.pixelLeft) && el.style.pixelLeft) { |
467 |
absx = el.style.pixelLeft; |
468 |
} else { |
469 |
while (el) { |
470 |
if (iwfExists(el.offsetLeft)) absx += el.offsetLeft; |
471 |
el = iwfGetParent(el, true); |
472 |
} |
473 |
} |
474 |
} |
475 |
|
476 |
return absx; |
477 |
} |
478 |
|
479 |
function iwfSetX(id, newx){ |
480 |
var el = iwfGetById(id); |
481 |
if (!el) return; |
482 |
if(iwfExists(el.style) && iwfIsString(el.style.left)) { |
483 |
el.style.left = newx + 'px'; |
484 |
} |
485 |
else if(iwfExists(el.style) && iwfExists(el.style.pixelLeft)) { |
486 |
el.style.pixelLeft = newx; |
487 |
} |
488 |
else if(iwfExists(el.left)) { |
489 |
el.left = newx; |
490 |
} |
491 |
return newx; |
492 |
} |
493 |
|
494 |
function iwfY1(id, newy){ |
495 |
var el = iwfGetById(id); |
496 |
return iwfY(el, newy); |
497 |
} |
498 |
|
499 |
function iwfY(id, newy){ |
500 |
var absy = 0; |
501 |
|
502 |
if (iwfIsNumber(newy)) { |
503 |
absy = iwfSetY(id, newy); |
504 |
} else { |
505 |
var el = iwfGetById(id); |
506 |
if (!el) return 0; |
507 |
|
508 |
if (iwfIsString(el.style.top) && el.style.top.length > 0){ |
509 |
absy = iwfToInt(el.style.top, true); |
510 |
if (isNaN(absy)) { |
511 |
absy = 0; |
512 |
} |
513 |
} else if (iwfExists(el.style.pixelTop) && el.style.pixelTop) { |
514 |
absy = el.style.pixelTop; |
515 |
} else { |
516 |
while (el) { |
517 |
if (iwfExists(el.offsetTop)) absy += el.offsetTop; |
518 |
el = iwfGetParent(el, true); |
519 |
} |
520 |
} |
521 |
} |
522 |
|
523 |
return absy; |
524 |
} |
525 |
|
526 |
function iwfSetY(id, newy){ |
527 |
var el = iwfGetById(id); |
528 |
if (!el) return; |
529 |
if (iwfExists(el.style)){ |
530 |
if (iwfIsString(el.style.top)) { |
531 |
el.style.top = newy + 'px'; |
532 |
} else if(iwfExists(el.style.pixelTop)) { |
533 |
el.style.pixelTop = newy; |
534 |
} else if(iwfExists(el.top)) { |
535 |
el.top = newy; |
536 |
} |
537 |
} |
538 |
return newy; |
539 |
} |
540 |
|
541 |
function iwfZIndex(id, z){ |
542 |
var el = iwfGetById(id); |
543 |
if (!el) return 0; |
544 |
|
545 |
if (iwfExists(el)){ |
546 |
if (iwfExists(z)){ |
547 |
el.style.zIndex = z; |
548 |
} |
549 |
return iwfToInt(el.style.zIndex, true); |
550 |
} |
551 |
return 0; |
552 |
} |
553 |
|
554 |
function iwfMoveTo(id1, xDest, yDest, totalTicks, motionType){ |
555 |
|
556 |
var el = iwfGetById(id1); |
557 |
|
558 |
if (el){ |
559 |
var origX = iwfX1(el); |
560 |
var origY = iwfY1(el); |
561 |
|
562 |
// wipeout any other repositioning timeouts we have... |
563 |
_iwfClearTimeout(el, "moveto", "position", true); |
564 |
|
565 |
// move any elements we have docked to us |
566 |
_iwfMoveDockedItems(el, xDest, yDest, totalTicks, motionType); |
567 |
|
568 |
if (!totalTicks){ |
569 |
// do it immediately. |
570 |
iwfX1(id1, xDest); |
571 |
iwfY1(id1, yDest); |
572 |
} else { |
573 |
// animate the movement |
574 |
_iwfMoveTo(id1, origX, origY, xDest, yDest, totalTicks, totalTicks, motionType); |
575 |
} |
576 |
} |
577 |
|
578 |
} |
579 |
|
580 |
function _iwfMoveDockedItems(id, xDest, yDest, totalTicks, motionType){ |
581 |
var elMaster = iwfGetById(id); |
582 |
if (elMaster){ |
583 |
var dockers = iwfAttribute(elMaster, 'iwfDockers'); |
584 |
//iwfLog("Dockers for " + iwfAttribute(elMaster, 'id') + ":\n" + dockers, true); |
585 |
if (dockers && dockers.length > 0){ |
586 |
// there is one or more items docked to us |
587 |
// tell them to move with us! |
588 |
dockers = dockers.split(","); |
589 |
for(var i=0;i<dockers.length;i++){ |
590 |
var elSlave = iwfGetById(dockers[i]); |
591 |
if (elSlave){ |
592 |
//iwfLog("found element '" + dockers[i] + "' which is docked to element " + iwfAttribute(elMaster, 'id'), true); |
593 |
var xOffset = iwfX(elMaster) - iwfX(elSlave); |
594 |
var yOffset = iwfY(elMaster) - iwfY(elSlave); |
595 |
var xEnd = xDest - xOffset; |
596 |
var yEnd = yDest - yOffset; |
597 |
iwfMoveTo(elSlave, xEnd, yEnd, totalTicks, motionType); |
598 |
} |
599 |
} |
600 |
} |
601 |
} |
602 |
} |
603 |
|
604 |
function _iwfMoveTo(id1, xOrig, yOrig, xDest, yDest, ticksLeft, totalTicks, motionType){ |
605 |
//iwfLog("_iwfMoveTo(" + id1 + ", " + xOrig + ", " + yOrig + ", " + xDest + ", " + yDest + ", " + ticksLeft + ", " + totalTicks + ", '" + motionType + "')"); |
606 |
var el = iwfGetById(id1); |
607 |
if (!el){ |
608 |
//iwfLog("could not locate el with id of " + id1); |
609 |
} else { |
610 |
el_id = iwfAttribute(el, 'id'); |
611 |
|
612 |
_iwfClearTimeout(el, "moveto", "position", true); |
613 |
|
614 |
|
615 |
var elX = iwfX1(el); |
616 |
var elY = iwfY1(el); |
617 |
|
618 |
//! hack for floating point anomolies -- stops animation when element is "close enough" |
619 |
var epsilon = 0.001; |
620 |
|
621 |
var xDone = false; |
622 |
if (elX > xDest){ |
623 |
if (xDest + epsilon > elX){ |
624 |
xDone = true; |
625 |
} |
626 |
} else { |
627 |
if (xDest - epsilon < elX){ |
628 |
xDone = true; |
629 |
} |
630 |
} |
631 |
|
632 |
var yDone = false; |
633 |
if (elY > yDest){ |
634 |
if (yDest + epsilon > elY){ |
635 |
yDone = true; |
636 |
} |
637 |
} else { |
638 |
if (yDest - epsilon < elY){ |
639 |
yDone = true; |
640 |
} |
641 |
} |
642 |
|
643 |
if (ticksLeft <= 0 || (xDone && yDone)){ |
644 |
//! time is up / motion is "close enough" |
645 |
//iwfLog("_iwfMoveTo time is up / motion is done."); |
646 |
iwfX1(el, xDest); |
647 |
iwfY1(el, yDest); |
648 |
|
649 |
} else { |
650 |
|
651 |
var pctLeft = ticksLeft / totalTicks; |
652 |
|
653 |
var xTotal = xDest - xOrig; |
654 |
var yTotal = yDest - yOrig; |
655 |
|
656 |
var xCur, yCur, rt; |
657 |
|
658 |
switch(motionType){ |
659 |
case 'd': |
660 |
case 'dec': |
661 |
default: |
662 |
rt = pctLeft * pctLeft * pctLeft * pctLeft * pctLeft * pctLeft; |
663 |
xCur = xOrig + (xTotal - (rt * xTotal)); |
664 |
yCur = yOrig + (yTotal - (rt * yTotal)); |
665 |
break; |
666 |
case 'a': |
667 |
case 'acc': |
668 |
pctLeft = 1 - pctLeft; |
669 |
rt = pctLeft * pctLeft * pctLeft * pctLeft; |
670 |
xCur = xOrig + (rt * xTotal); |
671 |
yCur = yOrig + (rt * yTotal); |
672 |
break; |
673 |
case 'b': |
674 |
case 'both': |
675 |
if (pctDone > 0.75){ |
676 |
// over 3/4 done -- decelerate |
677 |
rt = pctLeft * pctLeft * pctLeft * pctLeft; |
678 |
xCur = xOrig + (xTotal - (rt * xTotal)); |
679 |
yCur = yOrig + (yTotal - (rt * yTotal)); |
680 |
|
681 |
} else if (pctDone < 0.25){ |
682 |
// not 1/4 done yet -- accelerate |
683 |
pctLeft = 1 - pctLeft; |
684 |
rt = pctLeft * pctLeft * pctLeft * pctLeft; // * pctDone * pctDone; |
685 |
xCur = xOrig + (rt * xTotal); |
686 |
yCur = yOrig + (rt * yTotal); |
687 |
|
688 |
} else { |
689 |
// between 1/4 and 3/5 done -- linear |
690 |
xCur = xOrig + (pctLeft * xTotal); |
691 |
yCur = yOrig + (pctLeft * yTotal); |
692 |
} |
693 |
break; |
694 |
case 'lin': |
695 |
case 'linear': |
696 |
case 'l': |
697 |
// use linear motion |
698 |
xCur = xOrig + (pctLeft * xTotal); |
699 |
yCur = yOrig + (pctLeft * yTotal); |
700 |
break; |
701 |
} |
702 |
|
703 |
iwfX1(el, xCur); |
704 |
iwfY1(el, yCur); |
705 |
|
706 |
|
707 |
ticksLeft--; |
708 |
|
709 |
var fn = "_iwfMoveTo('" + el_id + "', " + xOrig + ", " + yOrig + ", " + xDest + ", " + yDest + ", " + ticksLeft + ", " + totalTicks + ", '" + motionType + "')"; |
710 |
//iwfLog("timeout set to call: " + fn); |
711 |
_iwfSetTimeout(el, "moveto", "position", fn, 50); |
712 |
} |
713 |
} |
714 |
} |
715 |
|
716 |
function iwfUnDockFrom(id1, id2){ |
717 |
var elSlave = iwfGetById(id1); |
718 |
|
719 |
if (elSlave){ |
720 |
var slaveId = iwfAttribute(elSlave, 'id'); |
721 |
// determine who elSlave is docked to |
722 |
var dockedTo = iwfAttribute(elSlave, 'iwfDockedTo'); |
723 |
if (dockedTo){ |
724 |
// elSlave says he's docked to the guy with id of dockedTo. |
725 |
// grab that guy. |
726 |
var elMaster = iwfGetById(dockedTo); |
727 |
//iwfLog("dockedTo:" + iwfAttribute(elMaster, 'id'), true); |
728 |
if (elMaster){ |
729 |
// elMaster is the guy elSlave is docked to. |
730 |
// tell elMaster to remove elSlave from his docker list |
731 |
|
732 |
var dockers = iwfAttribute(elMaster, 'iwfDockers'); |
733 |
//iwfLog("undocking items from " + iwfAttribute(elMaster, 'id') + ":\n" + dockers, true); |
734 |
if (dockers && dockers.length > 0){ |
735 |
var arrDockers = dockers.split(","); |
736 |
if (arrDockers.length == 0){ |
737 |
arrDockers.push(dockers); |
738 |
} |
739 |
//iwfLog('arrDockers=' + arrDockers + '\nlength=' + arrDockers.length, true); |
740 |
for(var i=0;i<arrDockers.length;i++){ |
741 |
//iwfLog("undocking is checking " + arrDockers[i] + " against " + slaveId, true); |
742 |
if (arrDockers[i] == slaveId){ |
743 |
// undock elSlave from elMaster |
744 |
arrDockers.splice(i, 1); |
745 |
|
746 |
var output = arrDockers.join(","); |
747 |
//iwfLog("writing iwfDockers=" + output); |
748 |
|
749 |
// write this back to elMaster |
750 |
iwfAttribute(elMaster, 'iwfDockers', output); |
751 |
break; |
752 |
} |
753 |
} |
754 |
} |
755 |
} |
756 |
// tell elSlave he's no longer docked to elMaster. |
757 |
iwfAttribute(elSlave, 'iwfDockedTo', null); |
758 |
} |
759 |
} |
760 |
} |
761 |
|
762 |
function iwfAlignTo(id1, id2, anchor1, anchor2, totalTicks, motionType){ |
763 |
var elMover = iwfGetById(id1); |
764 |
var elStays = iwfGetById(id2); |
765 |
|
766 |
if (elMover && elStays){ |
767 |
|
768 |
var newX = iwfX(elStays); |
769 |
var newY = iwfY(elStays); |
770 |
|
771 |
var anc = ((anchor1 +' ').substr(0,2) + (anchor2 + ' ').substr(0,2)).toLowerCase(); |
772 |
iwfLog("anchor encoding: " + anc); |
773 |
if (anc.charAt(0) == 'b'){ |
774 |
newY -= iwfHeight(elMover); |
775 |
} else if (anc.charAt(0) == 'c'){ |
776 |
newY -= iwfHeight(elMover) / 2; |
777 |
} |
778 |
|
779 |
var moverWidth; |
780 |
var staysWidth; |
781 |
if (anc.charAt(1) == 'r'){ |
782 |
moverWidth = iwfWidth(elMover); |
783 |
newX -= moverWidth; |
784 |
} else if (anc.charAt(1) == 'c'){ |
785 |
moverWidth = iwfWidth(elMover); |
786 |
newX -= moverWidth / 2; |
787 |
} |
788 |
if (anc.charAt(2) == 'b'){ |
789 |
newY += iwfHeight(elStays); |
790 |
} else if (anc.charAt(2) == 'c'){ |
791 |
newY += iwfHeight(elStays) / 2; |
792 |
} |
793 |
if (anc.charAt(3) == 'r'){ |
794 |
staysWidth = iwfWidth(elStays); |
795 |
newX += staysWidth; |
796 |
} else if (anc.charAt(3) == 'c'){ |
797 |
staysWidth = iwfWidth(elStays); |
798 |
newX += staysWidth / 2; |
799 |
} |
800 |
|
801 |
iwfLog(iwfAttribute(elMover, 'id') + ' width:' + moverWidth + '\n' + iwfAttribute(elStays, 'id') + ' width:' + staysWidth); |
802 |
|
803 |
// move to those alignment points |
804 |
iwfMoveTo(elMover, newX, newY, totalTicks, totalTicks, motionType); |
805 |
} |
806 |
} |
807 |
|
808 |
function iwfDockTo(id1, id2, anchor1, anchor2, totalTicks, motionType){ |
809 |
var elSlave = iwfGetById(id1); |
810 |
var elMaster = iwfGetById(id2); |
811 |
|
812 |
if (elSlave && elMaster){ |
813 |
|
814 |
// dock elSlave to elMaster... |
815 |
|
816 |
// pull all items currently docked to elMaster |
817 |
var dockers = iwfAttribute(elMaster,'iwfDockers'); |
818 |
// append elSlave to that list |
819 |
if(!dockers){ |
820 |
dockers = iwfAttribute(elSlave, 'id'); |
821 |
} else { |
822 |
var arrDockers = dockers.split(","); |
823 |
if (arrDockers.length == 0){ |
824 |
arrDockers = new Array(dockers); |
825 |
} |
826 |
|
827 |
var slaveId = iwfAttribute(elSlave, 'id'); |
828 |
var found = false; |
829 |
for(var i=0;i<arrDockers.length;i++){ |
830 |
if (arrDockers[i] == slaveId){ |
831 |
found = true; |
832 |
} |
833 |
} |
834 |
if (!found){ |
835 |
// elSlave is not in elMaster's list of dockers yet. add him. |
836 |
dockers += "," + iwfAttribute(elSlave, 'id'); |
837 |
} |
838 |
} |
839 |
|
840 |
// write list back to elMaster |
841 |
iwfAttribute(elMaster, 'iwfDockers', dockers); |
842 |
|
843 |
// have elSlave remember who he's docked to |
844 |
iwfAttribute(elSlave, 'iwfDockedTo', iwfAttribute(elMaster, 'id')); |
845 |
|
846 |
|
847 |
//iwfLog("dockers for " + iwfAttribute(elMaster, 'id') + " = " + dockers, true); |
848 |
|
849 |
|
850 |
iwfAlignTo(elSlave, elMaster, anchor1, anchor2, totalTicks, motionType); |
851 |
|
852 |
} |
853 |
|
854 |
|
855 |
} |
856 |
|
857 |
function iwfXScroll(id) { |
858 |
var scrollx=0; |
859 |
var el = iwfGetById(id); |
860 |
if (!el){ |
861 |
if(document.documentElement && document.documentElement.scrollLeft) scrollx=document.documentElement.scrollLeft; |
862 |
else if(document.body && iwfExists(document.body.scrollLeft)) scrollx=document.body.scrollLeft; |
863 |
} else { |
864 |
if (iwfIsNumber(el.scrollLeft)) scrollx = el.scrollLeft; |
865 |
} |
866 |
return scrollx; |
867 |
} |
868 |
function iwfYScroll(id) { |
869 |
var scrolly=0; |
870 |
var el = iwfGetById(id); |
871 |
if (!el){ |
872 |
if(document.documentElement && document.documentElement.scrollTop) scrolly=document.documentElement.scrollTop; |
873 |
else if(document.body && iwfExists(document.body.scrollTop)) scrolly=document.body.scrollTop; |
874 |
} else { |
875 |
if (iwfIsNumber(el.scrollTop)) scrolly = el.scrollTop; |
876 |
} |
877 |
return scrolly; |
878 |
} |
879 |
|
880 |
|
881 |
|
882 |
// ----------------------------------- |
883 |
// End: Positioning |
884 |
// ----------------------------------- |
885 |
|
886 |
// ----------------------------------- |
887 |
// Begin: Size |
888 |
// ----------------------------------- |
889 |
|
890 |
function iwfClientHeight(){ |
891 |
var vHeight = 0; |
892 |
if(document.compatMode == 'CSS1Compat' && document.documentElement && document.documentElement.clientHeight) { |
893 |
vHeight = document.documentElement.clientHeight; |
894 |
} else if(document.body && document.body.clientHeight) { |
895 |
vHeight = document.body.clientHeight; |
896 |
} else if(iwfExists(window.innerWidth,window.innerHeight,document.width)) { |
897 |
vHeight = window.innerHeight; |
898 |
if(document.width>window.innerWidth) { |
899 |
vHeight -= 16; |
900 |
} |
901 |
} |
902 |
return vHeight; |
903 |
} |
904 |
|
905 |
function iwfClientWidth(){ |
906 |
var vWidth = 0; |
907 |
if(document.compatMode == 'CSS1Compat' && document.documentElement && document.documentElement.clientWidth) { |
908 |
vWidth = document.documentElement.clientWidth; |
909 |
} else if(document.body && document.body.clientWidth) { |
910 |
vWidth = document.body.clientWidth; |
911 |
} else if(iwfExists(window.innerWidth,window.innerHeight,document.height)) { |
912 |
vWidth = window.innerWidth; |
913 |
if(document.height>window.innerHeight) { |
914 |
vWidth -= 16; |
915 |
} |
916 |
} |
917 |
return vWidth; |
918 |
} |
919 |
|
920 |
function iwfWidth(id, neww){ |
921 |
|
922 |
|
923 |
|
924 |
var el = iwfGetById(id); |
925 |
if (!el) return 0; |
926 |
var w = 0; |
927 |
if (iwfExists(el)){ |
928 |
if (iwfExists(el.style)){ |
929 |
if (iwfExists(el.offsetWidth) && iwfIsString(el.style.width)){ |
930 |
if (neww) iwfDetermineWidth(el, neww); |
931 |
w = el.offsetWidth; |
932 |
} else if (iwfExists(el.style.pixelWidth)) { |
933 |
if(neww) el.style.pixelWidth = neww; |
934 |
w = el.style.pixelWidth; |
935 |
} else { |
936 |
w = -1; |
937 |
} |
938 |
} else if (iwfExists(el.clip) && iwfExists(el.clip.right)) { |
939 |
if(newh) e.clip.right = neww; |
940 |
w = el.clip.right; |
941 |
} else { |
942 |
w = -2; |
943 |
} |
944 |
|
945 |
//iwfLog('width of ' + iwfAttribute(el, 'id') + ' = ' + w, true); |
946 |
|
947 |
} |
948 |
|
949 |
return w; |
950 |
|
951 |
|
952 |
|
953 |
} |
954 |
|
955 |
function iwfHeight(id, newh){ |
956 |
var el = iwfGetById(id); |
957 |
if (!el) return 0; |
958 |
var h = 0; |
959 |
if (iwfExists(el)){ |
960 |
if (iwfExists(el.style)){ |
961 |
if (iwfExists(el.offsetHeight) && iwfIsString(el.style.height)){ |
962 |
if (newh) iwfDetermineHeight(el, newh); |
963 |
h = el.offsetHeight; |
964 |
} else if (iwfExists(el.style.pixelHeight)) { |
965 |
if(newh) el.style.pixelHeight = newh; |
966 |
h = el.style.pixelHeight; |
967 |
} else { |
968 |
h = -1; |
969 |
} |
970 |
} else if (iwfExists(el.clip) && iwfExists(el.clip.bottom)) { |
971 |
if(newh) e.clip.bottom = newh; |
972 |
h = el.clip.bottom; |
973 |
} else { |
974 |
h = -2; |
975 |
} |
976 |
} |
977 |
return h; |
978 |
} |
979 |
|
980 |
function iwfY2(id, y2){ |
981 |
var el = iwfGetById(id); |
982 |
if (iwfExists(el)) { |
983 |
var y1 = iwfY(el); |
984 |
if (iwfExists(y2)){ |
985 |
iwfHeight(el, y2 - y1); |
986 |
} |
987 |
return y1 + iwfHeight(el); |
988 |
} |
989 |
return 0; |
990 |
} |
991 |
|
992 |
function iwfX2(id, x2){ |
993 |
var el = iwfGetById(id); |
994 |
if (iwfExists(el)) { |
995 |
var x1 = iwfX(el); |
996 |
if (iwfExists(x2)){ |
997 |
iwfWidth(el, x2 - x1); |
998 |
} |
999 |
return x1 + iwfWidth(el); |
1000 |
} |
1001 |
return 0; |
1002 |
} |
1003 |
|
1004 |
function iwfDetermineStyle(el,prop){ |
1005 |
return parseInt(document.defaultView.getComputedStyle(el,'').getPropertyValue(prop),10); |
1006 |
} |
1007 |
function iwfDetermineWidth(el,neww){ |
1008 |
var padl=0, padr=0, bdrl=0, bdrr=0; |
1009 |
if (iwfExists(document.defaultView) && iwfExists(document.defaultView.getComputedStyle)){ |
1010 |
padl = iwfDetermineStyle(el,'padding-left'); |
1011 |
padr = iwfDetermineStyle(el,'padding-right'); |
1012 |
bdrl = iwfDetermineStyle(el,'border-left-width'); |
1013 |
bdrr = iwfDetermineStyle(el,'border-right-width'); |
1014 |
|
1015 |
} else if(iwfExists(el.currentStyle,document.compatMode)){ |
1016 |
if(document.compatMode=='CSS1Compat'){ |
1017 |
padl = iwfToInt(el.currentStyle.paddingLeft, true); |
1018 |
padr = iwfToInt(el.currentStyle.paddingRight, true); |
1019 |
bdrl = iwfToInt(el.currentStyle.borderLeftWidth, true); |
1020 |
bdrr = iwfToInt(el.currentStyle.borderRightWidth, true); |
1021 |
} |
1022 |
} else if(iwfExists(el.offsetWidth,el.style.width)){ |
1023 |
el.style.width = neww + 'px'; |
1024 |
padl=el.offsetWidth - neww; |
1025 |
} |
1026 |
|
1027 |
if(isNaN(padl)) padl=0; |
1028 |
if(isNaN(padr)) padr=0; |
1029 |
if(isNaN(bdrl)) bdrl=0; |
1030 |
if(isNaN(bdrr)) bdrr=0; |
1031 |
|
1032 |
var w2 = neww - padl - padr - bdrl - bdrr; |
1033 |
if (isNaN(w2) || w2 < 0) return; |
1034 |
else el.style.width = w2 + 'px'; |
1035 |
} |
1036 |
|
1037 |
function iwfDetermineHeight(el,newh){ |
1038 |
var padt=0, padb=0, bdrt=0, bdrb=0; |
1039 |
if(iwfExists(document.defaultView) && iwfExists(document.defaultView.getComputedStyle)){ |
1040 |
padt = iwfDetermineStyle(el,'padding-top'); |
1041 |
padb = iwfDetermineStyle(el,'padding-bottom'); |
1042 |
badt = iwfDetermineStyle(el,'border-top-height'); |
1043 |
badb = iwfDetermineStyle(el,'border-bottom-height'); |
1044 |
} else if(iwfExists(el.currentStyle,document.compatMode)){ |
1045 |
if(document.compatMode=='CSS1Compat'){ |
1046 |
padt = iwfToInt(el.currentStyle.paddingTop, true); |
1047 |
padb = iwfToInt(el.currentStyle.paddingBottom, true); |
1048 |
bdrt = iwfToInt(el.currentStyle.borderTopHeight, true); |
1049 |
bdrb = iwfToInt(el.currentStyle.borderBottomHeight, true); |
1050 |
} |
1051 |
} else if(iwfExists(el.offsetHeight, el.style.height)){ |
1052 |
el.style.height = newh + 'px'; |
1053 |
padt = el.offsetHeight - newh; |
1054 |
} |
1055 |
|
1056 |
if(isNaN(padt)) padt=0; |
1057 |
if(isNaN(padb)) padb=0; |
1058 |
if(isNaN(bdrt)) bdrt=0; |
1059 |
if(isNaN(bdrb)) bdrb=0; |
1060 |
|
1061 |
var h2 = newh - padt - padb - bdrt - bdrb; |
1062 |
|
1063 |
if(isNaN(h2) || h2 < 0) return; |
1064 |
else el.style.height = h2 + 'px'; |
1065 |
} |
1066 |
|
1067 |
function iwfOverlaps(id1, id2) { |
1068 |
var el1 = iwfGetById(id1); |
1069 |
var el2 = iwfGetById(id2); |
1070 |
|
1071 |
if (!el1 || !el2) return false; |
1072 |
|
1073 |
var x1a = iwfX(el1); |
1074 |
var x1b = iwfX2(el1); |
1075 |
var y1a = iwfY(el1); |
1076 |
var y1b = iwfY2(el1); |
1077 |
|
1078 |
var x2a = iwfX(el2); |
1079 |
var x2b = iwfX2(el2); |
1080 |
var y2a = iwfY(el2); |
1081 |
var y2b = iwfY2(el2); |
1082 |
|
1083 |
if(x1a > x2b || x1b < x2a || y1a > y2b || y1b < y2a) { |
1084 |
return false; |
1085 |
} else { |
1086 |
return true; |
1087 |
} |
1088 |
|
1089 |
} |
1090 |
|
1091 |
function iwfXCenter(id) { |
1092 |
var el = iwfGetById(id); |
1093 |
if (!el) return 0; |
1094 |
return iwfX(el) + iwfWidth(el) / 2; |
1095 |
} |
1096 |
|
1097 |
function iwfYCenter(id) { |
1098 |
var el = iwfGetById(id); |
1099 |
if (!el) return 0; |
1100 |
return iwfY(el) + iwfHeight(el) / 2; |
1101 |
} |
1102 |
|
1103 |
// ----------------------------------- |
1104 |
// End: Size |
1105 |
// ----------------------------------- |
1106 |
|
1107 |
// ----------------------------------- |
1108 |
// Begin: Event |
1109 |
// ----------------------------------- |
1110 |
|
1111 |
function iwfAddEvent(id, eventName,callback) { |
1112 |
var el = iwfGetById(id); |
1113 |
if (!el) return; |
1114 |
|
1115 |
var txt = callback; |
1116 |
if (iwfIsString(callback)){ |
1117 |
callback = function() { eval(txt);}; |
1118 |
} |
1119 |
|
1120 |
if (el.addEventListener) { |
1121 |
el.addEventListener(eventName.substr(2), callback, false); |
1122 |
} else if (el.attachEvent) { |
1123 |
//iwfLog('attaching event ' + eventName + ' to element ' + el.id + ' with the callback:\n' + callback, true); |
1124 |
el.attachEvent(eventName, callback); |
1125 |
} else { |
1126 |
iwfLog("Couldn't add event " + eventName + " to element " + el.id + " because neither addEventListener nor attachEvent are implemented.", true); |
1127 |
} |
1128 |
} |
1129 |
|
1130 |
function iwfRemoveEvent(id, eventName, callback){ |
1131 |
var el = iwfGetById(id); |
1132 |
if (!el) return; |
1133 |
if (el.removeEventListener) { |
1134 |
el.removeEventListener(eventName.substr(2), callback, false); |
1135 |
} else if (el.detachEvent) { |
1136 |
el.detachEvent(eventName, callback); |
1137 |
} else { |
1138 |
iwfLog("Couldn't remove event " + eventName + " from element " + el.id + " because neither removeEventListener nor detachEvent are implemented.", true); |
1139 |
} |
1140 |
} |
1141 |
|
1142 |
function iwfCallAttribute(id, eventName, evt){ |
1143 |
var el = iwfGetById(id); |
1144 |
if (!el) return false; |
1145 |
|
1146 |
var val = iwfAttribute(el, eventName); |
1147 |
//iwfLog("calling attribute " + eventName + "=" + val, true); |
1148 |
if (val){ |
1149 |
eval(val); |
1150 |
} |
1151 |
|
1152 |
return; |
1153 |
|
1154 |
|
1155 |
|
1156 |
|
1157 |
if (el.fireEvent){ |
1158 |
iwfLog("firing event " + eventName + " on el " + el.id); |
1159 |
el.fireEvent(eventName, evt); |
1160 |
} else if (el.dispatchEvent){ |
1161 |
// chop off the "on" at the beginning... |
1162 |
// eventName = eventName.substr(2); |
1163 |
// iwfLog(eventName, true); |
1164 |
var newEvent = null; |
1165 |
if (document.createEvent){ |
1166 |
newEvent = document.createEvent("Events"); |
1167 |
} else { |
1168 |
newEvent = document.createEventObject(); |
1169 |
} |
1170 |
newEvent.initEvent(eventName, true, true); //, document.defaultView, 1, 0, 0, 0, 0, false, false, false, false, 0, null); |
1171 |
iwfLog("dispatching event " + eventName + " on el " + el.id); |
1172 |
if (!el.dispatchEvent(newEvent)){ |
1173 |
iwfLog("Could not el.dispatchEvent failed!", true); |
1174 |
} |
1175 |
} else { |
1176 |
iwfLog("Could not el.fireEvent or el.dispatchEvent!", true); |
1177 |
} |
1178 |
} |
1179 |
|
1180 |
function iwfEvent(ev) { |
1181 |
this.keyCode = 0; |
1182 |
this.target = null; |
1183 |
this.type = ''; |
1184 |
this.X = 0; |
1185 |
this.Y = 0; |
1186 |
var evt = ev || window.event; |
1187 |
if(!evt) return; |
1188 |
|
1189 |
if(evt.type) this.type = evt.type; |
1190 |
if(evt.target) this.target = evt.target; |
1191 |
else if(evt.srcElement) this.target = evt.srcElement; |
1192 |
|
1193 |
this.X = iwfX(evt.target); |
1194 |
this.Y = iwfY(evt.target); |
1195 |
|
1196 |
if(iwfExists(evt.clientX,evt.clientY)) { |
1197 |
this.X = evt.clientX + iwfXScroll(); |
1198 |
this.Y = evt.clientY + iwfYScroll(); |
1199 |
} else if (iwfExists(evt.offsetX, evt.offsetY)){ |
1200 |
this.X = evt.offsetX; |
1201 |
this.Y = evt.offsetY; |
1202 |
} |
1203 |
|
1204 |
if (evt.keyCode) { this.keyCode = evt.keyCode; } |
1205 |
else if (iwfExists(evt.which)) { this.keyCode = evt.which; } |
1206 |
|
1207 |
return this; |
1208 |
} |
1209 |
|
1210 |
// ----------------------------------- |
1211 |
// End: Event |
1212 |
// ----------------------------------- |
1213 |
|
1214 |
|
1215 |
// ----------------------------------- |
1216 |
// Begin: Image |
1217 |
// ----------------------------------- |
1218 |
function iwfRollover(id, overurl){ |
1219 |
var el = iwfGetById(id); |
1220 |
if (!el) return; |
1221 |
var rollover = null; |
1222 |
if (overurl){ |
1223 |
rollover = overurl; |
1224 |
} else { |
1225 |
iwfAttribute(el, "rolloversrc"); |
1226 |
} |
1227 |
if (!rollover) return; |
1228 |
el.iwfOrigSrc = el.src; |
1229 |
el.iwfRolloverImg = new Image(); |
1230 |
el.iwfRolloverImg.src = rollover; |
1231 |
iwfAddEvent(el, 'onmouseover', iwfDoRollover); |
1232 |
iwfAddEvent(el, 'onmouseout', iwfDoRollover); |
1233 |
} |
1234 |
|
1235 |
function iwfDoRollover(ev){ |
1236 |
var evt = new iwfEvent(ev); |
1237 |
var el = evt.target; |
1238 |
if (el.src == el.iwfOrigSrc){ |
1239 |
iwfSwapImage(el, el.iwfRolloverImg); |
1240 |
} else { |
1241 |
iwfSwapImage(el, el.iwfOrigSrc); |
1242 |
} |
1243 |
} |
1244 |
|
1245 |
function iwfPreloadImage(id, newimg){ |
1246 |
var el = iwfGetById(id); |
1247 |
if (!el) return; |
1248 |
/* todo: preload images here */ |
1249 |
} |
1250 |
|
1251 |
function iwfSwapImage(id, newimg){ |
1252 |
var el = iwfGetById(id); |
1253 |
if (!el) return; |
1254 |
if (iwfIsString(newimg)){ |
1255 |
el.src = newimg; |
1256 |
} else { |
1257 |
el.src = newimg.src; |
1258 |
} |
1259 |
} |
1260 |
|
1261 |
// preload images and attach event handlers for rollovers |
1262 |
function iwfMapRollovers(){ |
1263 |
var nodes = iwfGetByTagName('img'); |
1264 |
for(var i=0;i<nodes.length;i++){ |
1265 |
iwfRollover(nodes[i]); |
1266 |
} |
1267 |
} |
1268 |
|
1269 |
// ----------------------------------- |
1270 |
// End: Image |
1271 |
// ----------------------------------- |
1272 |
|
1273 |
|
1274 |
// ----------------------------------- |
1275 |
// Begin: Drag-N-Drop |
1276 |
// ----------------------------------- |
1277 |
|
1278 |
var iwfDragger = {el:null, curTarget:null, targets:new Array()}; |
1279 |
var iwfHiZ = 2; |
1280 |
|
1281 |
var iwfResizer = {elSrc:null, elTgt:null}; |
1282 |
|
1283 |
function iwfResize(resizeId, targetId){ |
1284 |
var resizer = iwfGetById(resizeId); |
1285 |
if (!resizer) return; |
1286 |
|
1287 |
var target = iwfGetById(targetId); |
1288 |
if (!target) return; |
1289 |
|
1290 |
iwfResizer.elSrc = resizer; |
1291 |
iwfResizer.elTgt = target; |
1292 |
|
1293 |
|
1294 |
// set the drag start / move / stop |
1295 |
iwfAttribute(resizer, 'iwfdragbegin', 'iwfResizeStart()'); |
1296 |
iwfAttribute(resizer, 'iwfdragmove', 'iwfResizeMove()'); |
1297 |
iwfAttribute(resizer, 'iwfdragend', 'iwfResizeEnd()'); |
1298 |
|
1299 |
iwfDrag(resizer); |
1300 |
|
1301 |
} |
1302 |
|
1303 |
function iwfResizeStart(){ |
1304 |
|
1305 |
} |
1306 |
|
1307 |
function iwfResizeMove(resizeId, targetId){ |
1308 |
// elSrc should have already been moved to its new location. |
1309 |
// make elTgt fit to it. |
1310 |
var tgtX = iwfX(iwfResizer.elTgt); |
1311 |
var tgtY = iwfY(iwfResizer.elTgt); |
1312 |
|
1313 |
var srcX2 = iwfX2(iwfResizer.elSrc); |
1314 |
if (srcX2 - 100 < tgtX){ |
1315 |
srcX2 = tgtX + 100; |
1316 |
} |
1317 |
|
1318 |
var srcY2 = iwfY2(iwfResizer.elSrc); |
1319 |
if (srcY2 - 50 < tgtY){ |
1320 |
srcY2 = tgtY + 50; |
1321 |
} |
1322 |
//iwfLog("srcX2:" + srcX2 + "\tsrcY2:" + srcY2); |
1323 |
// iwfX1(iwfResizer.elSrc, srcX2 - iwfWidth(iwfResizer.elSrc)); |
1324 |
// iwfY1(iwfResizer.elSrc, srcY2 - iwfHeight(iwfResizer.elSrc)); |
1325 |
|
1326 |
// iwfX2(iwfResizer.elTgt, srcX2); |
1327 |
// iwfY2(iwfResizer.elTgt, srcY2); |
1328 |
|
1329 |
// if container exists, make it occupy all but titlebar space... |
1330 |
if (iwfResizer.elTgt){ |
1331 |
var elContainer = iwfGetById(iwfResizer.elTgt.id + 'Container'); |
1332 |
if (elContainer){ |
1333 |
iwfHeight(elContainer, iwfHeight(iwfResizer.elTgt) - iwfHeight(iwfResizer.elTgt.id + 'TitleBar') - 2); |
1334 |
} |
1335 |
} |
1336 |
|
1337 |
|
1338 |
} |
1339 |
|
1340 |
function iwfResizeEnd(){ |
1341 |
|
1342 |
iwfLog(iwfElementToString(iwfResizer.elSrc), true); |
1343 |
|
1344 |
iwfResizer.elSrc = null; |
1345 |
iwfResizer.elTgt = null; |
1346 |
} |
1347 |
|
1348 |
function iwfDrag(id) { |
1349 |
|
1350 |
var el = iwfGetById(id); |
1351 |
if (!el) return; |
1352 |
|
1353 |
//iwfLog(iwfElementToString(el), true); |
1354 |
if (!iwfDragger.el) { |
1355 |
el.iwfDragTarget = true; |
1356 |
iwfAddEvent(el, 'onmousedown', iwfDragMouseDown); |
1357 |
// BROCK: sync issues here in IE when there is no container. |
1358 |
// HACK: force a container always? hmmmm... |
1359 |
// iwfFireEvent(el, 'onmousedown'); |
1360 |
} |
1361 |
} |
1362 |
function iwfDragMouseDown(ev){ |
1363 |
|
1364 |
var evt = new iwfEvent(ev); |
1365 |
var el = evt.target; |
1366 |
while(el && !el.iwfDragTarget) { |
1367 |
el = iwfGetParent(el); |
1368 |
} |
1369 |
if (el) { |
1370 |
|
1371 |
iwfDragger.el = el; |
1372 |
|
1373 |
iwfAddEvent(document, 'onmousemove', iwfDragMouseMove); |
1374 |
iwfAddEvent(document, 'onmouseup', iwfDragMouseUp); |
1375 |
|
1376 |
|
1377 |
|
1378 |
if (ev && ev.preventDefault) ev.preventDefault(); |
1379 |
else if (window.event) window.event.returnValue = false; |
1380 |
else if (iwfExists(ev.cancelBubble)) ev.cancelBubble = true; |
1381 |
|
1382 |
el.iwfDragOrigX = iwfX(el); |
1383 |
el.iwfDragOrigY = iwfY(el); |
1384 |
el.iwfDragOffsetX = evt.X - iwfX(el); |
1385 |
el.iwfDragOffsetY = evt.Y - iwfY(el); |
1386 |
|
1387 |
|
1388 |
iwfZIndex(el, iwfHiZ++); |
1389 |
|
1390 |
iwfCallAttribute(el, 'iwfdragbegin'); |
1391 |
} |
1392 |
} |
1393 |
|
1394 |
function iwfDragMouseMove(ev){ |
1395 |
var evt = new iwfEvent(ev); |
1396 |
|
1397 |
if (iwfDragger.el) { |
1398 |
if (evt && evt.preventDefault) evt.preventDefault(); |
1399 |
else if (window.event) window.event.returnValue = false; |
1400 |
else if (iwfExists(ev.cancelBubble)) ev.cancelBubble = true; |
1401 |
|
1402 |
var el = iwfDragger.el; |
1403 |
|
1404 |
|
1405 |
var newX = evt.X - el.iwfDragOffsetX; |
1406 |
if (newX > iwfClientWidth() - iwfWidth(el)){ |
1407 |
newX = iwfClientWidth() - iwfWidth(el); |
1408 |
} |
1409 |
if (newX < 0) { |
1410 |
newX = 0; |
1411 |
} |
1412 |
|
1413 |
var newY = evt.Y - el.iwfDragOffsetY; |
1414 |
if (newY > iwfClientHeight() - iwfHeight(el)){ |
1415 |
newY = iwfClientHeight() - iwfHeight(el); |
1416 |
} |
1417 |
if (newY < 0) { |
1418 |
newY = 0; |
1419 |
} |
1420 |
|
1421 |
|
1422 |
iwfX(el, newX); |
1423 |
iwfY(el, newY); |
1424 |
|
1425 |
// and hilite any drop targets... |
1426 |
for(var i=0;i<iwfDragger.targets.length;i++){ |
1427 |
if (!iwfDragger.curTarget && iwfOverlaps(iwfDragger.targets[i], iwfDragger.el)) { |
1428 |
iwfDragOver(iwfDragger.targets[i]); |
1429 |
break; |
1430 |
} |
1431 |
} |
1432 |
|
1433 |
iwfCallAttribute(el, 'iwfdragmove'); |
1434 |
|
1435 |
} |
1436 |
} |
1437 |
|
1438 |
function iwfDragMouseUp(ev) { |
1439 |
if (iwfDragger.el) { |
1440 |
if (ev && ev.preventDefault) ev.preventDefault(); |
1441 |
else if (window.event) window.event.returnValue = false; |
1442 |
else if (iwfExists(ev.cancelBubble)) ev.cancelBubble = true; |
1443 |
|
1444 |
var evt = new iwfEvent(ev); |
1445 |
iwfRemoveEvent(document, 'onmousedown', iwfDragMouseDown); |
1446 |
iwfRemoveEvent(document, 'onmousemove', iwfDragMouseMove); |
1447 |
iwfRemoveEvent(document, 'onmouseup', iwfDragMouseUp); |
1448 |
|
1449 |
iwfCallAttribute(iwfDragger.el, 'iwfdragend'); |
1450 |
|
1451 |
iwfDragDrop(); |
1452 |
iwfDragger.el.iwfDragTarget = false; |
1453 |
iwfDragger.el = null; |
1454 |
} |
1455 |
} |
1456 |
|
1457 |
function iwfDragOver(idTarget) { |
1458 |
var tgt = iwfGetById(idTarget); |
1459 |
if (!tgt) return; |
1460 |
|
1461 |
if (!iwfDragger.el) return; |
1462 |
|
1463 |
if (iwfDragger.curTarget) return; |
1464 |
|
1465 |
|
1466 |
iwfDragger.curTarget = tgt.id; |
1467 |
|
1468 |
|
1469 |
tgt.iwfBackgroundColor = tgt.style.backgroundColor; |
1470 |
tgt.style.backgroundColor = '#efefef'; |
1471 |
|
1472 |
iwfDragger.el.iwfBorder = iwfDragger.el.style.border; |
1473 |
iwfDragger.el.style.border = '3px solid blue'; |
1474 |
|
1475 |
} |
1476 |
|
1477 |
function iwfDragOut() { |
1478 |
|
1479 |
var tgt = iwfGetById(iwfDragger.curTarget); |
1480 |
if (!tgt) return; |
1481 |
|
1482 |
iwfDragger.curTarget = null; |
1483 |
|
1484 |
|
1485 |
if (!iwfDragger.el) return; |
1486 |
|
1487 |
|
1488 |
|
1489 |
iwfDragger.el.style.border = iwfDragger.el.iwfBorder; |
1490 |
tgt.style.backgroundColor = tgt.iwfBackgroundColor; |
1491 |
|
1492 |
|
1493 |
} |
1494 |
|
1495 |
function iwfDragDrop() { |
1496 |
|
1497 |
var tgt = iwfGetById(iwfDragger.curTarget); |
1498 |
|
1499 |
iwfDragOut(iwfDragger.curTarget); |
1500 |
|
1501 |
|
1502 |
|
1503 |
if (!iwfDragger.el) return; |
1504 |
|
1505 |
var src = iwfGetById(iwfDragger.el); |
1506 |
|
1507 |
if (src) { |
1508 |
if (!tgt) { |
1509 |
if (iwfDragger.targets.length > 0) { |
1510 |
// targets exist, but none were dropped on. return to original x/y |
1511 |
iwfMoveTo(tgt, iwfAttribute(iwfDragger.el, 'iwfDragOrigX'), iwfAttribute(iwfDragger.el, 'iwfDragOrigY'), 30); |
1512 |
} |
1513 |
} else { |
1514 |
// target found. dock to it. |
1515 |
iwfDockTo(tgt, src, "tl", "tl", 30); |
1516 |
} |
1517 |
} |
1518 |
} |
1519 |
|
1520 |
function iwfMapDropTargets(node) { |
1521 |
|
1522 |
if (!node || !node.childNodes) { |
1523 |
iwfLog('No childNodes found for ' + iwfElementToString(node), true); |
1524 |
return; |
1525 |
} |
1526 |
|
1527 |
for(var i=0; i<node.childNodes.length;i++){ |
1528 |
iwfLog('child=' + iwfElementToString(node.childNodes[i]), true); |
1529 |
if (iwfAttribute(node.childNodes[i], 'iwfDropTarget') == 'true'){ |
1530 |
iwfDragger.targets.push(iwfAttribute(node.childNodes[i], 'id')); |
1531 |
} |
1532 |
iwfMapDropTargets(node.childNodes[i]); |
1533 |
} |
1534 |
|
1535 |
|
1536 |
} |
1537 |
|
1538 |
function iwfMapDraggables(node){ |
1539 |
if (!node) { |
1540 |
iwfLog("when mapping windows, node not found"); |
1541 |
return; |
1542 |
} else if (!node.childNodes){ |
1543 |
iwfLog("No childNodes found for " + iwfElementToString(node.childNodes[i])); |
1544 |
return; |
1545 |
} |
1546 |
|
1547 |
for(var i=0; i<node.childNodes.length;i++){ |
1548 |
if (iwfAttribute(node.childNodes[i], 'iwfDraggable') == 'true'){ |
1549 |
iwfLog("Found draggable to map: " + iwfElementToString(node.childNodes[i])); |
1550 |
iwfMakeDraggable(node.childNodes[i]); |
1551 |
} |
1552 |
} |
1553 |
} |
1554 |
|
1555 |
function iwfMakeDraggable(id){ |
1556 |
var el = iwfGetById(id); |
1557 |
if (!el) return; |
1558 |
|
1559 |
if (iwfAttribute(el, 'iwfDraggableMapped') == 'true'){ |
1560 |
// element has already been mapped for dragging. escape. |
1561 |
return; |
1562 |
} |
1563 |
|
1564 |
// mark it as being mapped as a drag target |
1565 |
iwfAttribute(el, 'iwfDraggableMapped', 'true'); |
1566 |
iwfAttribute(el, 'iwfDragTarget', 'true'); |
1567 |
|
1568 |
// make sure window is absolutely positioned and overflow is okay |
1569 |
el.style.position = 'absolute'; |
1570 |
el.style.overflow = 'hidden'; |
1571 |
el.style.cursor = 'move'; |
1572 |
|
1573 |
iwfAddEvent(el, 'onmousedown', 'iwfDrag("' + el.id + '");'); |
1574 |
|
1575 |
} |
1576 |
|
1577 |
function iwfMapWindows(node){ |
1578 |
if (!node) { |
1579 |
iwfLog("when mapping windows, node not found"); |
1580 |
return; |
1581 |
} else if (!node.childNodes){ |
1582 |
iwfLog("No childNodes found for " + iwfElementToString(node.childNodes[i])); |
1583 |
return; |
1584 |
} |
1585 |
|
1586 |
for(var i=0; i<node.childNodes.length;i++){ |
1587 |
if (iwfAttribute(node.childNodes[i], 'iwfWindow') == 'true'){ |
1588 |
iwfLog("Found window to map: " + iwfElementToString(node.childNodes[i])); |
1589 |
iwfGetOrCreateWindow(node.childNodes[i]); |
1590 |
} |
1591 |
} |
1592 |
} |
1593 |
|
1594 |
function iwfGetOrCreateWindow(id){ |
1595 |
var el = iwfGetById(id); |
1596 |
if (!el) return null; |
1597 |
|
1598 |
if (iwfAttribute(el, 'iwfWindowCreated') == 'true'){ |
1599 |
// window has already been created. escape. |
1600 |
return; |
1601 |
} |
1602 |
|
1603 |
// make sure window is absolutely positioned and overflow is okay |
1604 |
el.style.position = 'absolute'; |
1605 |
el.style.overflow = 'hidden'; |
1606 |
|
1607 |
// create a title bar |
1608 |
var elTitle = iwfGetOrCreateById(el.id + 'TitleBar', 'div'); |
1609 |
if (!elTitle) return; |
1610 |
|
1611 |
elTitle.style.backgroundColor = 'navy'; |
1612 |
elTitle.style.color = 'white'; |
1613 |
elTitle.style.cursor = 'move'; |
1614 |
elTitle.innerHTML = " " + iwfAttribute(el, 'iwfWindowTitle'); |
1615 |
|
1616 |
// dragging title bar should move the window |
1617 |
iwfAddEvent(elTitle, 'onmousedown', 'iwfDrag("' + el.id + '");'); |
1618 |
|
1619 |
|
1620 |
// create the container which will contain all other html specified in the div |
1621 |
var elContainer = iwfGetOrCreateById(el.id + 'Container', 'div'); |
1622 |
if (!elContainer) return; |
1623 |
|
1624 |
elContainer.style.width='100%'; |
1625 |
elContainer.style.height='90%'; |
1626 |
elContainer.style.overflow='scroll'; |
1627 |
|
1628 |
// transfer window contents into the new container |
1629 |
elContainer.innerHTML = el.innerHTML; |
1630 |
// clear the window |
1631 |
el.innerHTML = ''; |
1632 |
|
1633 |
|
1634 |
// create the resizer which will handle resizing |
1635 |
var elResizer = iwfGetOrCreateById(el.id + 'Resizer', 'div'); |
1636 |
if (!elResizer) return; |
1637 |
|
1638 |
|
1639 |
elResizer.innerHTML = "<table border='0' cellspacing='0' cellpadding='0' width='100%' height='3px' ><tr ><td width='95%' style='cursor:s-resize'> </td><td style='cursor:se-resize'> </td></tr></table>"; |
1640 |
// elResizer.innerHTML = '<span style="width:90%;background-color:red;color:white;cursor:s-resize;padding-right:30px;">blah</span><span style="width:20px;color:black;background-color:gray;cursor:se-resize">*</span>'; |
1641 |
|
1642 |
|
1643 |
|
1644 |
// set style properties on resizer |
1645 |
// iwfX(elResizer, iwfX(el) + 20); |
1646 |
// iwfY(elResizer, iwfY(el) + 20); |
1647 |
// iwfZIndex(elResizer, 9999999); |
1648 |
// iwfHeight(elResizer, 15); |
1649 |
// iwfWidth(elResizer, 15); |
1650 |
// elTitle.style.cursor = 'move'; |
1651 |
// elResizer.style.position = 'absolute'; |
1652 |
// elResizer.style.borderStyle = 'solid'; |
1653 |
// elResizer.style.borderColor = 'black'; |
1654 |
// elResizer.style.borderWidth = '1px'; |
1655 |
// elResizer.backgroundColor = 'white'; |
1656 |
// elResizer.style.overflow = 'hidden'; |
1657 |
// elResizer.style.textAlign = 'center'; |
1658 |
// elResizer.style.cursor = 'se-resize'; |
1659 |
// elResizer.innerHTML = '-'; |
1660 |
|
1661 |
// dragging the resizer should resize the window |
1662 |
iwfAddEvent(elResizer, 'onmousedown', 'iwfResize("' + elResizer.id + '","' + el.id + '");'); |
1663 |
|
1664 |
|
1665 |
// add title bar to window |
1666 |
iwfAddChild(el, elTitle, true); |
1667 |
|
1668 |
// add container to window |
1669 |
iwfAddChild(el, elContainer); |
1670 |
|
1671 |
// add resizer to window |
1672 |
iwfAddChild(el, elResizer); |
1673 |
|
1674 |
// iwfX(elResizer, iwfX2(el) - 15); |
1675 |
// iwfY(elResizer, iwfY2(el) - 15); |
1676 |
|
1677 |
iwfLog(iwfElementToString(elResizer),true); |
1678 |
|
1679 |
// align resizer to bottom right of window |
1680 |
iwfResize(elResizer, el); |
1681 |
|
1682 |
|
1683 |
|
1684 |
// add the flag saying we've created the window |
1685 |
iwfAttribute(el, 'iwfWindowCreated', 'true'); |
1686 |
|
1687 |
|
1688 |
} |
1689 |
|
1690 |
// ----------------------------------- |
1691 |
// End: Drag-N-Drop |
1692 |
// ----------------------------------- |
1693 |
|