1 // -----------------------------------------------------------------------------
\r
2 // IWF - Interactive Website Framework. Javascript library for creating
\r
3 // responsive thin client interfaces.
\r
5 // Copyright (C) 2005 Brock Weaver brockweaver@gmail.com
\r
7 // This library is free software; you can redistribute it and/or modify
\r
8 // it under the terms of the GNU Lesser General Public License as published
\r
9 // by the Free Software Foundation; either version 2.1 of the License, or
\r
10 // (at your option) any later version.
\r
12 // This library is distributed in the hope that it will be useful, but
\r
13 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
\r
14 // or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
\r
15 // License for more details.
\r
17 // You should have received a copy of the GNU Lesser General Public License
\r
18 // along with this library; if not, write to the Free Software Foundation,
\r
19 // Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
\r
22 // brockweaver@gmail.com
\r
25 // -----------------------------------------------------------------------------
\r
27 // --------------------------------------------------------------------------
\r
30 // GUI inspection and manipulation functions
\r
35 // Brock Weaver - brockweaver@sourceforge.net - iwf.sourceforge.net
\r
36 // v 0.1 - 2005-06-05
\r
38 // --------------------------------------------------------------------------
\r
40 // Timeouts have hiccups sometimes when they begin to overlap
\r
41 // Not tested on Safari -- I need an iMac!
\r
42 // _iwfMoveTo() has some calculation problems with certain motionType values
\r
43 // --------------------------------------------------------------------------
\r
45 // -----------------------------------
\r
47 if (!window.iwfGetById){
\r
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>");
\r
50 // -----------------------------------
\r
54 // -----------------------------------
\r
55 // Begin: Visibility
\r
56 // -----------------------------------
\r
58 function iwfShow(id, reserveSpace){
\r
59 var el = iwfGetById(id);
\r
61 if (iwfExists(el) && iwfExists(el.style) && iwfExists(el.style.visibility)) el.style.visibility = 'visible';
\r
63 if (iwfExists(el) && iwfExists(el.style) && iwfExists(el.style.display)) el.style.display = 'inline';
\r
67 function iwfHide(id, reserveSpace){
\r
68 var el = iwfGetById(id);
\r
70 if (el && iwfExists(el.style) && iwfExists(el.style.visibility)) el.style.visibility = 'hidden';
\r
72 if (el && iwfExists(el.style) && iwfExists(el.style.display)) el.style.display = 'none';
\r
76 function iwfHideDelay(id, ms, reserveSpace){
\r
77 var el = iwfGetById(id);
\r
80 // wipeout any other re-visibling timeouts we have (nice spelling, eh?)
\r
81 _iwfClearTimeout(el, "hidedelay", "visible", true);
\r
84 iwfHide(el, reserveSpace);
\r
86 _iwfSetTimeout(el, "hidedelay", "visible", "iwfHideDelay('" + el.id + "', 0, " + reserveSpace + ")", ms);
\r
90 function iwfShowDelay(id, ms, reserveSpace){
\r
91 var el = iwfGetById(id);
\r
94 // wipeout any other re-visibling timeouts we have (nice spelling, eh?)
\r
95 _iwfClearTimeout(el, "showdelay", "visible", true);
\r
98 iwfShow(el, reserveSpace);
\r
100 _iwfSetTimeout(el, "showdelay", "visible", "iwfShowDelay('" + el.id + "', 0, " + reserveSpace + ")", ms);
\r
104 function iwfShowGently(id, pct, reserveSpace){
\r
106 var el = iwfGetById(id);
\r
109 // wipeout any other re-visibling timeouts we have (nice spelling, eh?)
\r
110 _iwfClearTimeout(el, "showgently", "visible", true);
\r
112 var opacity = iwfOpacity(el);
\r
113 if (iwfIsHidden(el)){
\r
114 // set opacity to 0
\r
115 iwfOpacity(el, 0, false, false);
\r
118 iwfShow(el, reserveSpace);
\r
121 // adjust opacity up by the given percentage
\r
122 opacity = iwfOpacity(el, pct, true);
\r
124 if (opacity < 100) {
\r
126 _iwfSetTimeout(el, "showgently", "visible", "iwfShowGently('" + el.id + "'," + pct + ", " + reserveSpace + ")", 50);
\r
130 function iwfHideGently(id, pct, reserveSpace){
\r
131 var el = iwfGetById(id);
\r
134 if (iwfIsHidden(el)) return;
\r
136 // wipeout any other re-visibling timeouts we have (nice spelling, eh?)
\r
137 _iwfClearTimeout(el, "hidegently", "visible", true);
\r
139 var opacity = iwfOpacity(el);
\r
143 iwfHide(el, reserveSpace);
\r
145 // set opacity back to fully opaque, so when they iwfShow() it,
\r
146 // the element isn't fully transparent and looks like iwfShow() didn't work
\r
147 iwfOpacity(el, 100, false, true);
\r
151 // make it less opaque...
\r
152 iwfOpacity(el, -pct, true);
\r
155 _iwfSetTimeout(el, "hidegently", "visible", "iwfHideGently('" + el.id + "'," + pct + ", " + reserveSpace + ")", 50);
\r
159 function iwfHideGentlyDelay(id, pct, ms, reserveSpace){
\r
160 var el = iwfGetById(id);
\r
163 if (iwfIsHidden(el)) return;
\r
165 // wipeout any other re-visibling timeouts we have (nice spelling, eh?)
\r
166 _iwfClearTimeout(el, "hidegentlydelay", "visible", true);
\r
170 iwfHideGently(el, pct, reserveSpace);
\r
172 _iwfSetTimeout(el, "hidegentlydelay", "visible", "iwfHideGentlyDelay('" + el.id + "'," + pct + ", 0, " + reserveSpace + ")", ms);
\r
177 function iwfShowGentlyDelay(id, pct, ms, reserveSpace){
\r
178 var el = iwfGetById(id);
\r
182 // wipeout any other re-visibling timeouts we have (nice spelling, eh?)
\r
183 _iwfClearTimeout(el, "showgentlydelay", "visible", true);
\r
186 iwfShowGently(el, pct, reserveSpace);
\r
188 _iwfSetTimeout(el, "showgentlydelay", "visible", "iwfShowGentlyDelay('" + el.id + "'," + pct + ", 0, " + reserveSpace + ")", ms);
\r
192 function iwfOpacity(id, pct, relative, keepHiddenIfAlreadyHidden){
\r
193 var el = iwfGetById(id);
\r
195 if (iwfExists(pct) && pct != null){
\r
197 var newPct = iwfToFloat(pct, true);
\r
199 // lookup current opacity
\r
200 newPct = iwfOpacity(id, null, false);
\r
202 // modify pct by that much
\r
208 } else if (newPct > 100){
\r
212 if (iwfExists(el.style.opacity)) el.style.opacity = newPct/100;
\r
213 else if (iwfExists(el.style.filter)) el.style.filter = "alpha(opacity=" + newPct + ")";
\r
214 else if (iwfExists(el.style.mozOpacity)) el.style.mozOpacity = newPct/100;
\r
216 // also display it if opacity > 0 and !keepHidden
\r
217 if (newPct > 0 && !keepHiddenIfAlreadyHidden){
\r
218 if (iwfIsHidden(id)){
\r
226 // get current opacity
\r
228 if (iwfExists(el.style.opacity)){
\r
229 if (el.style.opacity == ''){
\r
232 val = iwfToFloat(el.style.opacity, 2, true) * 100;
\r
234 } else if (iwfExists(el.style.filter)) {
\r
235 if (el.style.filter){
\r
236 if (el.style.filter.indexOf("opacity") == 0){
\r
239 val = iwfToFloat(el.style.filter, 2, true);
\r
244 } else if (iwfExists(el.style.mozOpacity)) {
\r
245 if (el.style.mozOpacity == ''){
\r
248 val = iwfToFloat(el.style.mozOpacity, 2, true) * 100;
\r
257 function iwfIsShown(id){
\r
258 return !iwfIsHidden(id);
\r
261 function iwfIsHidden(id){
\r
262 var el = iwfGetById(id);
\r
263 // if (!el) return false;
\r
265 var hidden = false;
\r
266 if (iwfExists(el.style) && iwfExists(el.style.visibility)) {
\r
267 hidden = el.style.visibility == 'hidden';
\r
269 if (iwfExists(el.style) && iwfExists(el.style.display)) {
\r
270 hidden = hidden || el.style.display == 'none';
\r
275 function iwfToggle(id, reserveSpace){
\r
276 if (iwfIsHidden(id)) iwfShow(id, reserveSpace);
\r
277 else iwfHide(id, reserveSpace);
\r
282 // -----------------------------------
\r
284 // -----------------------------------
\r
286 // -----------------------------------
\r
288 // -----------------------------------
\r
290 function _iwfSetTimeout(id, name, category, fn, ms){
\r
291 var el = iwfGetById(id);
\r
294 var att = iwfAttribute(el, 'iwfTimeoutCategory' + category);
\r
296 // that attribute doesn't exist yet, or is null
\r
297 } else if (att != name){
\r
298 // attribute exists but doesn't match our name.
\r
299 // clear out the existing one, since the category matches.
\r
300 _iwfClearTimeout(el.id, att, category);
\r
302 // attribute matches our name.
\r
305 iwfAttribute(el, 'iwfTimeoutCategory' + category, name);
\r
306 //iwfLog('setting timeout for ' + name + ' to ' + fn);
\r
307 var timeoutid = setTimeout(fn, ms);
\r
308 iwfAttribute(el, 'iwfTimeoutId' + category, timeoutid);
\r
312 function _iwfCheckTimeout(id, name, category){
\r
315 var el = iwfGetById(id);
\r
316 if (!el) return false;
\r
318 var att = iwfAttribute(el, 'iwfTimeoutCategory' + category);
\r
319 if (!att || att == name){
\r
327 function _iwfClearTimeout(id, name, category, forceful){
\r
328 var el = iwfGetById(id);
\r
331 var att = iwfAttribute(el, 'iwfTimeoutCategory' + category);
\r
333 if (att == name || forceful){
\r
334 // iwfLog('clearing timeout for ' + att);
\r
335 clearTimeout(iwfAttribute(el, 'iwfTimeoutId' + category));
\r
336 iwfRemoveAttribute(el, 'iwfTimeoutId' + category);
\r
337 iwfRemoveAttribute(el, 'iwfTimeoutCategory' + category);
\r
343 function iwfDelay(ms, fpOrString){
\r
344 function _iwfDelayExpired(){
\r
345 if (localIsString){
\r
346 // passed a string. eval it.
\r
347 iwfLog("_iwfDelayExpired: calling string of:\n" + localFpOrString, true);
\r
348 eval(localFpOrString);
\r
350 // they passed a function pointer.
\r
351 // call it, passing any args we were given.
\r
352 if (!localArgs || localArgs.length == 0){
\r
354 } else if (localArgs.length == 1){
\r
355 localFpOrString(localArgs[0]);
\r
357 var s = 'localFpOrString(';
\r
358 for(var i=0;i<localArgs.length;i++){
\r
362 if(localArgs[i] == null){
\r
364 } else if(iwfIsString(localArgs[i])){
\r
365 s += '"' + localArgs[i].replace(/"/gi, '\\"') + '"';
\r
371 //iwfLog("_iwfDelayExpired: calling fp of:\n" + s, true);
\r
375 delete localFpOrString;
\r
376 delete localIsString;
\r
380 var localFpOrString = fpOrString;
\r
381 var localIsString = iwfIsString(fpOrString);
\r
382 var localArgs = null;
\r
384 if (!iwfIsString(fpOrString)){
\r
385 if (arguments && arguments.length > 0){
\r
386 localArgs = new Array();
\r
387 for(var i=2;i<arguments.length;i++){
\r
388 //iwfLog('args[' + i + '] = ' + arguments[i], true);
\r
389 localArgs.push(arguments[i]);
\r
393 setTimeout(_iwfDelayExpired, ms);
\r
396 // -----------------------------------
\r
398 // -----------------------------------
\r
401 // -----------------------------------
\r
402 // Begin: Positioning
\r
403 // -----------------------------------
\r
405 function iwfX1(id, newx){
\r
406 return iwfX(id, newx);
\r
410 function iwfFocusSelect(id, promptmsg){
\r
411 var el = iwfGetById(id);
\r
415 if (!iwfIsHidden(id)){
\r
424 function iwfFocus(id, promptmsg){
\r
425 var el = iwfGetById(id);
\r
429 if (!iwfIsHidden(id)){
\r
439 function iwfX(id, newx){
\r
442 if (iwfIsNumber(newx)) {
\r
443 absx = iwfSetX(id, newx);
\r
445 var el = iwfGetById(id);
\r
447 if (iwfIsString(el.style.left) && el.style.left.length > 0){
\r
448 absx = iwfToInt(el.style.left, true);
\r
452 } else if (iwfExists(el.style.pixelLeft) && el.style.pixelLeft) {
\r
453 absx = el.style.pixelLeft;
\r
456 if (iwfExists(el.offsetLeft)) absx += el.offsetLeft;
\r
457 el = iwfGetParent(el, true);
\r
465 function iwfSetX(id, newx){
\r
466 var el = iwfGetById(id);
\r
468 if(iwfExists(el.style) && iwfIsString(el.style.left)) {
\r
469 el.style.left = newx + 'px';
\r
471 else if(iwfExists(el.style) && iwfExists(el.style.pixelLeft)) {
\r
472 el.style.pixelLeft = newx;
\r
474 else if(iwfExists(el.left)) {
\r
480 function iwfY1(id, newy){
\r
481 var el = iwfGetById(id);
\r
482 return iwfY(el, newy);
\r
485 function iwfY(id, newy){
\r
488 if (iwfIsNumber(newy)) {
\r
489 absy = iwfSetY(id, newy);
\r
491 var el = iwfGetById(id);
\r
494 if (iwfIsString(el.style.top) && el.style.top.length > 0){
\r
495 absy = iwfToInt(el.style.top, true);
\r
499 } else if (iwfExists(el.style.pixelTop) && el.style.pixelTop) {
\r
500 absy = el.style.pixelTop;
\r
503 if (iwfExists(el.offsetTop)) absy += el.offsetTop;
\r
504 el = iwfGetParent(el, true);
\r
512 function iwfSetY(id, newy){
\r
513 var el = iwfGetById(id);
\r
515 if (iwfExists(el.style)){
\r
516 if (iwfIsString(el.style.top)) {
\r
517 el.style.top = newy + 'px';
\r
518 } else if(iwfExists(el.style.pixelTop)) {
\r
519 el.style.pixelTop = newy;
\r
520 } else if(iwfExists(el.top)) {
\r
527 function iwfZIndex(id, z){
\r
528 var el = iwfGetById(id);
\r
529 if (iwfExists(el)){
\r
531 el.style.zIndex = z;
\r
533 return parseInt(el.style.zIndex);
\r
538 function iwfMoveTo(id1, xDest, yDest, totalTicks, motionType){
\r
540 var el = iwfGetById(id1);
\r
543 var origX = iwfX1(el);
\r
544 var origY = iwfY1(el);
\r
546 // wipeout any other repositioning timeouts we have...
\r
547 _iwfClearTimeout(el, "moveto", "position", true);
\r
549 // move any elements we have docked to us
\r
550 _iwfMoveDockedItems(el, xDest, yDest, totalTicks, motionType);
\r
553 // do it immediately.
\r
557 // animate the movement
\r
558 _iwfMoveTo(id1, origX, origY, xDest, yDest, totalTicks, totalTicks, motionType);
\r
564 function _iwfMoveDockedItems(id, xDest, yDest, totalTicks, motionType){
\r
565 var elMaster = iwfGetById(id);
\r
567 var dockers = iwfAttribute(elMaster, 'iwfDockers');
\r
568 //iwfLog("Dockers for " + iwfAttribute(elMaster, 'id') + ":\n" + dockers, true);
\r
569 if (dockers && dockers.length > 0){
\r
570 // there is one or more items docked to us
\r
571 // tell them to move with us!
\r
572 dockers = dockers.split(",");
\r
573 for(var i=0;i<dockers.length;i++){
\r
574 var elSlave = iwfGetById(dockers[i]);
\r
576 //iwfLog("found element '" + dockers[i] + "' which is docked to element " + iwfAttribute(elMaster, 'id'), true);
\r
577 var xOffset = iwfX(elMaster) - iwfX(elSlave);
\r
578 var yOffset = iwfY(elMaster) - iwfY(elSlave);
\r
579 var xEnd = xDest - xOffset;
\r
580 var yEnd = yDest - yOffset;
\r
581 iwfMoveTo(elSlave, xEnd, yEnd, totalTicks, motionType);
\r
588 function _iwfMoveTo(id1, xOrig, yOrig, xDest, yDest, ticksLeft, totalTicks, motionType){
\r
589 //iwfLog("_iwfMoveTo(" + id1 + ", " + xOrig + ", " + yOrig + ", " + xDest + ", " + yDest + ", " + ticksLeft + ", " + totalTicks + ", '" + motionType + "')");
\r
590 var el = iwfGetById(id1);
\r
592 //iwfLog("could not locate el with id of " + id1);
\r
594 el_id = iwfAttribute(el, 'id');
\r
596 _iwfClearTimeout(el, "moveto", "position", true);
\r
599 var elX = iwfX1(el);
\r
600 var elY = iwfY1(el);
\r
602 // hack for floating point anomolies -- stops animation when element is "close enough"
\r
603 var epsilon = 0.001;
\r
607 if (xDest + epsilon > elX){
\r
611 if (xDest - epsilon < elX){
\r
618 if (yDest + epsilon > elY){
\r
622 if (yDest - epsilon < elY){
\r
627 if (ticksLeft <= 0 || (xDone && yDone)){
\r
628 // time is up. / motion is done
\r
629 //iwfLog("_iwfMoveTo time is up / motion is done.");
\r
635 var pctLeft = ticksLeft / totalTicks;
\r
637 var xTotal = xDest - xOrig;
\r
638 var yTotal = yDest - yOrig;
\r
640 var xCur, yCur, rt;
\r
642 switch(motionType){
\r
646 rt = pctLeft * pctLeft * pctLeft * pctLeft * pctLeft * pctLeft;
\r
647 xCur = xOrig + (xTotal - (rt * xTotal));
\r
648 yCur = yOrig + (yTotal - (rt * yTotal));
\r
652 pctLeft = 1 - pctLeft;
\r
653 rt = pctLeft * pctLeft * pctLeft * pctLeft;
\r
654 xCur = xOrig + (rt * xTotal);
\r
655 yCur = yOrig + (rt * yTotal);
\r
659 if (pctDone > 0.75){
\r
660 // over 3/4 done -- decelerate
\r
661 rt = pctLeft * pctLeft * pctLeft * pctLeft;
\r
662 xCur = xOrig + (xTotal - (rt * xTotal));
\r
663 yCur = yOrig + (yTotal - (rt * yTotal));
\r
665 } else if (pctDone < 0.25){
\r
666 // not 1/4 done yet -- accelerate
\r
667 pctLeft = 1 - pctLeft;
\r
668 rt = pctLeft * pctLeft * pctLeft * pctLeft; // * pctDone * pctDone;
\r
669 xCur = xOrig + (rt * xTotal);
\r
670 yCur = yOrig + (rt * yTotal);
\r
673 // between 1/4 and 3/5 done -- linear
\r
674 xCur = xOrig + (pctLeft * xTotal);
\r
675 yCur = yOrig + (pctLeft * yTotal);
\r
681 // use linear motion
\r
682 xCur = xOrig + (pctLeft * xTotal);
\r
683 yCur = yOrig + (pctLeft * yTotal);
\r
693 var fn = "_iwfMoveTo('" + el_id + "', " + xOrig + ", " + yOrig + ", " + xDest + ", " + yDest + ", " + ticksLeft + ", " + totalTicks + ", '" + motionType + "')";
\r
694 //iwfLog("timeout set to call: " + fn);
\r
695 _iwfSetTimeout(el, "moveto", "position", fn, 50);
\r
700 function iwfUnDockFrom(id1, id2){
\r
701 var elSlave = iwfGetById(id1);
\r
704 var slaveId = iwfAttribute(elSlave, 'id');
\r
705 // determine who elSlave is docked to
\r
706 var dockedTo = iwfAttribute(elSlave, 'iwfDockedTo');
\r
708 // elSlave says he's docked to the guy with id of dockedTo.
\r
710 var elMaster = iwfGetById(dockedTo);
\r
711 //iwfLog("dockedTo:" + iwfAttribute(elMaster, 'id'), true);
\r
713 // elMaster is the guy elSlave is docked to.
\r
714 // tell elMaster to remove elSlave from his docker list
\r
716 var dockers = iwfAttribute(elMaster, 'iwfDockers');
\r
717 //iwfLog("undocking items from " + iwfAttribute(elMaster, 'id') + ":\n" + dockers, true);
\r
718 if (dockers && dockers.length > 0){
\r
719 var arrDockers = dockers.split(",");
\r
720 if (arrDockers.length == 0){
\r
721 arrDockers.push(dockers);
\r
723 //iwfLog('arrDockers=' + arrDockers + '\nlength=' + arrDockers.length, true);
\r
724 for(var i=0;i<arrDockers.length;i++){
\r
725 //iwfLog("undocking is checking " + arrDockers[i] + " against " + slaveId, true);
\r
726 if (arrDockers[i] == slaveId){
\r
727 // undock elSlave from elMaster
\r
728 arrDockers.splice(i, 1);
\r
730 var output = arrDockers.join(",");
\r
731 //iwfLog("writing iwfDockers=" + output);
\r
733 // write this back to elMaster
\r
734 iwfAttribute(elMaster, 'iwfDockers', output);
\r
740 // tell elSlave he's no longer docked to elMaster.
\r
741 iwfAttribute(elSlave, 'iwfDockedTo', null);
\r
746 function iwfAlignTo(id1, id2, anchor1, anchor2, totalTicks, motionType){
\r
747 var elMover = iwfGetById(id1);
\r
748 var elStays = iwfGetById(id2);
\r
750 if (elMover && elStays){
\r
752 var newX = iwfX(elStays);
\r
753 var newY = iwfY(elStays);
\r
755 var anc = ((anchor1 +' ').substr(0,2) + (anchor2 + ' ').substr(0,2)).toLowerCase();
\r
756 iwfLog("anchor encoding: " + anc);
\r
757 if (anc.charAt(0) == 'b'){
\r
758 newY -= iwfHeight(elMover);
\r
759 } else if (anc.charAt(0) == 'c'){
\r
760 newY -= iwfHeight(elMover) / 2;
\r
765 if (anc.charAt(1) == 'r'){
\r
766 moverWidth = iwfWidth(elMover);
\r
767 newX -= moverWidth;
\r
768 } else if (anc.charAt(1) == 'c'){
\r
769 moverWidth = iwfWidth(elMover);
\r
770 newX -= moverWidth / 2;
\r
772 if (anc.charAt(2) == 'b'){
\r
773 newY += iwfHeight(elStays);
\r
774 } else if (anc.charAt(2) == 'c'){
\r
775 newY += iwfHeight(elStays) / 2;
\r
777 if (anc.charAt(3) == 'r'){
\r
778 staysWidth = iwfWidth(elStays);
\r
779 newX += staysWidth;
\r
780 } else if (anc.charAt(3) == 'c'){
\r
781 staysWidth = iwfWidth(elStays);
\r
782 newX += staysWidth / 2;
\r
785 iwfLog(iwfAttribute(elMover, 'id') + ' width:' + moverWidth + '\n' + iwfAttribute(elStays, 'id') + ' width:' + staysWidth);
\r
787 // move to those alignment points
\r
788 iwfMoveTo(elMover, newX, newY, totalTicks, totalTicks, motionType);
\r
792 function iwfDockTo(id1, id2, anchor1, anchor2, totalTicks, motionType){
\r
793 var elSlave = iwfGetById(id1);
\r
794 var elMaster = iwfGetById(id2);
\r
796 if (elSlave && elMaster){
\r
798 // dock elSlave to elMaster...
\r
800 // pull all items currently docked to elMaster
\r
801 var dockers = iwfAttribute(elMaster,'iwfDockers');
\r
802 // append elSlave to that list
\r
804 dockers = iwfAttribute(elSlave, 'id');
\r
806 var arrDockers = dockers.split(",");
\r
807 if (arrDockers.length == 0){
\r
808 arrDockers = new Array(dockers);
\r
811 var slaveId = iwfAttribute(elSlave, 'id');
\r
813 for(var i=0;i<arrDockers.length;i++){
\r
814 if (arrDockers[i] == slaveId){
\r
819 // elSlave is not in elMaster's list of dockers yet. add him.
\r
820 dockers += "," + iwfAttribute(elSlave, 'id');
\r
824 // write list back to elMaster
\r
825 iwfAttribute(elMaster, 'iwfDockers', dockers);
\r
827 // have elSlave remember who he's docked to
\r
828 iwfAttribute(elSlave, 'iwfDockedTo', iwfAttribute(elMaster, 'id'));
\r
831 //iwfLog("dockers for " + iwfAttribute(elMaster, 'id') + " = " + dockers, true);
\r
834 iwfAlignTo(elSlave, elMaster, anchor1, anchor2, totalTicks, motionType);
\r
841 function iwfXScroll(id) {
\r
843 var el = iwfGetById(id);
\r
845 if(document.documentElement && document.documentElement.scrollLeft) scrollx=document.documentElement.scrollLeft;
\r
846 else if(document.body && iwfExists(document.body.scrollLeft)) scrollx=document.body.scrollLeft;
\r
848 if (iwfIsNumber(el.scrollLeft)) scrollx = el.scrollLeft;
\r
852 function iwfYScroll(id) {
\r
854 var el = iwfGetById(id);
\r
856 if(document.documentElement && document.documentElement.scrollTop) scrolly=document.documentElement.scrollTop;
\r
857 else if(document.body && iwfExists(document.body.scrollTop)) scrolly=document.body.scrollTop;
\r
859 if (iwfIsNumber(el.scrollTop)) scrolly = el.scrollTop;
\r
866 // -----------------------------------
\r
867 // End: Positioning
\r
868 // -----------------------------------
\r
870 // -----------------------------------
\r
872 // -----------------------------------
\r
874 function iwfWidth(id, neww){
\r
878 var el = iwfGetById(id);
\r
881 if (iwfExists(el)){
\r
882 if (iwfExists(el.style)){
\r
883 if (iwfExists(el.offsetWidth) && iwfIsString(el.style.width)){
\r
884 if (neww) iwfDetermineWidth(el, neww);
\r
885 w = el.offsetWidth;
\r
886 } else if (iwfExists(el.style.pixelWidth)) {
\r
887 if(neww) el.style.pixelWidth = neww;
\r
888 w = el.style.pixelWidth;
\r
892 } else if (iwfExists(el.clip) && iwfExists(el.clip.right)) {
\r
893 if(newh) e.clip.right = neww;
\r
899 //iwfLog('width of ' + iwfAttribute(el, 'id') + ' = ' + w, true);
\r
907 // var el = iwfGetById(id);
\r
909 // if (iwfExists(el)){
\r
910 // if(iwfExists(el.style, el.offsetWidth) && iwfIsString(el.style.width)) {
\r
911 // if(neww) iwfDetermineWidth(el, neww);
\r
912 // w = el.offsetWidth;
\r
914 // else if(iwfExists(el.style) && iwfExists(el.style.pixelWidth)) {
\r
915 // if(neww) el.style.pixelWidth = neww;
\r
916 // w = el.style.pixelWidth;
\r
918 // else if(iwfExists(el.clip) && iwfExists(el.clip.right)) {
\r
919 // if(neww) e.clip.right = neww;
\r
920 // w = el.clip.right;
\r
926 function iwfHeight(id, newh){
\r
927 var el = iwfGetById(id);
\r
930 if (iwfExists(el)){
\r
931 if (iwfExists(el.style)){
\r
932 if (iwfExists(el.offsetHeight) && iwfIsString(el.style.height)){
\r
933 if (newh) iwfDetermineHeight(el, newh);
\r
934 h = el.offsetHeight;
\r
935 } else if (iwfExists(el.style.pixelHeight)) {
\r
936 if(newh) el.style.pixelHeight = newh;
\r
937 h = el.style.pixelHeight;
\r
941 } else if (iwfExists(el.clip) && iwfExists(el.clip.bottom)) {
\r
942 if(newh) e.clip.bottom = newh;
\r
943 h = el.clip.bottom;
\r
951 function iwfY2(id, y2){
\r
952 var el = iwfGetById(id);
\r
953 if (iwfExists(el)) {
\r
955 if (iwfExists(y2)){
\r
956 var h = iwfHeight(el);
\r
957 iwfHeight(el, y1 + h);
\r
959 return y1 + iwfHeight(el);
\r
964 function iwfX2(id, x2){
\r
965 var el = iwfGetById(id);
\r
966 if (iwfExists(el)) {
\r
968 if (iwfExists(x2)){
\r
969 var w = iwfWidth(id);
\r
970 iwfWidth(id, x1 + h);
\r
972 return x1 + iwfWidth(el);
\r
977 function iwfDetermineStyle(el,prop){
\r
978 return parseInt(document.defaultView.getComputedStyle(el,'').getPropertyValue(prop),10);
\r
980 function iwfDetermineWidth(el,neww){
\r
981 var padl=0, padr=0, bdrl=0, bdrr=0;
\r
982 if (iwfExists(document.defaultView) && iwfExists(document.defaultView.getComputedStyle)){
\r
983 padl = iwfDetermineStyle(el,'padding-left');
\r
984 padr = iwfDetermineStyle(el,'padding-right');
\r
985 bdrl = iwfDetermineStyle(el,'border-left-width');
\r
986 bdrr = iwfDetermineStyle(el,'border-right-width');
\r
988 } else if(iwfExists(el.currentStyle,document.compatMode)){
\r
989 if(document.compatMode=='CSS1Compat'){
\r
990 padl = parseInt(el.currentStyle.paddingLeft);
\r
991 padr = parseInt(el.currentStyle.paddingRight);
\r
992 bdrl = parseInt(el.currentStyle.borderLeftWidth);
\r
993 bdrr = parseInt(el.currentStyle.borderRightWidth);
\r
995 } else if(iwfExists(el.offsetWidth,el.style.width)){
\r
996 el.style.width = neww + 'px';
\r
997 padl=el.offsetWidth - neww;
\r
1000 if(isNaN(padl)) padl=0;
\r
1001 if(isNaN(padr)) padr=0;
\r
1002 if(isNaN(bdrl)) bdrl=0;
\r
1003 if(isNaN(bdrr)) bdrr=0;
\r
1005 var w2 = neww - padl - padr - bdrl - bdrr;
\r
1006 if (isNaN(w2) || w2 < 0) return;
\r
1007 else el.style.width = w2 + 'px';
\r
1010 function iwfDetermineHeight(el,newh){
\r
1011 var padt=0, padb=0, bdrt=0, bdrb=0;
\r
1012 if(iwfExists(document.defaultView) && iwfExists(document.defaultView.getComputedStyle)){
\r
1013 padt = iwfDetermineStyle(el,'padding-top');
\r
1014 padb = iwfDetermineStyle(el,'padding-bottom');
\r
1015 badt = iwfDetermineStyle(el,'border-top-height');
\r
1016 badb = iwfDetermineStyle(el,'border-bottom-height');
\r
1017 } else if(iwfExists(el.currentStyle,document.compatMode)){
\r
1018 if(document.compatMode=='CSS1Compat'){
\r
1019 padt = parseInt(el.currentStyle.paddingTop);
\r
1020 padb = parseInt(el.currentStyle.paddingBottom);
\r
1021 bdrt = parseInt(el.currentStyle.borderTopHeight);
\r
1022 bdrb = parseInt(el.currentStyle.borderBottomHeight);
\r
1024 } else if(iwfExists(el.offsetHeight, el.style.height)){
\r
1025 el.style.height = newh + 'px';
\r
1026 padt = el.offsetHeight - newh;
\r
1029 if(isNaN(padt)) padt=0;
\r
1030 if(isNaN(padb)) padb=0;
\r
1031 if(isNaN(bdrt)) bdrt=0;
\r
1032 if(isNaN(bdrb)) bdrb=0;
\r
1034 var h2 = newh - padt - padb - bdrt - bdrb;
\r
1036 if(isNaN(h2) || h2 < 0) return;
\r
1037 else el.style.height = h2 + 'px';
\r
1041 // -----------------------------------
\r
1043 // -----------------------------------
\r
1045 // -----------------------------------
\r
1047 // -----------------------------------
\r
1049 function iwfAddEvent(id,eventName,callback) {
\r
1050 var el = iwfGetById(id);
\r
1052 if (el.attachEvent) {
\r
1053 el.attachEvent(eventName, callback);
\r
1055 el[eventName] = callback;
\r
1059 function iwfRemoveEvent(id, eventName, callback){
\r
1060 var el = iwfGetById(id);
\r
1062 if (el.detachEvent) el.detachEvent(eventName, callback);
\r
1063 else eval('el.' + eventName + ' = null;');
\r
1066 function iwfEvent(ev) {
\r
1068 this.target = null;
\r
1072 var evt = ev || window.event;
\r
1075 if(evt.type) this.type = evt.type;
\r
1076 if(evt.target) this.target = evt.target;
\r
1077 else if(evt.srcElement) this.target = evt.srcElement;
\r
1079 if(iwfExists(evt.clientX,evt.clientY)) {
\r
1080 this.X = evt.clientX + iwfXScroll();
\r
1081 this.Y = evt.clientY + iwfYScroll();
\r
1082 } else if (iwfExists(evt.offsetX, evt.offsetY)){
\r
1083 this.X = evt.offsetX;
\r
1084 this.Y = evt.offsetY;
\r
1087 if (evt.keyCode) { this.keyCode = evt.keyCode; }
\r
1088 else if (iwfExists(evt.which)) { this.keyCode = evt.which; }
\r
1093 // -----------------------------------
\r
1095 // -----------------------------------
\r
1098 // -----------------------------------
\r
1100 // -----------------------------------
\r
1101 function iwfRollover(id, overurl){
\r
1102 var el = iwfGetById(id);
\r
1104 var rollover = null;
\r
1106 rollover = overurl;
\r
1108 iwfAttribute(el, "rolloversrc");
\r
1110 if (!rollover) return;
\r
1111 el.iwfOrigSrc = el.src;
\r
1112 el.iwfRolloverImg = new Image();
\r
1113 el.iwfRolloverImg.src = rollover;
\r
1114 iwfAddEvent(el, 'onmouseover', iwfDoRollover);
\r
1115 iwfAddEvent(el, 'onmouseout', iwfDoRollover);
\r
1118 function iwfDoRollover(ev){
\r
1119 var evt = new iwfEvent(ev);
\r
1120 var el = evt.target;
\r
1121 if (el.src == el.iwfOrigSrc){
\r
1122 iwfSwapImage(el, el.iwfRolloverImg);
\r
1124 iwfSwapImage(el, el.iwfOrigSrc);
\r
1128 function iwfPreloadImage(id, newimg){
\r
1129 var el = iwfGetById(id);
\r
1131 /* todo: preload images here */
\r
1134 function iwfSwapImage(id, newimg){
\r
1135 var el = iwfGetById(id);
\r
1137 if (iwfIsString(newimg)){
\r
1140 el.src = newimg.src;
\r
1144 // preload images and attach event handlers for rollovers
\r
1145 function iwfMapRollovers(){
\r
1146 var nodes = iwfGetByTagName('img');
\r
1147 for(var i=0;i<nodes.length;i++){
\r
1148 iwfRollover(nodes[i]);
\r
1152 // -----------------------------------
\r
1154 // -----------------------------------
\r
1157 // -----------------------------------
\r
1158 // Begin: Drag-N-Drop
\r
1159 // -----------------------------------
\r
1161 var iwfDragger = {el:null, inUse:false};
\r
1164 function iwfEnableDrag(id, startCallback, dragCallback, endCallback) {
\r
1165 var el = iwfGetById(id);
\r
1167 el.iwfDraggable = true;
\r
1168 el.iwfOnDragStart = startCallback;
\r
1169 el.iwfOnDrag = dragCallback;
\r
1170 el.iwfOnDragEnd = endCallback;
\r
1171 iwfAddEvent(el, 'onmousedown', iwfDragMouseDown);
\r
1172 if (!iwfDragger.inUse) {
\r
1173 iwfDragger.inUse = true;
\r
1174 iwfAddEvent(document, 'onmousemove', iwfDragMouseMove);
\r
1177 function iwfDragMouseDown(ev){
\r
1178 var evt = new iwfEvent(ev);
\r
1179 var el = evt.target;
\r
1180 while(el && !el.iwfDraggable) {
\r
1181 el = iwfParent(el);
\r
1184 if (ev && ev.preventDefault) ev.preventDefault();
\r
1185 else if (window.event) window.event.returnValue = false;
\r
1186 el.iwfDragX = evt.X;
\r
1187 el.iwfDragY = evt.Y;
\r
1189 iwfZIndex(el, iwfHiZ++);
\r
1191 iwfDragger.el = el;
\r
1192 iwfAddEvent(document, 'onmouseup', iwfDragMouseUp, false);
\r
1193 if (el.iwfOnDragStart) {
\r
1194 el.iwfOnDragStart(el, evt.X, evt.Y);
\r
1199 function iwfDragMouseMove(ev){
\r
1200 var evt = new iwfEvent(ev);
\r
1201 if (iwfDragger.el) {
\r
1202 if (ev && ev.preventDefault) ev.preventDefault();
\r
1203 else if (window.event) window.event.returnValue = false;
\r
1204 var el = iwfDragger.el;
\r
1205 var dx = evt.X - el.iwfDragX;
\r
1206 var dy = evt.Y - el.iwfDragY;
\r
1207 el.iwfDragX = evt.X;
\r
1208 el.iwfDragY = evt.Y;
\r
1210 if (el.iwfOnDrag) {
\r
1211 el.iwfOnDrag(el, dx, dy);
\r
1213 iwfX(el, iwfX(el) + dx);
\r
1214 iwfY(el, iwfY(el) + dy);
\r
1218 function iwfDragMouseUp(ev) {
\r
1219 if (iwfDragger.el) {
\r
1220 if (ev && ev.preventDefault) ev.preventDefault();
\r
1221 else if (window.event) window.event.returnValue = false;
\r
1222 iwfRemoveEvent(document, 'onmouseup', iwfDragMouseUp, false);
\r
1223 if (iwfDragger.el.iwfOnDragEnd) {
\r
1224 var evt = new iwfEvent(ev);
\r
1225 iwfDragger.el.iwfOnDragEnd(iwfDragger.el, evt.X, evt.Y);
\r
1227 iwfDragger.el = null;
\r
1231 // -----------------------------------
\r
1232 // End: Drag-N-Drop
\r
1233 // -----------------------------------
\r
1235 // -----------------------------------
\r
1236 // Begin: Initializers
\r
1237 // -----------------------------------
\r
1238 iwfMapRollovers();
\r
1239 // -----------------------------------
\r
1240 // End: Initializers
\r
1241 // -----------------------------------
\r