r8856@llin: dpavlin | 2005-11-14 12:08:11 +0100
[webpac2] / web / iwf / iwfgui.js
1 // -----------------------------------------------------------------------------\r
2 // IWF - Interactive Website Framework.  Javascript library for creating\r
3 // responsive thin client interfaces.\r
4 //\r
5 // Copyright (C) 2005 Brock Weaver brockweaver@gmail.com\r
6 //\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
11 //\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
16 //\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
20 //\r
21 // Brock Weaver\r
22 // brockweaver@gmail.com\r
23 // 1605 NW Maple Pl\r
24 // Ankeny, IA 50021\r
25 // -----------------------------------------------------------------------------\r
26 \r
27 // --------------------------------------------------------------------------\r
28 // iwfgui.js\r
29 //\r
30 // GUI inspection and manipulation functions\r
31 //\r
32 // Dependencies:\r
33 // iwfcore.js\r
34 //\r
35 // Brock Weaver - brockweaver@sourceforge.net - iwf.sourceforge.net\r
36 // v 0.1 - 2005-06-05\r
37 // Initial release.\r
38 // --------------------------------------------------------------------------\r
39 // Issues:\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
44 \r
45 // -----------------------------------\r
46 // Dependency Check\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
49 }\r
50 // -----------------------------------\r
51 \r
52 \r
53 \r
54 // -----------------------------------\r
55 // Begin: Visibility\r
56 // -----------------------------------\r
57 \r
58 function iwfShow(id, reserveSpace){\r
59         var el = iwfGetById(id);\r
60         if (reserveSpace){\r
61                 if (iwfExists(el) && iwfExists(el.style) && iwfExists(el.style.visibility)) el.style.visibility = 'visible';\r
62         } else {\r
63                 if (iwfExists(el) && iwfExists(el.style) && iwfExists(el.style.display)) el.style.display = 'inline';\r
64         }\r
65 }\r
66 \r
67 function iwfHide(id, reserveSpace){\r
68         var el = iwfGetById(id);\r
69         if (reserveSpace){\r
70                 if (el && iwfExists(el.style) && iwfExists(el.style.visibility)) el.style.visibility = 'hidden';\r
71         } else {\r
72                 if (el && iwfExists(el.style) && iwfExists(el.style.display)) el.style.display = 'none';\r
73         }\r
74 }\r
75 \r
76 function iwfHideDelay(id, ms, reserveSpace){\r
77         var el = iwfGetById(id);\r
78         if (!el) return;\r
79 \r
80         // wipeout any other re-visibling timeouts we have (nice spelling, eh?)\r
81         _iwfClearTimeout(el, "hidedelay", "visible", true);\r
82 \r
83         if (ms < 1){\r
84                 iwfHide(el, reserveSpace);\r
85         } else {\r
86                 _iwfSetTimeout(el, "hidedelay", "visible", "iwfHideDelay('" + el.id + "', 0, " + reserveSpace + ")", ms);\r
87         }\r
88 }\r
89 \r
90 function iwfShowDelay(id, ms, reserveSpace){\r
91         var el = iwfGetById(id);\r
92         if (!el) return;\r
93 \r
94         // wipeout any other re-visibling timeouts we have (nice spelling, eh?)\r
95         _iwfClearTimeout(el, "showdelay", "visible", true);\r
96 \r
97         if (ms < 1){\r
98                 iwfShow(el, reserveSpace);\r
99         } else {\r
100                 _iwfSetTimeout(el, "showdelay", "visible", "iwfShowDelay('" + el.id + "', 0, " + reserveSpace + ")", ms);\r
101         }\r
102 }\r
103 \r
104 function iwfShowGently(id, pct, reserveSpace){\r
105 \r
106         var el = iwfGetById(id);\r
107         if (!el) return;\r
108 \r
109         // wipeout any other re-visibling timeouts we have (nice spelling, eh?)\r
110         _iwfClearTimeout(el, "showgently", "visible", true);\r
111 \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
116 \r
117                 // show it\r
118                 iwfShow(el, reserveSpace);\r
119         }\r
120 \r
121         // adjust opacity up by the given percentage\r
122         opacity = iwfOpacity(el, pct, true);\r
123 \r
124         if (opacity < 100) {\r
125                 // set a timeout\r
126                 _iwfSetTimeout(el, "showgently", "visible", "iwfShowGently('" + el.id + "'," + pct + ", " + reserveSpace + ")", 50);\r
127         }\r
128 }\r
129 \r
130 function iwfHideGently(id, pct, reserveSpace){\r
131         var el = iwfGetById(id);\r
132         if (!el) return;\r
133 \r
134         if (iwfIsHidden(el)) return;\r
135 \r
136         // wipeout any other re-visibling timeouts we have (nice spelling, eh?)\r
137         _iwfClearTimeout(el, "hidegently", "visible", true);\r
138 \r
139         var opacity = iwfOpacity(el);\r
140         if (opacity <= 0){\r
141 \r
142                 // hide it\r
143                 iwfHide(el, reserveSpace);\r
144 \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
148 \r
149 \r
150         } else {\r
151                 // make it less opaque...\r
152                 iwfOpacity(el, -pct, true);\r
153 \r
154                 // set our timeout\r
155                 _iwfSetTimeout(el, "hidegently", "visible", "iwfHideGently('" + el.id + "'," + pct + ", " + reserveSpace + ")", 50);\r
156         }\r
157 }\r
158 \r
159 function iwfHideGentlyDelay(id, pct, ms, reserveSpace){\r
160         var el = iwfGetById(id);\r
161         if (!el) return;\r
162 \r
163         if (iwfIsHidden(el)) return;\r
164 \r
165         // wipeout any other re-visibling timeouts we have (nice spelling, eh?)\r
166         _iwfClearTimeout(el, "hidegentlydelay", "visible", true);\r
167 \r
168 \r
169         if (ms < 1){\r
170                 iwfHideGently(el, pct, reserveSpace);\r
171         } else {\r
172                 _iwfSetTimeout(el, "hidegentlydelay", "visible", "iwfHideGentlyDelay('" + el.id + "'," + pct + ", 0, " + reserveSpace + ")", ms);\r
173         }\r
174 \r
175 }\r
176 \r
177 function iwfShowGentlyDelay(id, pct, ms, reserveSpace){\r
178         var el = iwfGetById(id);\r
179         if (!el) return;\r
180 \r
181 \r
182         // wipeout any other re-visibling timeouts we have (nice spelling, eh?)\r
183         _iwfClearTimeout(el, "showgentlydelay", "visible", true);\r
184 \r
185         if (ms < 1){\r
186                 iwfShowGently(el, pct, reserveSpace);\r
187         } else {\r
188                 _iwfSetTimeout(el, "showgentlydelay", "visible", "iwfShowGentlyDelay('" + el.id + "'," + pct + ", 0, " + reserveSpace + ")", ms);\r
189         }\r
190 }\r
191 \r
192 function iwfOpacity(id, pct, relative, keepHiddenIfAlreadyHidden){\r
193         var el = iwfGetById(id);\r
194         if (el){\r
195                 if (iwfExists(pct) && pct != null){\r
196                         // set opacity\r
197                         var newPct = iwfToFloat(pct, true);\r
198                         if (relative){\r
199                                 // lookup current opacity\r
200                                 newPct = iwfOpacity(id, null, false);\r
201 \r
202                                 // modify pct by that much\r
203                                 newPct += pct;\r
204                         }\r
205 \r
206                         if (newPct < 0){\r
207                                 newPct = 0;\r
208                         } else if (newPct > 100){\r
209                                 newPct = 100;\r
210                         }\r
211 \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
215 \r
216                         // also display it if opacity > 0 and !keepHidden\r
217                         if (newPct > 0 && !keepHiddenIfAlreadyHidden){\r
218                                 if (iwfIsHidden(id)){\r
219                                         iwfShow(id);\r
220                                 }\r
221                         }\r
222 \r
223                         return newPct;\r
224 \r
225                 } else {\r
226                         // get current opacity\r
227                         var val = null;\r
228                         if (iwfExists(el.style.opacity)){\r
229                                 if (el.style.opacity == ''){\r
230                                         val = 100;\r
231                                 } else {\r
232                                         val = iwfToFloat(el.style.opacity, 2, true) * 100;\r
233                                 }\r
234                         } else if (iwfExists(el.style.filter)) {\r
235                                 if (el.style.filter){\r
236                                         if (el.style.filter.indexOf("opacity") == 0){\r
237                                                 val = 100;\r
238                                         } else {\r
239                                                 val = iwfToFloat(el.style.filter, 2, true);\r
240                                         }\r
241                                 } else {\r
242                                         val = 100;\r
243                                 }\r
244                         } else if (iwfExists(el.style.mozOpacity)) {\r
245                                 if (el.style.mozOpacity == ''){\r
246                                         val = 100;\r
247                                 } else {\r
248                                         val = iwfToFloat(el.style.mozOpacity, 2, true) * 100;\r
249                                 }\r
250                         }\r
251 \r
252                         return val;\r
253                 }\r
254         }\r
255 }\r
256 \r
257 function iwfIsShown(id){\r
258         return !iwfIsHidden(id);\r
259 }\r
260 \r
261 function iwfIsHidden(id){\r
262         var el = iwfGetById(id);\r
263 //      if (!el) return false;\r
264 \r
265         var hidden = false;\r
266         if (iwfExists(el.style) && iwfExists(el.style.visibility)) {\r
267                 hidden = el.style.visibility == 'hidden';\r
268         }\r
269         if (iwfExists(el.style) && iwfExists(el.style.display)) {\r
270                 hidden = hidden || el.style.display == 'none';\r
271         }\r
272         return hidden;\r
273 }\r
274 \r
275 function iwfToggle(id, reserveSpace){\r
276         if (iwfIsHidden(id)) iwfShow(id, reserveSpace);\r
277         else iwfHide(id, reserveSpace);\r
278 }\r
279 \r
280 \r
281 \r
282 // -----------------------------------\r
283 // End: Visibility\r
284 // -----------------------------------\r
285 \r
286 // -----------------------------------\r
287 // Begin: Timers\r
288 // -----------------------------------\r
289 \r
290 function _iwfSetTimeout(id, name, category, fn, ms){\r
291         var el = iwfGetById(id);\r
292         if (!el) return;\r
293 \r
294         var att = iwfAttribute(el, 'iwfTimeoutCategory' + category);\r
295         if (!att){\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
301         } else {\r
302                 // attribute matches our name.\r
303         }\r
304 \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
309         return true;\r
310 }\r
311 \r
312 function _iwfCheckTimeout(id, name, category){\r
313 //return true;\r
314 \r
315         var el = iwfGetById(id);\r
316         if (!el) return false;\r
317 \r
318         var att = iwfAttribute(el, 'iwfTimeoutCategory' + category);\r
319         if (!att || att == name){\r
320                 return true;\r
321         } else {\r
322                 return false;\r
323         }\r
324 \r
325 }\r
326 \r
327 function _iwfClearTimeout(id, name, category, forceful){\r
328         var el = iwfGetById(id);\r
329         if (!el) return;\r
330 \r
331         var att = iwfAttribute(el, 'iwfTimeoutCategory' + category);\r
332 \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
338         }\r
339 \r
340 }\r
341 \r
342 // BROCK\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
349                 } else {\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
353                                 localFpOrString();\r
354                         } else if (localArgs.length == 1){\r
355                                 localFpOrString(localArgs[0]);\r
356                         } else {\r
357                                 var s = 'localFpOrString(';\r
358                                 for(var i=0;i<localArgs.length;i++){\r
359                                         if (i > 0){\r
360                                                 s += ', ';\r
361                                         }\r
362                                         if(localArgs[i] == null){\r
363                                                 s += 'null';\r
364                                         } else if(iwfIsString(localArgs[i])){\r
365                                                 s += '"' + localArgs[i].replace(/"/gi, '\\"') + '"';\r
366                                         } else {\r
367                                                 s += localArgs[i];\r
368                                         }\r
369                                 }\r
370                                 s += ')';\r
371 //iwfLog("_iwfDelayExpired: calling fp of:\n" + s, true);\r
372                                 eval(s);\r
373                         }\r
374                 }\r
375                 delete localFpOrString;\r
376                 delete localIsString;\r
377                 delete localArgs;\r
378         }\r
379 \r
380         var localFpOrString = fpOrString;\r
381         var localIsString = iwfIsString(fpOrString);\r
382         var localArgs = null;\r
383 \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
390                         }\r
391                 }\r
392         }\r
393         setTimeout(_iwfDelayExpired, ms);\r
394 }\r
395 \r
396 // -----------------------------------\r
397 // End: Timers\r
398 // -----------------------------------\r
399 \r
400 \r
401 // -----------------------------------\r
402 // Begin: Positioning\r
403 // -----------------------------------\r
404 \r
405 function iwfX1(id, newx){\r
406         return iwfX(id, newx);\r
407 }\r
408 \r
409 \r
410 function iwfFocusSelect(id, promptmsg){\r
411         var el = iwfGetById(id);\r
412         if (promptmsg){\r
413                 alert(promptmsg);\r
414         }\r
415         if (!iwfIsHidden(id)){\r
416                 try {\r
417                         el.focus();\r
418                         el.select();\r
419                 } catch(e) { }\r
420         }\r
421         return false;\r
422 }\r
423 \r
424 function iwfFocus(id, promptmsg){\r
425         var el = iwfGetById(id);\r
426         if (promptmsg){\r
427                 alert(promptmsg);\r
428         }\r
429         if (!iwfIsHidden(id)){\r
430                 try {\r
431                         el.focus();\r
432                 } catch(e) { }\r
433         }\r
434         return false;\r
435 }\r
436 \r
437 \r
438 \r
439 function iwfX(id, newx){\r
440         var absx = 0;\r
441 \r
442         if (iwfIsNumber(newx)) {\r
443                 absx = iwfSetX(id, newx);\r
444         } else {\r
445                 var el = iwfGetById(id);\r
446                 if (!el) return 0;\r
447                 if (iwfIsString(el.style.left) && el.style.left.length > 0){\r
448                         absx = iwfToInt(el.style.left, true);\r
449                         if (isNaN(absx)) {\r
450                                 absx = 0;\r
451                         }\r
452                 } else if (iwfExists(el.style.pixelLeft) && el.style.pixelLeft) {\r
453                         absx = el.style.pixelLeft;\r
454                 } else {\r
455                         while (el) {\r
456                                 if (iwfExists(el.offsetLeft)) absx += el.offsetLeft;\r
457                                 el = iwfGetParent(el, true);\r
458                         }\r
459                 }\r
460         }\r
461 \r
462         return absx;\r
463 }\r
464 \r
465 function iwfSetX(id, newx){\r
466         var el = iwfGetById(id);\r
467         if (!el) return;\r
468         if(iwfExists(el.style) && iwfIsString(el.style.left)) {\r
469                 el.style.left = newx + 'px';\r
470         }\r
471         else if(iwfExists(el.style) && iwfExists(el.style.pixelLeft)) {\r
472                 el.style.pixelLeft = newx;\r
473         }\r
474         else if(iwfExists(el.left)) {\r
475                 el.left = newx;\r
476         }\r
477         return newx;\r
478 }\r
479 \r
480 function iwfY1(id, newy){\r
481         var el = iwfGetById(id);\r
482         return iwfY(el, newy);\r
483 }\r
484 \r
485 function iwfY(id, newy){\r
486         var absy = 0;\r
487 \r
488         if (iwfIsNumber(newy)) {\r
489                 absy = iwfSetY(id, newy);\r
490         } else {\r
491                 var el = iwfGetById(id);\r
492                 if (!el) return 0;\r
493 \r
494                 if (iwfIsString(el.style.top) && el.style.top.length > 0){\r
495                         absy = iwfToInt(el.style.top, true);\r
496                         if (isNaN(absy)) {\r
497                                 absy = 0;\r
498                         }\r
499                 } else if (iwfExists(el.style.pixelTop) && el.style.pixelTop) {\r
500                         absy = el.style.pixelTop;\r
501                 } else {\r
502                         while (el) {\r
503                                 if (iwfExists(el.offsetTop)) absy += el.offsetTop;\r
504                                 el = iwfGetParent(el, true);\r
505                         }\r
506                 }\r
507         }\r
508 \r
509         return absy;\r
510 }\r
511 \r
512 function iwfSetY(id, newy){\r
513         var el = iwfGetById(id);\r
514         if (!el) return;\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
521                         el.top = newy;\r
522                 }\r
523         }\r
524         return newy;\r
525 }\r
526 \r
527 function iwfZIndex(id, z){\r
528         var el = iwfGetById(id);\r
529         if (iwfExists(el)){\r
530                 if (iwfExists(z)){\r
531                         el.style.zIndex = z;\r
532                 }\r
533                 return parseInt(el.style.zIndex);\r
534         }\r
535         return 0;\r
536 }\r
537 \r
538 function iwfMoveTo(id1, xDest, yDest, totalTicks, motionType){\r
539 \r
540         var el = iwfGetById(id1);\r
541 \r
542         if (el){\r
543                 var origX = iwfX1(el);\r
544                 var origY = iwfY1(el);\r
545 \r
546                 // wipeout any other repositioning timeouts we have...\r
547                 _iwfClearTimeout(el, "moveto", "position", true);\r
548 \r
549                 // move any elements we have docked to us\r
550                 _iwfMoveDockedItems(el, xDest, yDest, totalTicks, motionType);\r
551 \r
552                 if (!totalTicks){\r
553                         // do it immediately.\r
554                         iwfX1(id1, xDest);\r
555                         iwfY1(id1, yDest);\r
556                 } else {\r
557                         // animate the movement\r
558                         _iwfMoveTo(id1, origX, origY, xDest, yDest, totalTicks, totalTicks, motionType);\r
559                 }\r
560         }\r
561 \r
562 }\r
563 \r
564 function _iwfMoveDockedItems(id, xDest, yDest, totalTicks, motionType){\r
565         var elMaster = iwfGetById(id);\r
566         if (elMaster){\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
575                                 if (elSlave){\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
582                                 }\r
583                         }\r
584                 }\r
585         }\r
586 }\r
587 \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
591         if (!el){\r
592 //iwfLog("could not locate el with id of " + id1);\r
593         } else {\r
594                 el_id = iwfAttribute(el, 'id');\r
595 \r
596                 _iwfClearTimeout(el, "moveto", "position", true);\r
597 \r
598 \r
599                 var elX = iwfX1(el);\r
600                 var elY = iwfY1(el);\r
601 \r
602                 // hack for floating point anomolies -- stops animation when element is "close enough"\r
603                 var epsilon = 0.001;\r
604 \r
605                 var xDone = false;\r
606                 if (elX > xDest){\r
607                         if (xDest + epsilon > elX){\r
608                                 xDone = true;\r
609                         }\r
610                 } else {\r
611                         if (xDest - epsilon < elX){\r
612                                 xDone = true;\r
613                         }\r
614                 }\r
615 \r
616                 var yDone = false;\r
617                 if (elY > yDest){\r
618                         if (yDest + epsilon > elY){\r
619                                 yDone = true;\r
620                         }\r
621                 } else {\r
622                         if (yDest - epsilon < elY){\r
623                                 yDone = true;\r
624                         }\r
625                 }\r
626 \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
630                         iwfX1(el, xDest);\r
631                         iwfY1(el, yDest);\r
632 \r
633                 } else {\r
634 \r
635                         var pctLeft = ticksLeft / totalTicks;\r
636 \r
637                         var xTotal = xDest - xOrig;\r
638                         var yTotal = yDest - yOrig;\r
639 \r
640                         var xCur, yCur, rt;\r
641 \r
642                         switch(motionType){\r
643                                 case 'd':\r
644                                 case 'dec':\r
645                                 default:\r
646                                         rt = pctLeft * pctLeft * pctLeft * pctLeft * pctLeft * pctLeft;\r
647                                         xCur = xOrig + (xTotal - (rt * xTotal));\r
648                                         yCur = yOrig + (yTotal - (rt * yTotal));\r
649                                         break;\r
650                                 case 'a':\r
651                                 case 'acc':\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
656                                         break;\r
657                                 case 'b':\r
658                                 case 'both':\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
664 \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
671 \r
672                                         } else {\r
673                                                 // between 1/4 and 3/5 done -- linear\r
674                                                 xCur = xOrig + (pctLeft * xTotal);\r
675                                                 yCur = yOrig + (pctLeft * yTotal);\r
676                                         }\r
677                                         break;\r
678                                 case 'lin':\r
679                                 case 'linear':\r
680                                 case 'l':\r
681                                         // use linear motion\r
682                                         xCur = xOrig + (pctLeft * xTotal);\r
683                                         yCur = yOrig + (pctLeft * yTotal);\r
684                                         break;\r
685                         }\r
686 \r
687                         iwfX1(el, xCur);\r
688                         iwfY1(el, yCur);\r
689 \r
690 \r
691                         ticksLeft--;\r
692 \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
696                 }\r
697         }\r
698 }\r
699 \r
700 function iwfUnDockFrom(id1, id2){\r
701         var elSlave = iwfGetById(id1);\r
702 \r
703         if (elSlave){\r
704                 var slaveId = iwfAttribute(elSlave, 'id');\r
705                 // determine who elSlave is docked to\r
706                 var dockedTo = iwfAttribute(elSlave, 'iwfDockedTo');\r
707                 if (dockedTo){\r
708                         // elSlave says he's docked to the guy with id of dockedTo.\r
709                         // grab that guy.\r
710                         var elMaster = iwfGetById(dockedTo);\r
711 //iwfLog("dockedTo:" + iwfAttribute(elMaster, 'id'), true);\r
712                         if (elMaster){\r
713                                 // elMaster is the guy elSlave is docked to.\r
714                                 // tell elMaster to remove elSlave from his docker list\r
715 \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
722                                         }\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
729 \r
730                                                         var output = arrDockers.join(",");\r
731 //iwfLog("writing iwfDockers=" + output);\r
732 \r
733                                                         // write this back to elMaster\r
734                                                         iwfAttribute(elMaster, 'iwfDockers', output);\r
735                                                         break;\r
736                                                 }\r
737                                         }\r
738                                 }\r
739                         }\r
740                         // tell elSlave he's no longer docked to elMaster.\r
741                         iwfAttribute(elSlave, 'iwfDockedTo', null);\r
742                 }\r
743         }\r
744 }\r
745 \r
746 function iwfAlignTo(id1, id2, anchor1, anchor2, totalTicks, motionType){\r
747         var elMover = iwfGetById(id1);\r
748         var elStays = iwfGetById(id2);\r
749 \r
750         if (elMover && elStays){\r
751 \r
752                 var newX = iwfX(elStays);\r
753                 var newY = iwfY(elStays);\r
754 \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
761                 }\r
762 \r
763                 var moverWidth;\r
764                 var staysWidth;\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
771                 }\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
776                 }\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
783                 }\r
784 \r
785 iwfLog(iwfAttribute(elMover, 'id') + ' width:' + moverWidth + '\n' + iwfAttribute(elStays, 'id') + ' width:' + staysWidth);\r
786 \r
787                 // move to those alignment points\r
788                 iwfMoveTo(elMover, newX, newY, totalTicks, totalTicks, motionType);\r
789         }\r
790 }\r
791 \r
792 function iwfDockTo(id1, id2, anchor1, anchor2, totalTicks, motionType){\r
793         var elSlave = iwfGetById(id1);\r
794         var elMaster = iwfGetById(id2);\r
795 \r
796         if (elSlave && elMaster){\r
797 \r
798                 // dock elSlave to elMaster...\r
799 \r
800                 // pull all items currently docked to elMaster\r
801                 var dockers = iwfAttribute(elMaster,'iwfDockers');\r
802                 // append elSlave to that list\r
803                 if(!dockers){\r
804                         dockers = iwfAttribute(elSlave, 'id');\r
805                 } else {\r
806                         var arrDockers = dockers.split(",");\r
807                         if (arrDockers.length == 0){\r
808                                 arrDockers = new Array(dockers);\r
809                         }\r
810 \r
811                         var slaveId = iwfAttribute(elSlave, 'id');\r
812                         var found = false;\r
813                         for(var i=0;i<arrDockers.length;i++){\r
814                                 if (arrDockers[i] == slaveId){\r
815                                         found = true;\r
816                                 }\r
817                         }\r
818                         if (!found){\r
819                                 // elSlave is not in elMaster's list of dockers yet.  add him.\r
820                                 dockers += "," + iwfAttribute(elSlave, 'id');\r
821                         }\r
822                 }\r
823 \r
824                 // write list back to elMaster\r
825                 iwfAttribute(elMaster, 'iwfDockers', dockers);\r
826 \r
827                 // have elSlave remember who he's docked to\r
828                 iwfAttribute(elSlave, 'iwfDockedTo', iwfAttribute(elMaster, 'id'));\r
829 \r
830 \r
831 //iwfLog("dockers for " + iwfAttribute(elMaster, 'id') + " = " + dockers, true);\r
832 \r
833 \r
834                 iwfAlignTo(elSlave, elMaster, anchor1, anchor2, totalTicks, motionType);\r
835 \r
836         }\r
837 \r
838 \r
839 }\r
840 \r
841 function iwfXScroll(id) {\r
842         var scrollx=0;\r
843         var el = iwfGetById(id);\r
844         if (!el){\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
847         } else {\r
848                 if (iwfIsNumber(el.scrollLeft)) scrollx = el.scrollLeft;\r
849         }\r
850         return scrollx;\r
851 }\r
852 function iwfYScroll(id) {\r
853         var scrolly=0;\r
854         var el = iwfGetById(id);\r
855         if (!el){\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
858         } else {\r
859                 if (iwfIsNumber(el.scrollTop)) scrolly = el.scrollTop;\r
860         }\r
861         return scrolly;\r
862 }\r
863 \r
864 \r
865 \r
866 // -----------------------------------\r
867 // End: Positioning\r
868 // -----------------------------------\r
869 \r
870 // -----------------------------------\r
871 // Begin: Size\r
872 // -----------------------------------\r
873 \r
874 function iwfWidth(id, neww){\r
875 \r
876 \r
877 \r
878         var el = iwfGetById(id);\r
879         if (!el) return 0;\r
880         var w = 0;\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
889                         } else {\r
890                                 w = -1;\r
891                         }\r
892                 } else if (iwfExists(el.clip) && iwfExists(el.clip.right)) {\r
893                         if(newh) e.clip.right = neww;\r
894                         w = el.clip.right;\r
895                 } else {\r
896                         w = -2;\r
897                 }\r
898 \r
899 //iwfLog('width of ' + iwfAttribute(el, 'id') + ' = ' + w, true);\r
900 \r
901         }\r
902 \r
903         return w;\r
904 \r
905 \r
906 \r
907 //      var el = iwfGetById(id);\r
908 //      var w = 0;\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
913 //              }\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
917 //              }\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
921 //              }\r
922 //      }\r
923 //      return w;\r
924 }\r
925 \r
926 function iwfHeight(id, newh){\r
927         var el = iwfGetById(id);\r
928         if (!el) return 0;\r
929         var h = 0;\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
938                         } else {\r
939                                 h = -1;\r
940                         }\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
944                 } else {\r
945                         h = -2;\r
946                 }\r
947         }\r
948         return h;\r
949 }\r
950 \r
951 function iwfY2(id, y2){\r
952         var el = iwfGetById(id);\r
953         if (iwfExists(el)) {\r
954                 var y1 = iwfY(el);\r
955                 if (iwfExists(y2)){\r
956                         var h = iwfHeight(el);\r
957                         iwfHeight(el, y1 + h);\r
958                 }\r
959                 return y1 + iwfHeight(el);\r
960         }\r
961         return 0;\r
962 }\r
963 \r
964 function iwfX2(id, x2){\r
965         var el = iwfGetById(id);\r
966         if (iwfExists(el)) {\r
967                 var x1 = iwfX(id);\r
968                 if (iwfExists(x2)){\r
969                         var w = iwfWidth(id);\r
970                         iwfWidth(id, x1 + h);\r
971                 }\r
972                 return x1 + iwfWidth(el);\r
973         }\r
974         return 0;\r
975 }\r
976 \r
977 function iwfDetermineStyle(el,prop){\r
978         return parseInt(document.defaultView.getComputedStyle(el,'').getPropertyValue(prop),10);\r
979 }\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
987 \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
994                 }\r
995         } else if(iwfExists(el.offsetWidth,el.style.width)){\r
996                 el.style.width = neww + 'px';\r
997                 padl=el.offsetWidth - neww;\r
998         }\r
999 \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
1004 \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
1008 }\r
1009 \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
1023                 }\r
1024         } else if(iwfExists(el.offsetHeight, el.style.height)){\r
1025                 el.style.height = newh + 'px';\r
1026                 padt = el.offsetHeight - newh;\r
1027         }\r
1028 \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
1033 \r
1034         var h2 = newh - padt - padb - bdrt - bdrb;\r
1035 \r
1036         if(isNaN(h2) || h2 < 0) return;\r
1037         else el.style.height = h2 + 'px';\r
1038 }\r
1039 \r
1040 \r
1041 // -----------------------------------\r
1042 // End: Size\r
1043 // -----------------------------------\r
1044 \r
1045 // -----------------------------------\r
1046 // Begin: Event\r
1047 // -----------------------------------\r
1048 \r
1049 function iwfAddEvent(id,eventName,callback) {\r
1050         var el = iwfGetById(id);\r
1051         if (!el) return;\r
1052         if (el.attachEvent) {\r
1053                 el.attachEvent(eventName, callback);\r
1054         } else {\r
1055                 el[eventName] = callback;\r
1056         }\r
1057 }\r
1058 \r
1059 function iwfRemoveEvent(id, eventName, callback){\r
1060         var el = iwfGetById(id);\r
1061         if (!el) return;\r
1062         if (el.detachEvent) el.detachEvent(eventName, callback);\r
1063         else eval('el.' + eventName + ' = null;');\r
1064 }\r
1065 \r
1066 function iwfEvent(ev) {\r
1067         this.keyCode = 0;\r
1068         this.target = null;\r
1069         this.type = '';\r
1070         this.X = 0;\r
1071         this.Y = 0;\r
1072         var evt = ev || window.event;\r
1073         if(!evt) return;\r
1074 \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
1078 \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
1085         }\r
1086 \r
1087         if (evt.keyCode) { this.keyCode = evt.keyCode; }\r
1088         else if (iwfExists(evt.which)) { this.keyCode = evt.which; }\r
1089 \r
1090         return this;\r
1091 }\r
1092 \r
1093 // -----------------------------------\r
1094 // End: Event\r
1095 // -----------------------------------\r
1096 \r
1097 \r
1098 // -----------------------------------\r
1099 // Begin: Image\r
1100 // -----------------------------------\r
1101 function iwfRollover(id, overurl){\r
1102         var el = iwfGetById(id);\r
1103         if (!el) return;\r
1104         var rollover = null;\r
1105         if (overurl){\r
1106                 rollover = overurl;\r
1107         } else {\r
1108                 iwfAttribute(el, "rolloversrc");\r
1109         }\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
1116 }\r
1117 \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
1123         } else {\r
1124                 iwfSwapImage(el, el.iwfOrigSrc);\r
1125         }\r
1126 }\r
1127 \r
1128 function iwfPreloadImage(id, newimg){\r
1129         var el = iwfGetById(id);\r
1130         if (!el) return;\r
1131         /* todo: preload images here */\r
1132 }\r
1133 \r
1134 function iwfSwapImage(id, newimg){\r
1135         var el = iwfGetById(id);\r
1136         if (!el) return;\r
1137         if (iwfIsString(newimg)){\r
1138                 el.src = newimg;\r
1139         } else {\r
1140                 el.src = newimg.src;\r
1141         }\r
1142 }\r
1143 \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
1149         }\r
1150 }\r
1151 \r
1152 // -----------------------------------\r
1153 // End: Image\r
1154 // -----------------------------------\r
1155 \r
1156 \r
1157 // -----------------------------------\r
1158 // Begin: Drag-N-Drop\r
1159 // -----------------------------------\r
1160 \r
1161 var iwfDragger = {el:null, inUse:false};\r
1162 var iwfHiZ = 2;\r
1163 \r
1164 function iwfEnableDrag(id, startCallback, dragCallback, endCallback) {\r
1165         var el = iwfGetById(id);\r
1166         if (!el) return;\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
1175         }\r
1176 }\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
1182         }\r
1183         if (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
1188 \r
1189                 iwfZIndex(el, iwfHiZ++);\r
1190 \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
1195                 }\r
1196         }\r
1197 }\r
1198 \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
1209 \r
1210                 if (el.iwfOnDrag) {\r
1211                         el.iwfOnDrag(el, dx, dy);\r
1212                 } else {\r
1213                         iwfX(el, iwfX(el) + dx);\r
1214                         iwfY(el, iwfY(el) + dy);\r
1215                 }\r
1216         }\r
1217 }\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
1226                 }\r
1227                 iwfDragger.el = null;\r
1228         }\r
1229 }\r
1230 \r
1231 // -----------------------------------\r
1232 // End: Drag-N-Drop\r
1233 // -----------------------------------\r
1234 \r
1235 // -----------------------------------\r
1236 // Begin: Initializers\r
1237 // -----------------------------------\r
1238 iwfMapRollovers();\r
1239 // -----------------------------------\r
1240 // End: Initializers\r
1241 // -----------------------------------\r