/[webpac2]/trunk/web/iwf/iwfgui.js
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /trunk/web/iwf/iwfgui.js

Parent Directory Parent Directory | Revision Log Revision Log


Revision 46 - (show annotations)
Mon Nov 14 16:13:17 2005 UTC (18 years, 6 months ago) by dpavlin
File MIME type: text/cpp
File size: 33033 byte(s)
 r8855@llin:  dpavlin | 2005-11-14 01:49:57 +0100
 added small browser using Interactive Website Framework
 from http://iwf.sourceforge.net

1 // -----------------------------------------------------------------------------
2 // IWF - Interactive Website Framework. Javascript library for creating
3 // responsive thin client interfaces.
4 //
5 // Copyright (C) 2005 Brock Weaver brockweaver@gmail.com
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@gmail.com
23 // 1605 NW Maple Pl
24 // Ankeny, IA 50021
25 // -----------------------------------------------------------------------------
26
27 // --------------------------------------------------------------------------
28 // iwfgui.js
29 //
30 // GUI inspection and manipulation functions
31 //
32 // Dependencies:
33 // iwfcore.js
34 //
35 // Brock Weaver - brockweaver@sourceforge.net - iwf.sourceforge.net
36 // v 0.1 - 2005-06-05
37 // Initial release.
38 // --------------------------------------------------------------------------
39 // Issues:
40 // Timeouts have hiccups sometimes when they begin to overlap
41 // Not tested on Safari -- I need an iMac!
42 // _iwfMoveTo() has some calculation problems with certain motionType values
43 // --------------------------------------------------------------------------
44
45 // -----------------------------------
46 // Dependency Check
47 if (!window.iwfGetById){
48 alert("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>");
49 }
50 // -----------------------------------
51
52
53
54 // -----------------------------------
55 // Begin: Visibility
56 // -----------------------------------
57
58 function iwfShow(id, reserveSpace){
59 var el = iwfGetById(id);
60 if (reserveSpace){
61 if (iwfExists(el) && iwfExists(el.style) && iwfExists(el.style.visibility)) el.style.visibility = 'visible';
62 } else {
63 if (iwfExists(el) && iwfExists(el.style) && iwfExists(el.style.display)) el.style.display = 'inline';
64 }
65 }
66
67 function iwfHide(id, reserveSpace){
68 var el = iwfGetById(id);
69 if (reserveSpace){
70 if (el && iwfExists(el.style) && iwfExists(el.style.visibility)) el.style.visibility = 'hidden';
71 } else {
72 if (el && iwfExists(el.style) && iwfExists(el.style.display)) el.style.display = 'none';
73 }
74 }
75
76 function iwfHideDelay(id, ms, reserveSpace){
77 var el = iwfGetById(id);
78 if (!el) return;
79
80 // wipeout any other re-visibling timeouts we have (nice spelling, eh?)
81 _iwfClearTimeout(el, "hidedelay", "visible", true);
82
83 if (ms < 1){
84 iwfHide(el, reserveSpace);
85 } else {
86 _iwfSetTimeout(el, "hidedelay", "visible", "iwfHideDelay('" + el.id + "', 0, " + reserveSpace + ")", ms);
87 }
88 }
89
90 function iwfShowDelay(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, "showdelay", "visible", true);
96
97 if (ms < 1){
98 iwfShow(el, reserveSpace);
99 } else {
100 _iwfSetTimeout(el, "showdelay", "visible", "iwfShowDelay('" + el.id + "', 0, " + reserveSpace + ")", ms);
101 }
102 }
103
104 function iwfShowGently(id, pct, reserveSpace){
105
106 var el = iwfGetById(id);
107 if (!el) return;
108
109 // wipeout any other re-visibling timeouts we have (nice spelling, eh?)
110 _iwfClearTimeout(el, "showgently", "visible", true);
111
112 var opacity = iwfOpacity(el);
113 if (iwfIsHidden(el)){
114 // set opacity to 0
115 iwfOpacity(el, 0, false, false);
116
117 // show it
118 iwfShow(el, reserveSpace);
119 }
120
121 // adjust opacity up by the given percentage
122 opacity = iwfOpacity(el, pct, true);
123
124 if (opacity < 100) {
125 // set a timeout
126 _iwfSetTimeout(el, "showgently", "visible", "iwfShowGently('" + el.id + "'," + pct + ", " + reserveSpace + ")", 50);
127 }
128 }
129
130 function iwfHideGently(id, pct, reserveSpace){
131 var el = iwfGetById(id);
132 if (!el) return;
133
134 if (iwfIsHidden(el)) return;
135
136 // wipeout any other re-visibling timeouts we have (nice spelling, eh?)
137 _iwfClearTimeout(el, "hidegently", "visible", true);
138
139 var opacity = iwfOpacity(el);
140 if (opacity <= 0){
141
142 // hide it
143 iwfHide(el, reserveSpace);
144
145 // set opacity back to fully opaque, so when they iwfShow() it,
146 // the element isn't fully transparent and looks like iwfShow() didn't work
147 iwfOpacity(el, 100, false, true);
148
149
150 } else {
151 // make it less opaque...
152 iwfOpacity(el, -pct, true);
153
154 // set our timeout
155 _iwfSetTimeout(el, "hidegently", "visible", "iwfHideGently('" + el.id + "'," + pct + ", " + reserveSpace + ")", 50);
156 }
157 }
158
159 function iwfHideGentlyDelay(id, pct, ms, reserveSpace){
160 var el = iwfGetById(id);
161 if (!el) return;
162
163 if (iwfIsHidden(el)) return;
164
165 // wipeout any other re-visibling timeouts we have (nice spelling, eh?)
166 _iwfClearTimeout(el, "hidegentlydelay", "visible", true);
167
168
169 if (ms < 1){
170 iwfHideGently(el, pct, reserveSpace);
171 } else {
172 _iwfSetTimeout(el, "hidegentlydelay", "visible", "iwfHideGentlyDelay('" + el.id + "'," + pct + ", 0, " + reserveSpace + ")", ms);
173 }
174
175 }
176
177 function iwfShowGentlyDelay(id, pct, ms, reserveSpace){
178 var el = iwfGetById(id);
179 if (!el) return;
180
181
182 // wipeout any other re-visibling timeouts we have (nice spelling, eh?)
183 _iwfClearTimeout(el, "showgentlydelay", "visible", true);
184
185 if (ms < 1){
186 iwfShowGently(el, pct, reserveSpace);
187 } else {
188 _iwfSetTimeout(el, "showgentlydelay", "visible", "iwfShowGentlyDelay('" + el.id + "'," + pct + ", 0, " + reserveSpace + ")", ms);
189 }
190 }
191
192 function iwfOpacity(id, pct, relative, keepHiddenIfAlreadyHidden){
193 var el = iwfGetById(id);
194 if (el){
195 if (iwfExists(pct) && pct != null){
196 // set opacity
197 var newPct = iwfToFloat(pct, true);
198 if (relative){
199 // lookup current opacity
200 newPct = iwfOpacity(id, null, false);
201
202 // modify pct by that much
203 newPct += pct;
204 }
205
206 if (newPct < 0){
207 newPct = 0;
208 } else if (newPct > 100){
209 newPct = 100;
210 }
211
212 if (iwfExists(el.style.opacity)) el.style.opacity = newPct/100;
213 else if (iwfExists(el.style.filter)) el.style.filter = "alpha(opacity=" + newPct + ")";
214 else if (iwfExists(el.style.mozOpacity)) el.style.mozOpacity = newPct/100;
215
216 // also display it if opacity > 0 and !keepHidden
217 if (newPct > 0 && !keepHiddenIfAlreadyHidden){
218 if (iwfIsHidden(id)){
219 iwfShow(id);
220 }
221 }
222
223 return newPct;
224
225 } else {
226 // get current opacity
227 var val = null;
228 if (iwfExists(el.style.opacity)){
229 if (el.style.opacity == ''){
230 val = 100;
231 } else {
232 val = iwfToFloat(el.style.opacity, 2, true) * 100;
233 }
234 } else if (iwfExists(el.style.filter)) {
235 if (el.style.filter){
236 if (el.style.filter.indexOf("opacity") == 0){
237 val = 100;
238 } else {
239 val = iwfToFloat(el.style.filter, 2, true);
240 }
241 } else {
242 val = 100;
243 }
244 } else if (iwfExists(el.style.mozOpacity)) {
245 if (el.style.mozOpacity == ''){
246 val = 100;
247 } else {
248 val = iwfToFloat(el.style.mozOpacity, 2, true) * 100;
249 }
250 }
251
252 return val;
253 }
254 }
255 }
256
257 function iwfIsShown(id){
258 return !iwfIsHidden(id);
259 }
260
261 function iwfIsHidden(id){
262 var el = iwfGetById(id);
263 // if (!el) return false;
264
265 var hidden = false;
266 if (iwfExists(el.style) && iwfExists(el.style.visibility)) {
267 hidden = el.style.visibility == 'hidden';
268 }
269 if (iwfExists(el.style) && iwfExists(el.style.display)) {
270 hidden = hidden || el.style.display == 'none';
271 }
272 return hidden;
273 }
274
275 function iwfToggle(id, reserveSpace){
276 if (iwfIsHidden(id)) iwfShow(id, reserveSpace);
277 else iwfHide(id, reserveSpace);
278 }
279
280
281
282 // -----------------------------------
283 // End: Visibility
284 // -----------------------------------
285
286 // -----------------------------------
287 // Begin: Timers
288 // -----------------------------------
289
290 function _iwfSetTimeout(id, name, category, fn, ms){
291 var el = iwfGetById(id);
292 if (!el) return;
293
294 var att = iwfAttribute(el, 'iwfTimeoutCategory' + category);
295 if (!att){
296 // that attribute doesn't exist yet, or is null
297 } else if (att != name){
298 // attribute exists but doesn't match our name.
299 // clear out the existing one, since the category matches.
300 _iwfClearTimeout(el.id, att, category);
301 } else {
302 // attribute matches our name.
303 }
304
305 iwfAttribute(el, 'iwfTimeoutCategory' + category, name);
306 //iwfLog('setting timeout for ' + name + ' to ' + fn);
307 var timeoutid = setTimeout(fn, ms);
308 iwfAttribute(el, 'iwfTimeoutId' + category, timeoutid);
309 return true;
310 }
311
312 function _iwfCheckTimeout(id, name, category){
313 //return true;
314
315 var el = iwfGetById(id);
316 if (!el) return false;
317
318 var att = iwfAttribute(el, 'iwfTimeoutCategory' + category);
319 if (!att || att == name){
320 return true;
321 } else {
322 return false;
323 }
324
325 }
326
327 function _iwfClearTimeout(id, name, category, forceful){
328 var el = iwfGetById(id);
329 if (!el) return;
330
331 var att = iwfAttribute(el, 'iwfTimeoutCategory' + category);
332
333 if (att == name || forceful){
334 // iwfLog('clearing timeout for ' + att);
335 clearTimeout(iwfAttribute(el, 'iwfTimeoutId' + category));
336 iwfRemoveAttribute(el, 'iwfTimeoutId' + category);
337 iwfRemoveAttribute(el, 'iwfTimeoutCategory' + category);
338 }
339
340 }
341
342 // BROCK
343 function iwfDelay(ms, fpOrString){
344 function _iwfDelayExpired(){
345 if (localIsString){
346 // passed a string. eval it.
347 iwfLog("_iwfDelayExpired: calling string of:\n" + localFpOrString, true);
348 eval(localFpOrString);
349 } else {
350 // they passed a function pointer.
351 // call it, passing any args we were given.
352 if (!localArgs || localArgs.length == 0){
353 localFpOrString();
354 } else if (localArgs.length == 1){
355 localFpOrString(localArgs[0]);
356 } else {
357 var s = 'localFpOrString(';
358 for(var i=0;i<localArgs.length;i++){
359 if (i > 0){
360 s += ', ';
361 }
362 if(localArgs[i] == null){
363 s += 'null';
364 } else if(iwfIsString(localArgs[i])){
365 s += '"' + localArgs[i].replace(/"/gi, '\\"') + '"';
366 } else {
367 s += localArgs[i];
368 }
369 }
370 s += ')';
371 //iwfLog("_iwfDelayExpired: calling fp of:\n" + s, true);
372 eval(s);
373 }
374 }
375 delete localFpOrString;
376 delete localIsString;
377 delete localArgs;
378 }
379
380 var localFpOrString = fpOrString;
381 var localIsString = iwfIsString(fpOrString);
382 var localArgs = null;
383
384 if (!iwfIsString(fpOrString)){
385 if (arguments && arguments.length > 0){
386 localArgs = new Array();
387 for(var i=2;i<arguments.length;i++){
388 //iwfLog('args[' + i + '] = ' + arguments[i], true);
389 localArgs.push(arguments[i]);
390 }
391 }
392 }
393 setTimeout(_iwfDelayExpired, ms);
394 }
395
396 // -----------------------------------
397 // End: Timers
398 // -----------------------------------
399
400
401 // -----------------------------------
402 // Begin: Positioning
403 // -----------------------------------
404
405 function iwfX1(id, newx){
406 return iwfX(id, newx);
407 }
408
409
410 function iwfFocusSelect(id, promptmsg){
411 var el = iwfGetById(id);
412 if (promptmsg){
413 alert(promptmsg);
414 }
415 if (!iwfIsHidden(id)){
416 try {
417 el.focus();
418 el.select();
419 } catch(e) { }
420 }
421 return false;
422 }
423
424 function iwfFocus(id, promptmsg){
425 var el = iwfGetById(id);
426 if (promptmsg){
427 alert(promptmsg);
428 }
429 if (!iwfIsHidden(id)){
430 try {
431 el.focus();
432 } catch(e) { }
433 }
434 return false;
435 }
436
437
438
439 function iwfX(id, newx){
440 var absx = 0;
441
442 if (iwfIsNumber(newx)) {
443 absx = iwfSetX(id, newx);
444 } else {
445 var el = iwfGetById(id);
446 if (!el) return 0;
447 if (iwfIsString(el.style.left) && el.style.left.length > 0){
448 absx = iwfToInt(el.style.left, true);
449 if (isNaN(absx)) {
450 absx = 0;
451 }
452 } else if (iwfExists(el.style.pixelLeft) && el.style.pixelLeft) {
453 absx = el.style.pixelLeft;
454 } else {
455 while (el) {
456 if (iwfExists(el.offsetLeft)) absx += el.offsetLeft;
457 el = iwfGetParent(el, true);
458 }
459 }
460 }
461
462 return absx;
463 }
464
465 function iwfSetX(id, newx){
466 var el = iwfGetById(id);
467 if (!el) return;
468 if(iwfExists(el.style) && iwfIsString(el.style.left)) {
469 el.style.left = newx + 'px';
470 }
471 else if(iwfExists(el.style) && iwfExists(el.style.pixelLeft)) {
472 el.style.pixelLeft = newx;
473 }
474 else if(iwfExists(el.left)) {
475 el.left = newx;
476 }
477 return newx;
478 }
479
480 function iwfY1(id, newy){
481 var el = iwfGetById(id);
482 return iwfY(el, newy);
483 }
484
485 function iwfY(id, newy){
486 var absy = 0;
487
488 if (iwfIsNumber(newy)) {
489 absy = iwfSetY(id, newy);
490 } else {
491 var el = iwfGetById(id);
492 if (!el) return 0;
493
494 if (iwfIsString(el.style.top) && el.style.top.length > 0){
495 absy = iwfToInt(el.style.top, true);
496 if (isNaN(absy)) {
497 absy = 0;
498 }
499 } else if (iwfExists(el.style.pixelTop) && el.style.pixelTop) {
500 absy = el.style.pixelTop;
501 } else {
502 while (el) {
503 if (iwfExists(el.offsetTop)) absy += el.offsetTop;
504 el = iwfGetParent(el, true);
505 }
506 }
507 }
508
509 return absy;
510 }
511
512 function iwfSetY(id, newy){
513 var el = iwfGetById(id);
514 if (!el) return;
515 if (iwfExists(el.style)){
516 if (iwfIsString(el.style.top)) {
517 el.style.top = newy + 'px';
518 } else if(iwfExists(el.style.pixelTop)) {
519 el.style.pixelTop = newy;
520 } else if(iwfExists(el.top)) {
521 el.top = newy;
522 }
523 }
524 return newy;
525 }
526
527 function iwfZIndex(id, z){
528 var el = iwfGetById(id);
529 if (iwfExists(el)){
530 if (iwfExists(z)){
531 el.style.zIndex = z;
532 }
533 return parseInt(el.style.zIndex);
534 }
535 return 0;
536 }
537
538 function iwfMoveTo(id1, xDest, yDest, totalTicks, motionType){
539
540 var el = iwfGetById(id1);
541
542 if (el){
543 var origX = iwfX1(el);
544 var origY = iwfY1(el);
545
546 // wipeout any other repositioning timeouts we have...
547 _iwfClearTimeout(el, "moveto", "position", true);
548
549 // move any elements we have docked to us
550 _iwfMoveDockedItems(el, xDest, yDest, totalTicks, motionType);
551
552 if (!totalTicks){
553 // do it immediately.
554 iwfX1(id1, xDest);
555 iwfY1(id1, yDest);
556 } else {
557 // animate the movement
558 _iwfMoveTo(id1, origX, origY, xDest, yDest, totalTicks, totalTicks, motionType);
559 }
560 }
561
562 }
563
564 function _iwfMoveDockedItems(id, xDest, yDest, totalTicks, motionType){
565 var elMaster = iwfGetById(id);
566 if (elMaster){
567 var dockers = iwfAttribute(elMaster, 'iwfDockers');
568 //iwfLog("Dockers for " + iwfAttribute(elMaster, 'id') + ":\n" + dockers, true);
569 if (dockers && dockers.length > 0){
570 // there is one or more items docked to us
571 // tell them to move with us!
572 dockers = dockers.split(",");
573 for(var i=0;i<dockers.length;i++){
574 var elSlave = iwfGetById(dockers[i]);
575 if (elSlave){
576 //iwfLog("found element '" + dockers[i] + "' which is docked to element " + iwfAttribute(elMaster, 'id'), true);
577 var xOffset = iwfX(elMaster) - iwfX(elSlave);
578 var yOffset = iwfY(elMaster) - iwfY(elSlave);
579 var xEnd = xDest - xOffset;
580 var yEnd = yDest - yOffset;
581 iwfMoveTo(elSlave, xEnd, yEnd, totalTicks, motionType);
582 }
583 }
584 }
585 }
586 }
587
588 function _iwfMoveTo(id1, xOrig, yOrig, xDest, yDest, ticksLeft, totalTicks, motionType){
589 //iwfLog("_iwfMoveTo(" + id1 + ", " + xOrig + ", " + yOrig + ", " + xDest + ", " + yDest + ", " + ticksLeft + ", " + totalTicks + ", '" + motionType + "')");
590 var el = iwfGetById(id1);
591 if (!el){
592 //iwfLog("could not locate el with id of " + id1);
593 } else {
594 el_id = iwfAttribute(el, 'id');
595
596 _iwfClearTimeout(el, "moveto", "position", true);
597
598
599 var elX = iwfX1(el);
600 var elY = iwfY1(el);
601
602 // hack for floating point anomolies -- stops animation when element is "close enough"
603 var epsilon = 0.001;
604
605 var xDone = false;
606 if (elX > xDest){
607 if (xDest + epsilon > elX){
608 xDone = true;
609 }
610 } else {
611 if (xDest - epsilon < elX){
612 xDone = true;
613 }
614 }
615
616 var yDone = false;
617 if (elY > yDest){
618 if (yDest + epsilon > elY){
619 yDone = true;
620 }
621 } else {
622 if (yDest - epsilon < elY){
623 yDone = true;
624 }
625 }
626
627 if (ticksLeft <= 0 || (xDone && yDone)){
628 // time is up. / motion is done
629 //iwfLog("_iwfMoveTo time is up / motion is done.");
630 iwfX1(el, xDest);
631 iwfY1(el, yDest);
632
633 } else {
634
635 var pctLeft = ticksLeft / totalTicks;
636
637 var xTotal = xDest - xOrig;
638 var yTotal = yDest - yOrig;
639
640 var xCur, yCur, rt;
641
642 switch(motionType){
643 case 'd':
644 case 'dec':
645 default:
646 rt = pctLeft * pctLeft * pctLeft * pctLeft * pctLeft * pctLeft;
647 xCur = xOrig + (xTotal - (rt * xTotal));
648 yCur = yOrig + (yTotal - (rt * yTotal));
649 break;
650 case 'a':
651 case 'acc':
652 pctLeft = 1 - pctLeft;
653 rt = pctLeft * pctLeft * pctLeft * pctLeft;
654 xCur = xOrig + (rt * xTotal);
655 yCur = yOrig + (rt * yTotal);
656 break;
657 case 'b':
658 case 'both':
659 if (pctDone > 0.75){
660 // over 3/4 done -- decelerate
661 rt = pctLeft * pctLeft * pctLeft * pctLeft;
662 xCur = xOrig + (xTotal - (rt * xTotal));
663 yCur = yOrig + (yTotal - (rt * yTotal));
664
665 } else if (pctDone < 0.25){
666 // not 1/4 done yet -- accelerate
667 pctLeft = 1 - pctLeft;
668 rt = pctLeft * pctLeft * pctLeft * pctLeft; // * pctDone * pctDone;
669 xCur = xOrig + (rt * xTotal);
670 yCur = yOrig + (rt * yTotal);
671
672 } else {
673 // between 1/4 and 3/5 done -- linear
674 xCur = xOrig + (pctLeft * xTotal);
675 yCur = yOrig + (pctLeft * yTotal);
676 }
677 break;
678 case 'lin':
679 case 'linear':
680 case 'l':
681 // use linear motion
682 xCur = xOrig + (pctLeft * xTotal);
683 yCur = yOrig + (pctLeft * yTotal);
684 break;
685 }
686
687 iwfX1(el, xCur);
688 iwfY1(el, yCur);
689
690
691 ticksLeft--;
692
693 var fn = "_iwfMoveTo('" + el_id + "', " + xOrig + ", " + yOrig + ", " + xDest + ", " + yDest + ", " + ticksLeft + ", " + totalTicks + ", '" + motionType + "')";
694 //iwfLog("timeout set to call: " + fn);
695 _iwfSetTimeout(el, "moveto", "position", fn, 50);
696 }
697 }
698 }
699
700 function iwfUnDockFrom(id1, id2){
701 var elSlave = iwfGetById(id1);
702
703 if (elSlave){
704 var slaveId = iwfAttribute(elSlave, 'id');
705 // determine who elSlave is docked to
706 var dockedTo = iwfAttribute(elSlave, 'iwfDockedTo');
707 if (dockedTo){
708 // elSlave says he's docked to the guy with id of dockedTo.
709 // grab that guy.
710 var elMaster = iwfGetById(dockedTo);
711 //iwfLog("dockedTo:" + iwfAttribute(elMaster, 'id'), true);
712 if (elMaster){
713 // elMaster is the guy elSlave is docked to.
714 // tell elMaster to remove elSlave from his docker list
715
716 var dockers = iwfAttribute(elMaster, 'iwfDockers');
717 //iwfLog("undocking items from " + iwfAttribute(elMaster, 'id') + ":\n" + dockers, true);
718 if (dockers && dockers.length > 0){
719 var arrDockers = dockers.split(",");
720 if (arrDockers.length == 0){
721 arrDockers.push(dockers);
722 }
723 //iwfLog('arrDockers=' + arrDockers + '\nlength=' + arrDockers.length, true);
724 for(var i=0;i<arrDockers.length;i++){
725 //iwfLog("undocking is checking " + arrDockers[i] + " against " + slaveId, true);
726 if (arrDockers[i] == slaveId){
727 // undock elSlave from elMaster
728 arrDockers.splice(i, 1);
729
730 var output = arrDockers.join(",");
731 //iwfLog("writing iwfDockers=" + output);
732
733 // write this back to elMaster
734 iwfAttribute(elMaster, 'iwfDockers', output);
735 break;
736 }
737 }
738 }
739 }
740 // tell elSlave he's no longer docked to elMaster.
741 iwfAttribute(elSlave, 'iwfDockedTo', null);
742 }
743 }
744 }
745
746 function iwfAlignTo(id1, id2, anchor1, anchor2, totalTicks, motionType){
747 var elMover = iwfGetById(id1);
748 var elStays = iwfGetById(id2);
749
750 if (elMover && elStays){
751
752 var newX = iwfX(elStays);
753 var newY = iwfY(elStays);
754
755 var anc = ((anchor1 +' ').substr(0,2) + (anchor2 + ' ').substr(0,2)).toLowerCase();
756 iwfLog("anchor encoding: " + anc);
757 if (anc.charAt(0) == 'b'){
758 newY -= iwfHeight(elMover);
759 } else if (anc.charAt(0) == 'c'){
760 newY -= iwfHeight(elMover) / 2;
761 }
762
763 var moverWidth;
764 var staysWidth;
765 if (anc.charAt(1) == 'r'){
766 moverWidth = iwfWidth(elMover);
767 newX -= moverWidth;
768 } else if (anc.charAt(1) == 'c'){
769 moverWidth = iwfWidth(elMover);
770 newX -= moverWidth / 2;
771 }
772 if (anc.charAt(2) == 'b'){
773 newY += iwfHeight(elStays);
774 } else if (anc.charAt(2) == 'c'){
775 newY += iwfHeight(elStays) / 2;
776 }
777 if (anc.charAt(3) == 'r'){
778 staysWidth = iwfWidth(elStays);
779 newX += staysWidth;
780 } else if (anc.charAt(3) == 'c'){
781 staysWidth = iwfWidth(elStays);
782 newX += staysWidth / 2;
783 }
784
785 iwfLog(iwfAttribute(elMover, 'id') + ' width:' + moverWidth + '\n' + iwfAttribute(elStays, 'id') + ' width:' + staysWidth);
786
787 // move to those alignment points
788 iwfMoveTo(elMover, newX, newY, totalTicks, totalTicks, motionType);
789 }
790 }
791
792 function iwfDockTo(id1, id2, anchor1, anchor2, totalTicks, motionType){
793 var elSlave = iwfGetById(id1);
794 var elMaster = iwfGetById(id2);
795
796 if (elSlave && elMaster){
797
798 // dock elSlave to elMaster...
799
800 // pull all items currently docked to elMaster
801 var dockers = iwfAttribute(elMaster,'iwfDockers');
802 // append elSlave to that list
803 if(!dockers){
804 dockers = iwfAttribute(elSlave, 'id');
805 } else {
806 var arrDockers = dockers.split(",");
807 if (arrDockers.length == 0){
808 arrDockers = new Array(dockers);
809 }
810
811 var slaveId = iwfAttribute(elSlave, 'id');
812 var found = false;
813 for(var i=0;i<arrDockers.length;i++){
814 if (arrDockers[i] == slaveId){
815 found = true;
816 }
817 }
818 if (!found){
819 // elSlave is not in elMaster's list of dockers yet. add him.
820 dockers += "," + iwfAttribute(elSlave, 'id');
821 }
822 }
823
824 // write list back to elMaster
825 iwfAttribute(elMaster, 'iwfDockers', dockers);
826
827 // have elSlave remember who he's docked to
828 iwfAttribute(elSlave, 'iwfDockedTo', iwfAttribute(elMaster, 'id'));
829
830
831 //iwfLog("dockers for " + iwfAttribute(elMaster, 'id') + " = " + dockers, true);
832
833
834 iwfAlignTo(elSlave, elMaster, anchor1, anchor2, totalTicks, motionType);
835
836 }
837
838
839 }
840
841 function iwfXScroll(id) {
842 var scrollx=0;
843 var el = iwfGetById(id);
844 if (!el){
845 if(document.documentElement && document.documentElement.scrollLeft) scrollx=document.documentElement.scrollLeft;
846 else if(document.body && iwfExists(document.body.scrollLeft)) scrollx=document.body.scrollLeft;
847 } else {
848 if (iwfIsNumber(el.scrollLeft)) scrollx = el.scrollLeft;
849 }
850 return scrollx;
851 }
852 function iwfYScroll(id) {
853 var scrolly=0;
854 var el = iwfGetById(id);
855 if (!el){
856 if(document.documentElement && document.documentElement.scrollTop) scrolly=document.documentElement.scrollTop;
857 else if(document.body && iwfExists(document.body.scrollTop)) scrolly=document.body.scrollTop;
858 } else {
859 if (iwfIsNumber(el.scrollTop)) scrolly = el.scrollTop;
860 }
861 return scrolly;
862 }
863
864
865
866 // -----------------------------------
867 // End: Positioning
868 // -----------------------------------
869
870 // -----------------------------------
871 // Begin: Size
872 // -----------------------------------
873
874 function iwfWidth(id, neww){
875
876
877
878 var el = iwfGetById(id);
879 if (!el) return 0;
880 var w = 0;
881 if (iwfExists(el)){
882 if (iwfExists(el.style)){
883 if (iwfExists(el.offsetWidth) && iwfIsString(el.style.width)){
884 if (neww) iwfDetermineWidth(el, neww);
885 w = el.offsetWidth;
886 } else if (iwfExists(el.style.pixelWidth)) {
887 if(neww) el.style.pixelWidth = neww;
888 w = el.style.pixelWidth;
889 } else {
890 w = -1;
891 }
892 } else if (iwfExists(el.clip) && iwfExists(el.clip.right)) {
893 if(newh) e.clip.right = neww;
894 w = el.clip.right;
895 } else {
896 w = -2;
897 }
898
899 //iwfLog('width of ' + iwfAttribute(el, 'id') + ' = ' + w, true);
900
901 }
902
903 return w;
904
905
906
907 // var el = iwfGetById(id);
908 // var w = 0;
909 // if (iwfExists(el)){
910 // if(iwfExists(el.style, el.offsetWidth) && iwfIsString(el.style.width)) {
911 // if(neww) iwfDetermineWidth(el, neww);
912 // w = el.offsetWidth;
913 // }
914 // else if(iwfExists(el.style) && iwfExists(el.style.pixelWidth)) {
915 // if(neww) el.style.pixelWidth = neww;
916 // w = el.style.pixelWidth;
917 // }
918 // else if(iwfExists(el.clip) && iwfExists(el.clip.right)) {
919 // if(neww) e.clip.right = neww;
920 // w = el.clip.right;
921 // }
922 // }
923 // return w;
924 }
925
926 function iwfHeight(id, newh){
927 var el = iwfGetById(id);
928 if (!el) return 0;
929 var h = 0;
930 if (iwfExists(el)){
931 if (iwfExists(el.style)){
932 if (iwfExists(el.offsetHeight) && iwfIsString(el.style.height)){
933 if (newh) iwfDetermineHeight(el, newh);
934 h = el.offsetHeight;
935 } else if (iwfExists(el.style.pixelHeight)) {
936 if(newh) el.style.pixelHeight = newh;
937 h = el.style.pixelHeight;
938 } else {
939 h = -1;
940 }
941 } else if (iwfExists(el.clip) && iwfExists(el.clip.bottom)) {
942 if(newh) e.clip.bottom = newh;
943 h = el.clip.bottom;
944 } else {
945 h = -2;
946 }
947 }
948 return h;
949 }
950
951 function iwfY2(id, y2){
952 var el = iwfGetById(id);
953 if (iwfExists(el)) {
954 var y1 = iwfY(el);
955 if (iwfExists(y2)){
956 var h = iwfHeight(el);
957 iwfHeight(el, y1 + h);
958 }
959 return y1 + iwfHeight(el);
960 }
961 return 0;
962 }
963
964 function iwfX2(id, x2){
965 var el = iwfGetById(id);
966 if (iwfExists(el)) {
967 var x1 = iwfX(id);
968 if (iwfExists(x2)){
969 var w = iwfWidth(id);
970 iwfWidth(id, x1 + h);
971 }
972 return x1 + iwfWidth(el);
973 }
974 return 0;
975 }
976
977 function iwfDetermineStyle(el,prop){
978 return parseInt(document.defaultView.getComputedStyle(el,'').getPropertyValue(prop),10);
979 }
980 function iwfDetermineWidth(el,neww){
981 var padl=0, padr=0, bdrl=0, bdrr=0;
982 if (iwfExists(document.defaultView) && iwfExists(document.defaultView.getComputedStyle)){
983 padl = iwfDetermineStyle(el,'padding-left');
984 padr = iwfDetermineStyle(el,'padding-right');
985 bdrl = iwfDetermineStyle(el,'border-left-width');
986 bdrr = iwfDetermineStyle(el,'border-right-width');
987
988 } else if(iwfExists(el.currentStyle,document.compatMode)){
989 if(document.compatMode=='CSS1Compat'){
990 padl = parseInt(el.currentStyle.paddingLeft);
991 padr = parseInt(el.currentStyle.paddingRight);
992 bdrl = parseInt(el.currentStyle.borderLeftWidth);
993 bdrr = parseInt(el.currentStyle.borderRightWidth);
994 }
995 } else if(iwfExists(el.offsetWidth,el.style.width)){
996 el.style.width = neww + 'px';
997 padl=el.offsetWidth - neww;
998 }
999
1000 if(isNaN(padl)) padl=0;
1001 if(isNaN(padr)) padr=0;
1002 if(isNaN(bdrl)) bdrl=0;
1003 if(isNaN(bdrr)) bdrr=0;
1004
1005 var w2 = neww - padl - padr - bdrl - bdrr;
1006 if (isNaN(w2) || w2 < 0) return;
1007 else el.style.width = w2 + 'px';
1008 }
1009
1010 function iwfDetermineHeight(el,newh){
1011 var padt=0, padb=0, bdrt=0, bdrb=0;
1012 if(iwfExists(document.defaultView) && iwfExists(document.defaultView.getComputedStyle)){
1013 padt = iwfDetermineStyle(el,'padding-top');
1014 padb = iwfDetermineStyle(el,'padding-bottom');
1015 badt = iwfDetermineStyle(el,'border-top-height');
1016 badb = iwfDetermineStyle(el,'border-bottom-height');
1017 } else if(iwfExists(el.currentStyle,document.compatMode)){
1018 if(document.compatMode=='CSS1Compat'){
1019 padt = parseInt(el.currentStyle.paddingTop);
1020 padb = parseInt(el.currentStyle.paddingBottom);
1021 bdrt = parseInt(el.currentStyle.borderTopHeight);
1022 bdrb = parseInt(el.currentStyle.borderBottomHeight);
1023 }
1024 } else if(iwfExists(el.offsetHeight, el.style.height)){
1025 el.style.height = newh + 'px';
1026 padt = el.offsetHeight - newh;
1027 }
1028
1029 if(isNaN(padt)) padt=0;
1030 if(isNaN(padb)) padb=0;
1031 if(isNaN(bdrt)) bdrt=0;
1032 if(isNaN(bdrb)) bdrb=0;
1033
1034 var h2 = newh - padt - padb - bdrt - bdrb;
1035
1036 if(isNaN(h2) || h2 < 0) return;
1037 else el.style.height = h2 + 'px';
1038 }
1039
1040
1041 // -----------------------------------
1042 // End: Size
1043 // -----------------------------------
1044
1045 // -----------------------------------
1046 // Begin: Event
1047 // -----------------------------------
1048
1049 function iwfAddEvent(id,eventName,callback) {
1050 var el = iwfGetById(id);
1051 if (!el) return;
1052 if (el.attachEvent) {
1053 el.attachEvent(eventName, callback);
1054 } else {
1055 el[eventName] = callback;
1056 }
1057 }
1058
1059 function iwfRemoveEvent(id, eventName, callback){
1060 var el = iwfGetById(id);
1061 if (!el) return;
1062 if (el.detachEvent) el.detachEvent(eventName, callback);
1063 else eval('el.' + eventName + ' = null;');
1064 }
1065
1066 function iwfEvent(ev) {
1067 this.keyCode = 0;
1068 this.target = null;
1069 this.type = '';
1070 this.X = 0;
1071 this.Y = 0;
1072 var evt = ev || window.event;
1073 if(!evt) return;
1074
1075 if(evt.type) this.type = evt.type;
1076 if(evt.target) this.target = evt.target;
1077 else if(evt.srcElement) this.target = evt.srcElement;
1078
1079 if(iwfExists(evt.clientX,evt.clientY)) {
1080 this.X = evt.clientX + iwfXScroll();
1081 this.Y = evt.clientY + iwfYScroll();
1082 } else if (iwfExists(evt.offsetX, evt.offsetY)){
1083 this.X = evt.offsetX;
1084 this.Y = evt.offsetY;
1085 }
1086
1087 if (evt.keyCode) { this.keyCode = evt.keyCode; }
1088 else if (iwfExists(evt.which)) { this.keyCode = evt.which; }
1089
1090 return this;
1091 }
1092
1093 // -----------------------------------
1094 // End: Event
1095 // -----------------------------------
1096
1097
1098 // -----------------------------------
1099 // Begin: Image
1100 // -----------------------------------
1101 function iwfRollover(id, overurl){
1102 var el = iwfGetById(id);
1103 if (!el) return;
1104 var rollover = null;
1105 if (overurl){
1106 rollover = overurl;
1107 } else {
1108 iwfAttribute(el, "rolloversrc");
1109 }
1110 if (!rollover) return;
1111 el.iwfOrigSrc = el.src;
1112 el.iwfRolloverImg = new Image();
1113 el.iwfRolloverImg.src = rollover;
1114 iwfAddEvent(el, 'onmouseover', iwfDoRollover);
1115 iwfAddEvent(el, 'onmouseout', iwfDoRollover);
1116 }
1117
1118 function iwfDoRollover(ev){
1119 var evt = new iwfEvent(ev);
1120 var el = evt.target;
1121 if (el.src == el.iwfOrigSrc){
1122 iwfSwapImage(el, el.iwfRolloverImg);
1123 } else {
1124 iwfSwapImage(el, el.iwfOrigSrc);
1125 }
1126 }
1127
1128 function iwfPreloadImage(id, newimg){
1129 var el = iwfGetById(id);
1130 if (!el) return;
1131 /* todo: preload images here */
1132 }
1133
1134 function iwfSwapImage(id, newimg){
1135 var el = iwfGetById(id);
1136 if (!el) return;
1137 if (iwfIsString(newimg)){
1138 el.src = newimg;
1139 } else {
1140 el.src = newimg.src;
1141 }
1142 }
1143
1144 // preload images and attach event handlers for rollovers
1145 function iwfMapRollovers(){
1146 var nodes = iwfGetByTagName('img');
1147 for(var i=0;i<nodes.length;i++){
1148 iwfRollover(nodes[i]);
1149 }
1150 }
1151
1152 // -----------------------------------
1153 // End: Image
1154 // -----------------------------------
1155
1156
1157 // -----------------------------------
1158 // Begin: Drag-N-Drop
1159 // -----------------------------------
1160
1161 var iwfDragger = {el:null, inUse:false};
1162 var iwfHiZ = 2;
1163
1164 function iwfEnableDrag(id, startCallback, dragCallback, endCallback) {
1165 var el = iwfGetById(id);
1166 if (!el) return;
1167 el.iwfDraggable = true;
1168 el.iwfOnDragStart = startCallback;
1169 el.iwfOnDrag = dragCallback;
1170 el.iwfOnDragEnd = endCallback;
1171 iwfAddEvent(el, 'onmousedown', iwfDragMouseDown);
1172 if (!iwfDragger.inUse) {
1173 iwfDragger.inUse = true;
1174 iwfAddEvent(document, 'onmousemove', iwfDragMouseMove);
1175 }
1176 }
1177 function iwfDragMouseDown(ev){
1178 var evt = new iwfEvent(ev);
1179 var el = evt.target;
1180 while(el && !el.iwfDraggable) {
1181 el = iwfParent(el);
1182 }
1183 if (el) {
1184 if (ev && ev.preventDefault) ev.preventDefault();
1185 else if (window.event) window.event.returnValue = false;
1186 el.iwfDragX = evt.X;
1187 el.iwfDragY = evt.Y;
1188
1189 iwfZIndex(el, iwfHiZ++);
1190
1191 iwfDragger.el = el;
1192 iwfAddEvent(document, 'onmouseup', iwfDragMouseUp, false);
1193 if (el.iwfOnDragStart) {
1194 el.iwfOnDragStart(el, evt.X, evt.Y);
1195 }
1196 }
1197 }
1198
1199 function iwfDragMouseMove(ev){
1200 var evt = new iwfEvent(ev);
1201 if (iwfDragger.el) {
1202 if (ev && ev.preventDefault) ev.preventDefault();
1203 else if (window.event) window.event.returnValue = false;
1204 var el = iwfDragger.el;
1205 var dx = evt.X - el.iwfDragX;
1206 var dy = evt.Y - el.iwfDragY;
1207 el.iwfDragX = evt.X;
1208 el.iwfDragY = evt.Y;
1209
1210 if (el.iwfOnDrag) {
1211 el.iwfOnDrag(el, dx, dy);
1212 } else {
1213 iwfX(el, iwfX(el) + dx);
1214 iwfY(el, iwfY(el) + dy);
1215 }
1216 }
1217 }
1218 function iwfDragMouseUp(ev) {
1219 if (iwfDragger.el) {
1220 if (ev && ev.preventDefault) ev.preventDefault();
1221 else if (window.event) window.event.returnValue = false;
1222 iwfRemoveEvent(document, 'onmouseup', iwfDragMouseUp, false);
1223 if (iwfDragger.el.iwfOnDragEnd) {
1224 var evt = new iwfEvent(ev);
1225 iwfDragger.el.iwfOnDragEnd(iwfDragger.el, evt.X, evt.Y);
1226 }
1227 iwfDragger.el = null;
1228 }
1229 }
1230
1231 // -----------------------------------
1232 // End: Drag-N-Drop
1233 // -----------------------------------
1234
1235 // -----------------------------------
1236 // Begin: Initializers
1237 // -----------------------------------
1238 iwfMapRollovers();
1239 // -----------------------------------
1240 // End: Initializers
1241 // -----------------------------------

Properties

Name Value
svn:mime-type text/cpp

  ViewVC Help
Powered by ViewVC 1.1.26