Commit 8abde1193d1373b6d1adb97182d980e5dc999604

Authored by Edmar Moretti
1 parent 7c46aa05

--no commit message

pacotes/balloon-tooltips/htdocs/balloons.html 0 → 100644
... ... @@ -0,0 +1,258 @@
  1 +<html>
  2 +<head>
  3 + <title>Balloon Tooltips</title>
  4 + <script type="text/javascript" src="js/balloon.config.js"></script>
  5 + <script type="text/javascript" src="js/balloon.js"></script>
  6 + <script type="text/javascript" src="js/box.js"></script>
  7 + <script type="text/javascript" src="js/yahoo-dom-event.js"></script>
  8 + <!-- Note: This CSS is specific to this page -- it is not required for balloon tooltips to work -->
  9 + <style>
  10 + .tt {
  11 + background-color:lightsteelblue;
  12 + color:blue;
  13 + text-decoration:none;
  14 + cursor:pointer;
  15 + }
  16 + .hidden {
  17 + display:none;
  18 + }
  19 + pre {
  20 + background-color:gainsboro;
  21 + padding:10px;
  22 + margin-left:20px;
  23 + margin-right:20px;
  24 + font-family:courier;
  25 + font-size:90%;
  26 + }
  27 + b.y { background-color:yellow }
  28 + </style>
  29 +
  30 + <script type="text/javascript">
  31 + // white balloon with default configuration
  32 + var balloon = new Balloon;
  33 + BalloonConfig(balloon,'GBubble');
  34 +
  35 + // plain balloon tooltip
  36 + var tooltip = new Balloon;
  37 + BalloonConfig(tooltip,'GPlain');
  38 +
  39 + // fading balloon
  40 + var fader = new Balloon;
  41 + BalloonConfig(fader,'GFade');
  42 +
  43 + // a plainer popup box
  44 + var box = new Box;
  45 + BalloonConfig(box,'GBox');
  46 +
  47 + // a box that fades in/out
  48 + var fadeBox = new Box;
  49 + BalloonConfig(fadeBox,'GBox');
  50 + fadeBox.bgColor = 'black';
  51 + fadeBox.fontColor = 'white';
  52 + fadeBox.borderStyle = 'none';
  53 + fadeBox.delayTime = 200;
  54 + fadeBox.allowFade = true;
  55 + fadeBox.fadeIn = 750;
  56 + fadeBox.fadeOut = 200;
  57 +
  58 + </script>
  59 +</head>
  60 +<body>
  61 +<div style="border:1px solid blue;background:ivory;padding:10px;font-family:arial, sans-serif">
  62 +<img style="float:right" src="images/sample.png" width=300>
  63 +</span>
  64 +<span id="sheldon" style="display:none">
  65 +<center>
  66 +<img src="images/sheldon.jpg">
  67 +<br>mckays@cshl.edu
  68 +</center>
  69 +</span>
  70 +<br>
  71 +<ul>
  72 +<li>This page is a demonstration of <a href="http://www.gmod.org/wiki/index.php/Popup_Balloons">balloon.js</a>.</li>
  73 +<li>Contact <a href="mailto:mckays@cshl.edu">the author</a> for help.</li>
  74 +</ul>
  75 +<p>
  76 +The balloon.js package is written in object-oriented JavaScript and allows you to add configurable balloon tooltips
  77 +(AKA popup balloons, bubbles, rollover tooltips etc., etc.) to your website. It is generic and is portable to most web sites.
  78 +<p>
  79 +The balloons are dynamically sized in both the vertical and horizontal dimensions and the left/right/up/down orientation
  80 +is calculated automatically based on the position of the cursor. Balloon contents can be provided locally in your own HTML or remotely via AJAX.
  81 +This package is open source and free to all as long as the copyright notice is retained. See below for demonstrations and documentation.
  82 +</p>
  83 +
  84 +
  85 +<hr>
  86 +<h1 style="align:left">Demo:</h1>
  87 +<div style="border:1px solid black;width:90%;margin:auto">
  88 +<table cellpadding=3 style="width:100%">
  89 +<tr>
  90 +<th width=10% align=left rowspan=2>Demonstration:</th>
  91 +<th width=30% class="tt" style="border:1px solid black"
  92 + onmouseover="balloon.showTooltip(event,'This is a balloon tooltip. \
  93 + It will vanish if you leave this box',0,250)">mouse over this box</th>
  94 +<th width=30% class="tt">
  95 +<span onmouseover="balloon.showTooltip(event,'Your are hovering, I said click me!')"
  96 + onclick="balloon.showTooltip(event,'Your sticky message goes here.',1)">click me</span>
  97 +</th>
  98 +<th width=30% class="tt"><span onmouseover="tooltip.showTooltip(event,'This is a plain balloon.<br>Your message goes here!')">plainer balloon</span></th>
  99 +</tr>
  100 +<tr>
  101 +<th class="tt"><span onmouseover="fader.showTooltip(event,'Your message goes here!')">fading balloon</span></th>
  102 +<th class="tt"><span onmouseover="fadeBox.showTooltip(event,'Your message goes here!')">fading box</span></th>
  103 +<th class="tt"><span onmouseover="box.showTooltip(event,'Your sticky message goes here!<br><a href=\'http://www.google.com\'>Your link goes here...</span>',1,275)">
  104 +sticky box</span></th>
  105 +</tr>
  106 +<tr>
  107 +<th align=left>Documentation:</th>
  108 +<th colspan=3 align=left class=tt>
  109 +<a class=tt href="http://gmod.org/wiki/Popup_Balloons"
  110 + onmouseover="balloon.showTooltip(event,'Click this link to go to documentation on the GMOD Wiki')"
  111 + onmouseout="alert('Read the docs, when you get a chance...')">
  112 +http://gmod.org/wiki/Popup_Balloons
  113 +</th>
  114 +</tr>
  115 +<tr>
  116 +<th align=left>Download:</th>
  117 +<th class=tt colspan=3 align=left>
  118 +<a class=tt href="http://mckay.cshl.edu/downloads/balloons.tar.gz"
  119 + onmouseover="box.showTooltip(event,'Click to download the whole package, with all required scripts, images, etc',0,300)">
  120 +balloons.tar.gz</a>
  121 +<font color="black">
  122 +or for windows users...
  123 +</font>
  124 +<a class=tt href="http://mckay.cshl.edu/downloads/balloons.zip"
  125 + onmouseover="box.showTooltip(event,'Click to download the whole package. Try this if your unzip program complains that the tar.gz file is corrupted')">
  126 +balloons.zip
  127 +</a>
  128 +
  129 +</th>
  130 +</tr>
  131 +</table>
  132 +</div>
  133 +</div>
  134 +<br>
  135 +
  136 +<!-- These hidden elements contain balloon contents -->
  137 +<div id="lorem1" class="hidden">
  138 +Lorem ipsum dolor sit amet, <b><i>consectetuer adipiscing elit</b></i>. Vestibulum iaculis,
  139 +ligula quis fringilla volutpat, metus mi molestie lorem, <span style="color:red">quis accumsan pede
  140 +turpis nec metus.</span> Lorem ipsum dolor sit amet, consectetuer adipiscing elit.'
  141 +</div>
  142 +
  143 +<div id="lorem2" class="hidden">
  144 +<a href="http://www.lipsum.com" target="_new" style="color:blue">What is <i>Lorem ipsum...</i>?</a>
  145 +Lorem ipsum dolor sit amet, <b><i>consectetuer adipiscing elit</b></i>. Vestibulum iaculis
  146 +, ligula quis fringilla volutpat, metus mi molestie lorem, quis accumsan pede
  147 +turpis nec metus. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
  148 +</div>
  149 +
  150 +<p>
  151 +This is an example of a simple balloon <span class=tt onmouseover="balloon.showTooltip(event,'I am a simple message...')">message</span>
  152 +
  153 +<pre>
  154 + &lt;span onmouseover="<b class=y>balloon</b>.showTooltip(event,'I am a simple message...')"&gt;message&lt;/span&gt;
  155 +</pre>
  156 +
  157 +This is an example of the same message with a different balloon <span class=tt
  158 +onmouseover="tooltip.showTooltip(event,'I am a simple message...')">style</span>
  159 +
  160 +<pre>
  161 + onmouseover="<b class=y>tooltip</b>.showTooltip(event,'I am a simple message...')"&gt;message&lt;/span&gt;
  162 +</pre>
  163 +
  164 +This is an example of the same message with a box <span class=tt
  165 +onmouseover="box.showTooltip(event,'I am a simple message...')">style</span>
  166 +
  167 +<pre>
  168 + onmouseover="<b class=y>box</b>.showTooltip(event,'I am a simple message...')"&gt;message&lt;/span&gt;
  169 +</pre>
  170 +
  171 +</p>
  172 +
  173 +<p>
  174 +Roll over <span class=tt onmouseover="balloon.showTooltip(event,'load:lorem1')">
  175 +this text</span> for an example of HTML-formatted text loaded from a hidden &lt;div&gt; element.
  176 +<pre>
  177 + onmouseover="balloon.showTooltip(event,<b class=y>'load:lorem1'</b>)"
  178 + ...
  179 + &lt;div id="lorem1" style="display:none"&gt;
  180 + Lorem ipsum dolor sit amet, &lt;b&gt;&lt;i&gt;consectetuer adipiscing elit&lt;/b&gt;&lt;/i&gt;. Vestibulum iaculis,
  181 + ligula quis fringilla volutpat, metus mi molestie lorem, &lt;span style=&#34color:red&#34;&gt;quis accumsan pede
  182 + turpis nec metus.&lt;/span&gt; Lorem ipsum dolor sit amet, consectetuer adipiscing elit.'
  183 + &lt;/div&gt;
  184 +
  185 +</pre>
  186 +
  187 +<span id=sticky>
  188 +Adding a third argument makes the tooltip <span class=tt
  189 +onmouseover="balloon.showTooltip(event,'load:lorem2',1)">sticky</span>.</span>
  190 +<pre>
  191 + onmouseover="balloon.showTooltip(event,'load:lorem2',<b class=y>1</b>)"
  192 +</pre>
  193 +
  194 +A fourth argument will set the width (Example:<span class=tt
  195 +onmouseover="balloon.showTooltip(event,'load:lorem2',1,300)">
  196 +300px sticky balloon</span>)
  197 +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Try a <span class=tt
  198 +onmouseover="tooltip.showTooltip(event,'load:lorem2',1,300)">plain version</span>
  199 +
  200 +<pre>
  201 + onmouseover="balloon.showTooltip(event,'load:lorem2',1,<b class=y>300</b>)"
  202 +</pre>
  203 +
  204 +Now let's try that with a <span class=tt
  205 +onmouseover="box.showTooltip(event,'load:lorem2',1,300)">
  206 +sticky box</span>.
  207 +
  208 +<pre>
  209 + onmouseover="box.showTooltip(event,'load:lorem2',1,<b class=y>300</b>)"
  210 +</pre>
  211 +
  212 +The height can also be specified with a fifth argument (Example:<span class=tt
  213 +onmouseover="balloon.showTooltip(event,'load:lorem2',1,250,250)">
  214 +250px x 250px sticky balloon</span>)
  215 +
  216 +<pre>
  217 + onmouseover="balloon.showTooltip(event,'load:lorem2',1,<b class=y>250</b>,<b class=y>250</b>)"
  218 +</pre>
  219 +
  220 +
  221 +If the balloon contents are too large for the specified dimensions, you will <span class=tt
  222 +onmouseover="balloon.showTooltip(event,'load:lorem2',1,150,150)">scrollbars for sticky balloons</span>
  223 +and <span class=tt onmouseover="balloon.showTooltip(event,'load:lorem2',0,150,150)">clipping for non-sticky balloons</span>.
  224 +
  225 +<pre>
  226 + onmouseover="balloon.showTooltip(event,'load:lorem2',1,<b class=y>150</b>,<b class=y>150</b>)"
  227 +</pre>
  228 +
  229 +</p>
  230 +
  231 +<p>
  232 +Here is an example of a tooltip balloon that is populated by an
  233 +<span class=tt
  234 +onmouseover="balloon.showTooltip(event,'<img height=150 src=\'images/balloons.png\' />')">
  235 +image</span>.
  236 +<pre>
  237 + onmouseover="balloon.showTooltip(event,'&lt;img height=150 src=\'images/balloons.png\' /&gt;')"
  238 +</pre>
  239 +</p>
  240 +
  241 +<img src="images/balloons.png" onmouseover="balloon.showTooltip(event,'my message')" />
  242 +
  243 +<p>
  244 +This creates a sticky balloon whose contents are from an external website.
  245 +<span class=tt
  246 +onmouseover="balloon.showTooltip(event,'<iframe style=\'width:300;height:290\' frameborder=0 src=\'http://m.nypost.com\'></iframe>',1)">
  247 +What's new at the NY Post?</span><br>
  248 +
  249 +<b>Note: </b> This requires an embedded iframe because it is an external website.
  250 +<pre>
  251 +&lt;span onmouseover="balloon.showTooltip(event,'&lt;iframe style=\'width:300;height:290\' frameborder=0 src=\'http://m.nypost.com\'&gt;&lt;/iframe&gt;',1)"&gt;
  252 +What's new at the NY Post?&lt;/span&gt;
  253 +</pre>
  254 +<br>
  255 +Ajax methods are <a href="http://gmod.org/wiki/Popup_Balloons#Using_AJAX_to_get_balloon_contents">also available</a>.
  256 +</p>
  257 +</body>
  258 +</html>
... ...
pacotes/balloon-tooltips/htdocs/images/GBubble/balloon.png 0 → 100644

10.1 KB

pacotes/balloon-tooltips/htdocs/images/GBubble/balloon_ie.png 0 → 100644

13.5 KB

pacotes/balloon-tooltips/htdocs/images/GBubble/close.png 0 → 100644

333 Bytes

pacotes/balloon-tooltips/htdocs/images/GBubble/down_left.png 0 → 100644

582 Bytes

pacotes/balloon-tooltips/htdocs/images/GBubble/down_right.png 0 → 100644

578 Bytes

pacotes/balloon-tooltips/htdocs/images/GBubble/up_left.png 0 → 100644

584 Bytes

pacotes/balloon-tooltips/htdocs/images/GBubble/up_right.png 0 → 100644

588 Bytes

pacotes/balloon-tooltips/htdocs/images/GPlain/balloon.png 0 → 100644

5.12 KB

pacotes/balloon-tooltips/htdocs/images/GPlain/close.png 0 → 100644

333 Bytes

pacotes/balloon-tooltips/htdocs/images/GPlain/down_left.png 0 → 100644

151 Bytes

pacotes/balloon-tooltips/htdocs/images/GPlain/down_right.png 0 → 100644

149 Bytes

pacotes/balloon-tooltips/htdocs/images/GPlain/up_left.png 0 → 100644

153 Bytes

pacotes/balloon-tooltips/htdocs/images/GPlain/up_right.png 0 → 100644

153 Bytes

pacotes/balloon-tooltips/htdocs/images/balloons.png 0 → 100644

14.5 KB

pacotes/balloon-tooltips/htdocs/js/balloon.config.js 0 → 100644
... ... @@ -0,0 +1,100 @@
  1 +/*
  2 +
  3 +This file contains the default configuration options for balloon tooltips.
  4 +Default options can be edited in this file or changed after the Balloon object is
  5 +initiliazed as follows:
  6 +
  7 + var balloon = new Balloon;
  8 + balloon.fontColor = 'black';
  9 + balloon.fontFamily = 'Arial, sans-serif';
  10 + balloon.fontSize = '12pt';
  11 + etc...
  12 +
  13 +*/
  14 +
  15 +// This function adds the default configuration and also custom
  16 +// configuration sets, specified in 'case' stanzas
  17 +BalloonConfig = function(balloon, set) {
  18 + set = set || '';
  19 +
  20 + ////////////////////////////////////////////////////////////////
  21 + // The default "base" config applied to all balloon objects. //
  22 + // See http://gmod.org/wiki/Popup_Balloons#Customization for //
  23 + // details about config options //
  24 + // //
  25 + // values can be overriden in custom config cases (see below) //
  26 + ////////////////////////////////////////////////////////////////
  27 + if (!balloon.configured || set == 'GBubble' || set == 'GBox') { //
  28 + balloon.fontColor = 'black'; //
  29 + balloon.fontFamily = 'Arial, sans-serif'; //
  30 + balloon.fontSize = '12pt'; //
  31 + balloon.minWidth = 100; //
  32 + balloon.maxWidth = 400; //
  33 + balloon.delayTime = 750; //
  34 + balloon.vOffset = 10; //
  35 + balloon.hOffset = 10; //
  36 + balloon.stem = true; //
  37 + balloon.images = i3GEO.configura.locaplic+'/pacotes/balloon-tooltips/htdocs/images/GBubble'; //
  38 + balloon.ieImage = 'balloon_ie.png'; //
  39 + balloon.balloonImage = 'balloon.png'; //
  40 + balloon.upLeftStem = 'up_left.png'; //
  41 + balloon.downLeftStem = 'down_left.png'; //
  42 + balloon.upRightStem = 'up_right.png'; //
  43 + balloon.downRightStem = 'down_right.png'; //
  44 + balloon.closeButton = 'close.png'; //
  45 + balloon.closeButtonWidth = 16; //
  46 + balloon.allowAJAX = false; //
  47 + balloon.allowIframes = false; //
  48 + balloon.trackCursor = true; //
  49 + balloon.shadow = 20; //
  50 + balloon.padding = 10; //
  51 + balloon.stemHeight = 32; //
  52 + balloon.stemOverlap = 3; //
  53 + balloon.vOffset = 1; //
  54 + balloon.hOffset = 1; //
  55 + balloon.opacity = 0.9; //
  56 + balloon.configured = set || true; //
  57 + } //
  58 + ////////////////////////////////////////////////////////////////
  59 +
  60 +
  61 + ////////////////////////////////////////////////////////////////
  62 + // Custom configuration options -- Add a case below for your //
  63 + // config set (default sets: GBox, GPlain, and GFade) //
  64 + ////////////////////////////////////////////////////////////////
  65 + switch(set) {
  66 +
  67 + // A formatted box (no background image)
  68 + case('GBoxxxx') :
  69 + balloon.bgColor = 'whitesmoke';
  70 + balloon.borderStyle = '2px solid gray';
  71 + //balloon.images = i3GEO.configura.locaplic+'/pacotes/balloon-tooltips/htdocs/images/GPlain';
  72 + balloon.padding = 5;
  73 + balloon.shadow = 0;
  74 + balloon.stem = true; //original é false edmar
  75 + balloon.opacity = 0.8;
  76 + balloon.hOffset = 1;
  77 + balloon.vOffset = 1;
  78 + balloon.allowFade = false;
  79 + break;
  80 +
  81 + // A simpler balloon
  82 + case('GPlain') :
  83 + balloon.padding = 5;
  84 + balloon.images = i3GEO.configura.locaplic+'/pacotes/balloon-tooltips/htdocs/images/GPlain';
  85 + balloon.ieImage = null;
  86 + balloon.shadow = 0;
  87 + balloon.stemHeight = 15;
  88 + balloon.stemOverlap = 1;
  89 + balloon.opacity = 0.85;
  90 + break;
  91 +
  92 + // The default cartoon bubble with a fade-in effect
  93 + case('GFade') :
  94 + balloon.allowFade = true;
  95 + balloon.fadeIn = 1000;
  96 + balloon.faedOut = 200;
  97 + break;
  98 + }
  99 +}
  100 +
... ...
pacotes/balloon-tooltips/htdocs/js/balloon.config.js~ 0 → 100644
... ... @@ -0,0 +1,100 @@
  1 +/*
  2 +
  3 +This file contains the default configuration options for balloon tooltips.
  4 +Default options can be edited in this file or changed after the Balloon object is
  5 +initiliazed as follows:
  6 +
  7 + var balloon = new Balloon;
  8 + balloon.fontColor = 'black';
  9 + balloon.fontFamily = 'Arial, sans-serif';
  10 + balloon.fontSize = '12pt';
  11 + etc...
  12 +
  13 +*/
  14 +
  15 +// This function adds the default configuration and also custom
  16 +// configuration sets, specified in 'case' stanzas
  17 +BalloonConfig = function(balloon, set) {
  18 + set = set || '';
  19 +
  20 + ////////////////////////////////////////////////////////////////
  21 + // The default "base" config applied to all balloon objects. //
  22 + // See http://gmod.org/wiki/Popup_Balloons#Customization for //
  23 + // details about config options //
  24 + // //
  25 + // values can be overriden in custom config cases (see below) //
  26 + ////////////////////////////////////////////////////////////////
  27 + if (!balloon.configured || set == 'GBubble' || set == 'GBox') { //
  28 + balloon.fontColor = 'black'; //
  29 + balloon.fontFamily = 'Arial, sans-serif'; //
  30 + balloon.fontSize = '12pt'; //
  31 + balloon.minWidth = 100; //
  32 + balloon.maxWidth = 400; //
  33 + balloon.delayTime = 750; //
  34 + balloon.vOffset = 10; //
  35 + balloon.hOffset = 10; //
  36 + balloon.stem = true; //
  37 + balloon.images = i3GEO.configura.locaplic+'/pacotes/balloon-tooltips/htdocs/images/GBubble'; //
  38 + balloon.ieImage = 'balloon_ie.png'; //
  39 + balloon.balloonImage = 'balloon.png'; //
  40 + balloon.upLeftStem = 'up_left.png'; //
  41 + balloon.downLeftStem = 'down_left.png'; //
  42 + balloon.upRightStem = 'up_right.png'; //
  43 + balloon.downRightStem = 'down_right.png'; //
  44 + balloon.closeButton = 'close.png'; //
  45 + balloon.closeButtonWidth = 16; //
  46 + balloon.allowAJAX = false; //
  47 + balloon.allowIframes = false; //
  48 + balloon.trackCursor = false; //
  49 + balloon.shadow = 20; //
  50 + balloon.padding = 10; //
  51 + balloon.stemHeight = 32; //
  52 + balloon.stemOverlap = 3; //
  53 + balloon.vOffset = 1; //
  54 + balloon.hOffset = 1; //
  55 + balloon.opacity = 0.9; //
  56 + balloon.configured = set || true; //
  57 + } //
  58 + ////////////////////////////////////////////////////////////////
  59 +
  60 +
  61 + ////////////////////////////////////////////////////////////////
  62 + // Custom configuration options -- Add a case below for your //
  63 + // config set (default sets: GBox, GPlain, and GFade) //
  64 + ////////////////////////////////////////////////////////////////
  65 + switch(set) {
  66 +
  67 + // A formatted box (no background image)
  68 + case('GBoxxxx') :
  69 + balloon.bgColor = 'whitesmoke';
  70 + balloon.borderStyle = '2px solid gray';
  71 + //balloon.images = i3GEO.configura.locaplic+'/pacotes/balloon-tooltips/htdocs/images/GPlain';
  72 + balloon.padding = 5;
  73 + balloon.shadow = 0;
  74 + balloon.stem = true; //original é false edmar
  75 + balloon.opacity = 0.8;
  76 + balloon.hOffset = 1;
  77 + balloon.vOffset = 1;
  78 + balloon.allowFade = false;
  79 + break;
  80 +
  81 + // A simpler balloon
  82 + case('GPlain') :
  83 + balloon.padding = 5;
  84 + balloon.images = i3GEO.configura.locaplic+'/pacotes/balloon-tooltips/htdocs/images/GPlain';
  85 + balloon.ieImage = null;
  86 + balloon.shadow = 0;
  87 + balloon.stemHeight = 15;
  88 + balloon.stemOverlap = 1;
  89 + balloon.opacity = 0.85;
  90 + break;
  91 +
  92 + // The default cartoon bubble with a fade-in effect
  93 + case('GFade') :
  94 + balloon.allowFade = true;
  95 + balloon.fadeIn = 1000;
  96 + balloon.faedOut = 200;
  97 + break;
  98 + }
  99 +}
  100 +
... ...
pacotes/balloon-tooltips/htdocs/js/balloon.js 0 → 100644
... ... @@ -0,0 +1,1166 @@
  1 +/*
  2 + * balloon.js -- a DHTML library for balloon tooltips
  3 + *
  4 + * $Id: balloon.js 22300 2009-12-01 09:40:39Z sheldon_mckay $
  5 + *
  6 + * See http://www.gmod.org/wiki/index.php/Popup_Balloons
  7 + * for documentation.
  8 + *
  9 + * Copyright (c) 2007-2009 Sheldon McKay, Cold Spring Harbor Laboratory
  10 + *
  11 + * This balloon tooltip package and associated files not otherwise copyrighted are
  12 + * distributed under the MIT-style license:
  13 + *
  14 + * http://opensource.org/licenses/mit-license.php
  15 + *
  16 + * Permission is hereby granted, free of charge, to any person obtaining a copy
  17 + * of this software and associated documentation files (the "Software"), to deal
  18 + * in the Software without restriction, including without limitation the rights
  19 + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  20 + * copies of the Software, and to permit persons to whom the Software is
  21 + * furnished to do so, subject to the following conditions:
  22 + *
  23 + * The above copyright notice and this permission notice shall be included in
  24 + * all copies or substantial portions of the Software.
  25 + *
  26 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  27 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  28 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  29 + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  30 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  31 + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  32 + * THE SOFTWARE.
  33 + *
  34 + */
  35 +
  36 +// These global variables are necessary to avoid losing scope when
  37 +// setting the balloon timeout and for inter-object communication
  38 +var currentBalloonClass;
  39 +var balloonIsVisible;
  40 +var balloonIsSticky;
  41 +var balloonInvisibleSelects;
  42 +var balloonIsSuppressed;
  43 +var tooltipIsSuppressed;
  44 +
  45 +
  46 +//////////////////////////////////////////////////////////////////////////
  47 +// This is constructor that is called to initialize the Balloon object //
  48 +//////////////////////////////////////////////////////////////////////////
  49 +var Balloon = function () {
  50 + // Cursor tracking enabled by default
  51 + this.trackCursor = true;
  52 +
  53 + // Track the cursor every time the mouse moves
  54 + document.onmousemove = this.setActiveCoordinates;
  55 +
  56 + // scrolling aborts visible balloons
  57 + var myObject = this.isIE() ? window : document;
  58 + myObject.onscroll = function(){Balloon.prototype.nukeTooltip()};
  59 +
  60 + // make balloons go away if the page is unloading or waiting
  61 + // to unload.
  62 + window.onbeforeunload = function(){
  63 + Balloon.prototype.nukeTooltip();
  64 + balloonIsSuppressed = true;
  65 + };
  66 +
  67 + // for IE, the balloons can't start until the page is finished loading
  68 + // set a flag that will get toggled when loading is finished
  69 + if (this.isIE()) {
  70 + this.suppress = true;
  71 + }
  72 +
  73 + return this;
  74 +}
  75 +
  76 +//////////////////////////////////////////////////////////////////////////
  77 +// This is the method that is called on mouseover. It has a built-in //
  78 +// delay time to avoid balloons popping up on rapid mouseover events //
  79 +//////////////////////////////////////////////////////////////////////////
  80 +Balloon.prototype.showTooltip = function(evt,caption,sticky,width,height) {
  81 + // If the objext is not configured by now, fall back to default
  82 + if (!this.configured) {
  83 + BalloonConfig(this,'GBubble');
  84 + }
  85 +
  86 + // Cursor tracking halts after one of these vertical
  87 + // or horizontal thresholds are reached
  88 + this.stopTrackingX = this.trackCursor ? 100 : 10;
  89 + this.stopTrackingY = this.trackCursor ? 50 : 10;
  90 +
  91 + // Awful IE bug, page load aborts if the balloon is fired
  92 + // before the page is fully loaded.
  93 + if (this.isIE() && document.readyState.match(/complete/i)) {
  94 + this.suppress = false;
  95 + }
  96 +
  97 + // All balloons have been suppressed, go no further
  98 + if (this.suppress || balloonIsSuppressed) {
  99 + return false;
  100 + }
  101 +
  102 + // Non-sticky balloons suppressed
  103 + if (tooltipIsSuppressed && !sticky) {
  104 + return false;
  105 + }
  106 +
  107 + // We use 1-100 scale for opacity internally
  108 + if (this.opacity && this.opacity < 1) {
  109 + this.opacity = parseInt(parseFloat(this.opacity) * 100);
  110 + }
  111 + else if (this.opacity && this.opacity == 1) {
  112 + this.opacity = 100;
  113 + }
  114 + else if (!this.opacity) {
  115 + this.opacity == 100;
  116 + }
  117 +
  118 + // Sorry Konqueror, no fade-in or translucency for you!
  119 + if (this.isKonqueror()) {
  120 + this.allowFade = false;
  121 + this.opacity = 100;
  122 + }
  123 +
  124 + // With IE, fading and translucency are not very compatible
  125 + // use opaque balloons if fadein is enabled
  126 + if (this.isIE() && this.allowFade) {
  127 + this.opacity = 100;
  128 + }
  129 +
  130 + // Check for mouseover (vs. mousedown or click)
  131 + var mouseOver = true;
  132 + try{
  133 + var mouseOver = evt.type.match('mouseover','i');
  134 + }catch(e){}
  135 +
  136 + // if the firing event is a click, fade-in and a non-sticky balloon make no sense
  137 + if (!mouseOver) {
  138 + sticky = true;
  139 + this.fadeOK = false;
  140 + // case where hover and click events both trigger balloons
  141 + if (balloonIsVisible) {
  142 + this.hideTooltip();
  143 + }
  144 + }
  145 + else {
  146 + this.fadeOK = this.allowFade;
  147 + }
  148 +
  149 + // Don't fire on mouseover if a non-sticky balloon is visible
  150 + if (balloonIsVisible && !balloonIsSticky && mouseOver) {
  151 + return false;
  152 + }
  153 +
  154 + // Don't start a non-sticky balloon if a sticky one is visible
  155 + if (balloonIsVisible && balloonIsSticky && !sticky) {
  156 + return false;
  157 + }
  158 +
  159 + // Ignore repeated firing of mouseover->mouseout events on
  160 + // the same element (Safari)
  161 +
  162 + try{
  163 + var el = this.getEventTarget(evt);
  164 + }catch(e){var el = evt;}
  165 +
  166 + if (sticky && mouseOver && this.isSameElement(el,this.currentElement)) {
  167 + return false;
  168 + }
  169 + this.currentElement = el;
  170 +
  171 + // remember the coordinates of the element
  172 + this.elCoords = this.getLoc(el,'region');
  173 +
  174 + // attach a mouseout event handler to the target element
  175 + if (!sticky) {
  176 + var mouseoutFunc = el.onmouseout;
  177 + var closeBalloon = function() {
  178 + Balloon.prototype.hideTooltip();
  179 + // fall through to any onmouseout event specified elsewhere
  180 + if (mouseoutFunc) {
  181 + mouseoutFunc();
  182 + }
  183 + }
  184 + if (!mouseOver) {
  185 + el.onmouseup = function() {return false};
  186 + }
  187 + //el.onmouseout = closeBalloon;
  188 + }
  189 +
  190 + balloonIsSticky = sticky;
  191 +
  192 + this.hideTooltip();
  193 +
  194 + // request the contents synchronously (ie wait for result)
  195 + this.currentHelpText = this.getAndCheckContents(caption);
  196 +
  197 + // no contents? abort.
  198 + if (!this.currentHelpText) {
  199 + return false;
  200 + }
  201 +
  202 + this.width = width;
  203 + this.height = height;
  204 + this.actualWidth = null;
  205 +
  206 + // make sure old balloons are removed
  207 + this.hideTooltip();
  208 +
  209 + // Put the balloon contents and images into a visible (but offscreen)
  210 + // element so they will be preloaded and have a layout to
  211 + // calculate the balloon dimensions
  212 + this.container = document.createElement('div');
  213 + this.container.id = 'balloonPreloadContainer';
  214 + document.body.appendChild(this.container);
  215 + this.setStyle(this.container,'position','absolute');
  216 + this.setStyle(this.container,'top',-8888);
  217 + this.setStyle(this.container,'font-family',this.fontFamily);
  218 + this.setStyle(this.container,'font-size',this.fontSize);
  219 +
  220 + // protect escaped '&'
  221 + this.currentHelpText = this.currentHelpText.replace(/\&amp;/g, '&amp;amp');
  222 + this.container.innerHTML = unescape(this.currentHelpText);
  223 +
  224 + // make sure balloon image path is complete
  225 + if (this.images) {
  226 +
  227 + // main background image
  228 + this.balloonImage = this.balloonImage ? this.images +'/'+ this.balloonImage : false;
  229 + this.ieImage = this.ieImage ? this.images +'/'+ this.ieImage : false;
  230 +
  231 + // optional stems
  232 + this.upLeftStem = this.upLeftStem ? this.images +'/'+ this.upLeftStem : false;
  233 + this.upRightStem = this.upRightStem ? this.images +'/'+ this.upRightStem : false;
  234 + this.downLeftStem = this.downLeftStem ? this.images +'/'+ this.downLeftStem : false;
  235 + this.downRightStem = this.downRightStem ? this.images +'/'+ this.downRightStem : false;
  236 +
  237 + this.closeButton = this.closeButton ? this.images +'/'+ this.closeButton : false;
  238 +
  239 + this.images = false;
  240 + }
  241 +
  242 + // The PNG alpha channels (shadow transparency) are not
  243 + // handled properly by IE < 6. Also, if opacity is set to
  244 + // < 1 (translucent balloons), any version of IE does not
  245 + // handle the image properly.
  246 + // Google chrome is a bit dodgey too
  247 + // If there is an IE image provided, use that instead.
  248 + if (this.ieImage && (this.isIE() || this.isChrome())) {
  249 + if (this.isOldIE() || this.opacity || this.allowFade) {
  250 + this.balloonImage = this.ieImage;
  251 + }
  252 + }
  253 +
  254 + // preload balloon images
  255 + if (!this.preloadedImages) {
  256 + var images = new Array(this.balloonImage, this.closeButton);
  257 + if (this.ieImage) {
  258 + images.push(this.ieImage);
  259 + }
  260 + if (this.stem) {
  261 + images.push(this.upLeftStem,this.upRightStem,this.downLeftStem,this.downRightStem);
  262 + }
  263 + var len = images.length;
  264 + for (var i=0;i<len;i++) {
  265 + if ( images[i] ) {
  266 + this.preload(images[i]);
  267 + }
  268 + }
  269 + this.preloadedImages = true;
  270 + }
  271 +
  272 + currentBalloonClass = this;
  273 +
  274 + // Capture coordinates for mousedown or click
  275 + //if (!mouseOver) {this.setActiveCoordinates(evt);}
  276 + if (!mouseOver) el.onmouseup = function() {return false;};
  277 + // Remember which event started this
  278 + this.currentEvent = evt;
  279 +
  280 + // prevent interaction with gbrowse drag and drop
  281 + evt.cancelBubble = true;
  282 +
  283 + // Make delay time short for onmousedown
  284 + //var delay = mouseOver ? this.delayTime : 1;
  285 + //this.timeoutTooltip = window.setTimeout(this.doShowTooltip,delay);
  286 + this.doShowTooltip();
  287 + this.pending = true;
  288 +}
  289 +
  290 +// Preload the balloon background images
  291 +Balloon.prototype.preload = function(src) {
  292 + var i = new Image;
  293 + i.src = src;
  294 +
  295 + // append to the DOM tree so the images have a layout,
  296 + // then remove.
  297 + this.setStyle(i,'position','absolute');
  298 + this.setStyle(i,'top',-8000);
  299 + document.body.appendChild(i);
  300 + document.body.removeChild(i);
  301 +}
  302 +
  303 +
  304 +/////////////////////////////////////////////////////////////////////
  305 +// Tooltip rendering function
  306 +/////////////////////////////////////////////////////////////////////
  307 +Balloon.prototype.doShowTooltip = function() {
  308 + var self = currentBalloonClass;
  309 +
  310 + // Stop firing if a balloon is already being displayed
  311 + if (balloonIsVisible) {
  312 + return false;
  313 + }
  314 + if (!self.parent) {
  315 + if (self.parentID) {
  316 + self.parent = document.getElementById(self.parentID);
  317 + }
  318 + else {
  319 + self.parent = document.body;
  320 + }
  321 + self.xOffset = self.getLoc(self.parent, 'x1');
  322 + self.yOffset = self.getLoc(self.parent, 'y1');
  323 + }
  324 +
  325 + // a short delay time might cause some intereference
  326 + // with fading
  327 + window.clearTimeout(self.timeoutFade);
  328 + if (!balloonIsSticky) {
  329 + self.setStyle('visibleBalloonElement','display','none');
  330 + }
  331 +
  332 + // make sure user-configured numbers are not strings
  333 + self.parseIntAll();
  334 +
  335 + // create the balloon object
  336 + var balloon = self.makeBalloon();
  337 +
  338 + // window dimensions
  339 + var pageWidth = YAHOO.util.Dom.getViewportWidth();
  340 + var pageCen = Math.round(pageWidth/2);
  341 + var pageHeight = YAHOO.util.Dom.getViewportHeight();
  342 + var pageLeft = YAHOO.util.Dom.getDocumentScrollLeft();
  343 + var pageTop = YAHOO.util.Dom.getDocumentScrollTop();
  344 + var pageMid = pageTop + Math.round(pageHeight/2);
  345 + self.pageBottom = pageTop + pageHeight;
  346 + self.pageTop = pageTop;
  347 + self.pageLeft = pageLeft;
  348 + self.pageRight = pageLeft + pageWidth;
  349 +
  350 + // balloon orientation
  351 + var vOrient = self.activeTop > pageMid ? 'up' : 'down';
  352 + var hOrient = self.activeRight > pageCen ? 'left' : 'right';
  353 +
  354 + // get the preloaded balloon contents
  355 + var helpText = self.container.innerHTML;
  356 + self.actualWidth = self.getLoc(self.container,'width');
  357 + if (!isNaN(self.actualWidth)) {
  358 + self.actualWidth += 10;
  359 + }
  360 + self.parent.removeChild(self.container);
  361 + var wrapper = document.createElement('div');
  362 + wrapper.id = 'contentWrapper';
  363 + self.contents.appendChild(wrapper);
  364 + wrapper.innerHTML = helpText;
  365 +
  366 + // how and where to draw the balloon
  367 + self.setBalloonStyle(vOrient,hOrient,pageWidth,pageLeft);
  368 +
  369 + // close control for balloon or box
  370 + if (balloonIsSticky) {
  371 + self.addCloseButton();
  372 + }
  373 +
  374 + balloonIsVisible = true;
  375 + self.pending = false;
  376 +
  377 + // in IE < 7, hide <select> elements
  378 + self.showHide();
  379 +
  380 + self.startX = self.activeLeft;
  381 + self.startY = self.activeTop;
  382 + self.fade(0,self.opacity,self.fadeIn);
  383 +}
  384 +
  385 +Balloon.prototype.addCloseButton = function () {
  386 + var self = currentBalloonClass;
  387 + var margin = Math.round(self.padding/2);
  388 + var closeWidth = self.closeButtonWidth || 16;
  389 + var balloonTop = self.getLoc('visibleBalloonElement','y1') + margin + self.shadow;
  390 + var BalloonLeft = self.getLoc('topRight','x2') - self.closeButtonWidth - self.shadow - margin;
  391 + var closeButton = document.getElementById('closeButton');
  392 +
  393 + if (!closeButton) {
  394 + closeButton = new Image;
  395 + closeButton.setAttribute('id','closeButton');
  396 + closeButton.setAttribute('src',self.closeButton);
  397 + closeButton.onclick = function() {
  398 + Balloon.prototype.nukeTooltip();
  399 + };
  400 + self.setStyle(closeButton,'position','absolute');
  401 + document.body.appendChild(closeButton);
  402 + }
  403 +
  404 + // I have no idea why
  405 + if (self.isIE()) {
  406 + BalloonLeft = BalloonLeft - 5;
  407 + }
  408 +
  409 + self.setStyle(closeButton,'top',balloonTop);
  410 + self.setStyle(closeButton,'left',BalloonLeft);
  411 + self.setStyle(closeButton,'display','inline');
  412 + self.setStyle(closeButton,'cursor','pointer');
  413 + self.setStyle(closeButton,'z-index',999999999);
  414 +}
  415 +
  416 +// use a fresh object every time to make sure style
  417 +// is not polluted
  418 +Balloon.prototype.makeBalloon = function() {
  419 + var self = currentBalloonClass;
  420 +
  421 + var balloon = document.getElementById('visibleBalloonElement');
  422 + if (balloon) {
  423 + self.hideTooltip();
  424 + }
  425 +
  426 + balloon = document.createElement('div');
  427 + balloon.setAttribute('id','visibleBalloonElement');
  428 + self.parent.appendChild(balloon);
  429 + self.activeBalloon = balloon;
  430 +
  431 + self.parts = new Array();
  432 + var parts = new Array('contents','topRight','bottomRight','bottomLeft');
  433 + for (var i=0;i<parts.length;i++) {
  434 + var child = document.createElement('div');
  435 + child.setAttribute('id',parts[i]);
  436 + balloon.appendChild(child);
  437 + if (parts[i] == 'contents') self.contents = child;
  438 + self.parts.push(child);
  439 + }
  440 + //self.parts.push(balloon);
  441 +
  442 + if (self.displayTime) {
  443 + self.timeoutAutoClose = window.setTimeout(this.hideTooltip,self.displayTime);
  444 + }
  445 + return balloon;
  446 +}
  447 +
  448 +Balloon.prototype.setBalloonStyle = function(vOrient,hOrient,pageWidth,pageLeft) {
  449 + var self = currentBalloonClass;
  450 + var balloon = self.activeBalloon;
  451 +
  452 + if (typeof(self.shadow) != 'number') self.shadow = 0;
  453 + if (!self.stem) self.stemHeight = 0;
  454 +
  455 + var fullPadding = self.padding + self.shadow;
  456 + var insidePadding = self.padding;
  457 + var outerWidth = self.actualWidth + fullPadding;
  458 + var innerWidth = self.actualWidth;
  459 +
  460 + self.setStyle(balloon,'position','absolute');
  461 + self.setStyle(balloon,'top',-9999);
  462 + self.setStyle(balloon,'z-index',1000000);
  463 +
  464 + if (self.height) {
  465 + self.setStyle('contentWrapper','height',self.height-fullPadding);
  466 + }
  467 +
  468 + if (self.width) {
  469 + self.setStyle(balloon,'width',self.width);
  470 + innerWidth = self.width - fullPadding;
  471 + if (balloonIsSticky) {
  472 + innerWidth -= self.closeButtonWidth;
  473 + }
  474 + self.setStyle('contentWrapper','width',innerWidth);
  475 + }
  476 + else {
  477 + self.setStyle(balloon,'width',outerWidth);
  478 + self.setStyle('contentWrapper','width',innerWidth);
  479 + }
  480 +
  481 + // not too big...
  482 + if (!self.width && self.maxWidth && outerWidth > self.maxWidth) {
  483 + self.setStyle(balloon,'width',self.maxWidth);
  484 + self.setStyle('contentWrapper','width',self.maxWidth-fullPadding);
  485 + }
  486 + // not too small...
  487 + if (!self.width && self.minWidth && outerWidth < self.minWidth) {
  488 + self.setStyle(balloon,'width',self.minWidth);
  489 + self.setStyle('contentWrapper','width',self.minWidth-fullPadding);
  490 + }
  491 +
  492 + self.setStyle('contents','z-index',2);
  493 + self.setStyle('contents','color',self.fontColor);
  494 + self.setStyle('contents','font-family',self.fontFamily);
  495 + self.setStyle('contents','font-size',self.fontSize);
  496 + self.setStyle('contents','background','url('+self.balloonImage+') top left no-repeat');
  497 + self.setStyle('contents','padding-top',fullPadding);
  498 + self.setStyle('contents','padding-left',fullPadding);
  499 +
  500 + self.setStyle('bottomRight','background','url('+self.balloonImage+') bottom right no-repeat');
  501 + self.setStyle('bottomRight','position','absolute');
  502 + self.setStyle('bottomRight','right',0-fullPadding);
  503 + self.setStyle('bottomRight','bottom',0-fullPadding);
  504 + self.setStyle('bottomRight','height',fullPadding);
  505 + self.setStyle('bottomRight','width',fullPadding);
  506 + self.setStyle('bottomRight','z-index',-1);
  507 +
  508 + self.setStyle('topRight','background','url('+self.balloonImage+') top right no-repeat');
  509 + self.setStyle('topRight','position','absolute');
  510 + self.setStyle('topRight','right',0-fullPadding);
  511 + self.setStyle('topRight','top',0);
  512 + self.setStyle('topRight','width',fullPadding);
  513 +
  514 + self.setStyle('bottomLeft','background','url('+self.balloonImage+') bottom left no-repeat');
  515 + self.setStyle('bottomLeft','position','absolute');
  516 + self.setStyle('bottomLeft','left',0);
  517 + self.setStyle('bottomLeft','bottom',0-fullPadding);
  518 + self.setStyle('bottomLeft','height',fullPadding);
  519 + self.setStyle('bottomLeft','z-index',-1);
  520 +
  521 + if (this.stem) {
  522 + var stem = document.createElement('img');
  523 + self.setStyle(stem,'position','absolute');
  524 + balloon.appendChild(stem);
  525 +
  526 + if (vOrient == 'up' && hOrient == 'left') {
  527 + stem.src = self.upLeftStem;
  528 + var height = self.stemHeight + insidePadding - self.stemOverlap;
  529 + self.setStyle(stem,'bottom',0-height);
  530 + self.setStyle(stem,'right',0);
  531 + }
  532 + else if (vOrient == 'down' && hOrient == 'left') {
  533 + stem.src = self.downLeftStem;
  534 + var height = self.stemHeight - (self.shadow + self.stemOverlap);
  535 + self.setStyle(stem,'top',0-height);
  536 + self.setStyle(stem,'right',0);
  537 + }
  538 + else if (vOrient == 'up' && hOrient == 'right') {
  539 + stem.src = self.upRightStem;
  540 + var height = self.stemHeight + insidePadding - self.stemOverlap;
  541 + self.setStyle(stem,'bottom',0-height);
  542 + self.setStyle(stem,'left',self.shadow);
  543 + }
  544 + else if (vOrient == 'down' && hOrient == 'right') {
  545 + stem.src = self.downRightStem;
  546 + var height = self.stemHeight - (self.shadow + self.stemOverlap);
  547 + self.setStyle(stem,'top',0-height);
  548 + self.setStyle(stem,'left',self.shadow);
  549 + }
  550 + if (self.fadeOK && self.isIE()) {
  551 + self.parts.push(stem);
  552 + }
  553 + }
  554 +
  555 + if (self.allowFade) {
  556 + self.setOpacity(1);
  557 + }
  558 + else if (self.opacity) {
  559 + self.setOpacity(self.opacity);
  560 + }
  561 +
  562 + // flip left or right, as required
  563 + if (hOrient == 'left') {
  564 + var pageWidth = self.pageRight - self.pageLeft;
  565 + var activeRight = pageWidth - self.activeLeft;
  566 + self.setStyle(balloon,'right',activeRight);
  567 + }
  568 + else {
  569 + var activeLeft = self.activeRight - self.xOffset;
  570 + self.setStyle(balloon,'left',activeLeft);
  571 + }
  572 +
  573 + // oversized contents? Scrollbars for sticky balloons, clipped for non-sticky
  574 + var overflow = balloonIsSticky ? 'auto' : 'hidden';
  575 + self.setStyle('contentWrapper','overflow',overflow);
  576 +
  577 + // a bit of room for the closebutton
  578 + if (balloonIsSticky) {
  579 + self.setStyle('contentWrapper','margin-right',self.closeButtonWidth);
  580 + }
  581 +
  582 + // Make sure the balloon is not offscreen horizontally.
  583 + // We handle vertical sanity checking later, after the final
  584 + // layout is set.
  585 + var balloonLeft = self.getLoc(balloon,'x1');
  586 + var balloonRight = self.getLoc(balloon,'x2');
  587 + var scrollBar = 20;
  588 +
  589 + if (hOrient == 'right' && balloonRight > (self.pageRight - fullPadding)) {
  590 + var width = (self.pageRight - balloonLeft) - fullPadding - scrollBar;
  591 + self.setStyle(balloon,'width',width);
  592 + self.setStyle('contentWrapper','width',width-fullPadding);
  593 + }
  594 + else if (hOrient == 'left' && balloonLeft < (self.pageLeft + fullPadding)) {
  595 + var width = (balloonRight - self.pageLeft) - fullPadding;
  596 + self.setStyle(balloon,'width',width);
  597 + self.setStyle('contentWrapper','width',width-fullPadding);
  598 + }
  599 +
  600 + // Get the width/height for the right and bottom outlines
  601 + var balloonWidth = self.getLoc(balloon,'width');
  602 + var balloonHeight = self.getLoc(balloon,'height');
  603 +
  604 + // IE7 quirk -- look for unwanted overlap cause by an off by 1px error
  605 + var vOverlap = self.isOverlap('topRight','bottomRight');
  606 + var hOverlap = self.isOverlap('bottomLeft','bottomRight');
  607 + if (vOverlap) {
  608 + self.setStyle('topRight','height',balloonHeight-vOverlap[1]);
  609 + }
  610 + if (hOverlap) {
  611 + self.setStyle('bottomLeft','width',balloonWidth-hOverlap[0]);
  612 + }
  613 +
  614 + // vertical position of the balloon
  615 + if (vOrient == 'up') {
  616 + var activeTop = self.activeTop - balloonHeight;
  617 + self.setStyle(balloon,'top',activeTop);
  618 + }
  619 + else {
  620 + var activeTop = self.activeBottom;
  621 + self.setStyle(balloon,'top',activeTop);
  622 + }
  623 +
  624 + // Make sure the balloon is vertically contained in the window
  625 + var balloonTop = self.getLoc(balloon,'y1');
  626 + var balloonBottom = self.height ? balloonTop + self.height : self.getLoc(balloon,'y2');
  627 + var deltaTop = balloonTop < self.pageTop ? self.pageTop - balloonTop : 0;
  628 + var deltaBottom = balloonBottom > self.pageBottom ? balloonBottom - self.pageBottom : 0;
  629 +
  630 + if (vOrient == 'up' && deltaTop) {
  631 + var newHeight = balloonHeight - deltaTop;
  632 + if (newHeight > (self.padding*2)) {
  633 + self.setStyle('contentWrapper','height',newHeight-fullPadding);
  634 + self.setStyle(balloon,'top',self.pageTop+self.padding);
  635 + self.setStyle(balloon,'height',newHeight);
  636 + }
  637 + }
  638 + if (vOrient == 'down' && deltaBottom) {
  639 + var newHeight = balloonHeight - deltaBottom - scrollBar;
  640 + if (newHeight > (self.padding*2) + scrollBar) {
  641 + self.setStyle('contentWrapper','height',newHeight-fullPadding);
  642 + self.setStyle(balloon,'height',newHeight);
  643 + }
  644 + }
  645 +
  646 + // If we have an iframe, make sure it fits properly
  647 + var iframe = balloon.getElementsByTagName('iframe');
  648 + if (iframe[0]) {
  649 + iframe = iframe[0];
  650 + var w = self.getLoc('contentWrapper','width');
  651 + if (balloonIsSticky && !this.isIE()) {
  652 + w -= self.closeButtonWidth;
  653 + }
  654 + var h = self.getLoc('contentWrapper','height');
  655 + self.setStyle(iframe,'width',w);
  656 + self.setStyle(iframe,'height',h);
  657 + self.setStyle('contentWrapper','overflow','hidden');
  658 + }
  659 +
  660 + // Make edges match the main balloon body
  661 + self.setStyle('topRight','height', self.getLoc(balloon,'height'));
  662 + self.setStyle('bottomLeft','width', self.getLoc(balloon,'width'));
  663 +
  664 + self.hOrient = hOrient;
  665 + self.vOrient = vOrient;
  666 +}
  667 +
  668 +
  669 +// Fade method adapted from an example on
  670 +// http://brainerror.net/scripts/javascript/blendtrans/
  671 +Balloon.prototype.fade = function(opacStart, opacEnd, millisec) {
  672 + var self = currentBalloonClass || new Balloon;
  673 + if (!millisec || !self.allowFade) {
  674 + return false;
  675 + }
  676 +
  677 + opacEnd = opacEnd || 100;
  678 +
  679 + //speed for each frame
  680 + var speed = Math.round(millisec / 100);
  681 + var timer = 0;
  682 + for(o = opacStart; o <= opacEnd; o++) {
  683 + self.timeoutFade = setTimeout('Balloon.prototype.setOpacity('+o+')',(timer*speed));
  684 + timer++;
  685 + }
  686 +}
  687 +
  688 +Balloon.prototype.setOpacity = function(opc) {
  689 + var self = currentBalloonClass;
  690 + if (!self || !opc) return false;
  691 +
  692 + var o = parseFloat(opc/100);
  693 +
  694 + // opacity handled differently for IE
  695 + var parts = self.isIE() ? self.parts : [self.activeBalloon];
  696 +
  697 + var len = parts.length;
  698 + for (var i=0;i<len;i++) {
  699 + self.doOpacity(o,opc,parts[i]);
  700 + }
  701 +}
  702 +
  703 +Balloon.prototype.doOpacity = function(op,opc,el) {
  704 + var self = currentBalloonClass;
  705 + if (!el) return false;
  706 +
  707 + // CSS standards-compliant browsers!
  708 + self.setStyle(el,'opacity',op);
  709 +
  710 + // old IE
  711 + self.setStyle(el,'filter','alpha(opacity='+opc+')');
  712 +
  713 + // old Mozilla/NN
  714 + self.setStyle(el,'MozOpacity',op);
  715 +
  716 + // old Safari
  717 + self.setStyle(el,'KhtmlOpacity',op);
  718 +}
  719 +
  720 +Balloon.prototype.nukeTooltip = function() {
  721 + this.hideTooltip(1);
  722 +}
  723 +
  724 +Balloon.prototype.hideTooltip = function(override) {
  725 + // some browsers pass the event object == we don't want it
  726 + if (override && typeof override == 'object') override = false;
  727 + if (balloonIsSticky && !override) return false;
  728 + var self = currentBalloonClass;
  729 + Balloon.prototype.showHide(1);
  730 + Balloon.prototype.cleanup();
  731 +
  732 + if (self) {
  733 + window.clearTimeout(self.timeoutTooltip);
  734 + window.clearTimeout(self.timeoutFade);
  735 + window.clearTimeout(self.timeoutAutoClose);
  736 + if (balloonIsSticky) {
  737 + self.currentElement = null;
  738 + }
  739 + self.startX = 0;
  740 + self.startY = 0;
  741 + }
  742 +
  743 + balloonIsVisible = false;
  744 + balloonIsSticky = false;
  745 +}
  746 +
  747 +// Garbage collection
  748 +Balloon.prototype.cleanup = function() {
  749 + var self = currentBalloonClass;
  750 + var body;
  751 + if (self) {
  752 + body = self.parent ? self.parent
  753 + : self.parentID ? document.getElementById(self.parentID) || document.body
  754 + : document.body;
  755 + }
  756 + else {
  757 + body = document.body;
  758 + }
  759 +
  760 + var bubble = document.getElementById('visibleBalloonElement');
  761 + var close = document.getElementById('closeButton');
  762 + var cont = document.getElementById('balloonPreloadContainer');
  763 + if (bubble) { body.removeChild(bubble) }
  764 + if (close) { body.removeChild(close) }
  765 + if (cont) { body.removeChild(cont) }
  766 +}
  767 +
  768 +
  769 +// this function is meant to be called externally to clear
  770 +// any open balloons
  771 +hideAllTooltips = function() {
  772 + var self = currentBalloonClass;
  773 + if (!self) return;
  774 + window.clearTimeout(self.timeoutTooltip);
  775 + if (self.activeBalloon) self.setStyle(self.activeBalloon,'display','none');
  776 + balloonIsVisible = false;
  777 + balloonIsSticky = false;
  778 + currentBalloonClass = null;
  779 +}
  780 +
  781 +
  782 +// Track the active mouseover coordinates
  783 +Balloon.prototype.setActiveCoordinates = function(evt) {
  784 + var self = currentBalloonClass;
  785 + if (!self) {
  786 + return true;
  787 + }
  788 + var evt = evt || window.event || self.currentEvent;
  789 + if (!evt) {
  790 + return true;
  791 + }
  792 + //
  793 + //modificado por edmar
  794 + //
  795 +
  796 + self.currentEvent = {};
  797 + for (var i in evt) {
  798 + self.currentEvent[i] = evt[i];
  799 + }
  800 +
  801 + // avoid silent NaN errors
  802 + self.hOffset = self.hOffset || 1;
  803 + self.vOffset = self.vOffset || 1;
  804 + self.stemHeight = self.stem && self.stemHeight ? (self.stemHeight|| 0) : 0;
  805 +
  806 + var scrollTop = 0;
  807 + var scrollLeft = 0;
  808 +
  809 + var XY = self.eventXY(evt);
  810 + adjustment = self.hOffset < 20 ? 10 : 0;
  811 + self.activeTop = scrollTop + XY[1] - adjustment - self.vOffset - self.stemHeight;
  812 + self.activeLeft = scrollLeft + XY[0] - adjustment - self.hOffset;
  813 + self.activeRight = scrollLeft + XY[0];
  814 + self.activeBottom = scrollTop + XY[1] + self.vOffset + 2*adjustment;
  815 +
  816 + // dynamic positioning but only if the balloon is not sticky
  817 + // and cursor tracking is enabled
  818 + if (balloonIsVisible && !balloonIsSticky) {
  819 + var deltaX = Math.abs(self.activeLeft - self.startX);
  820 + var deltaY = Math.abs(self.activeTop - self.startY);
  821 +
  822 + // Close the balloon if the cursor has left the firing element
  823 + if ( XY[0] < self.elCoords.left || XY[0] > self.elCoords.right
  824 + || XY[1] < self.elCoords.top || XY[1] > self.elCoords.bottom ) {
  825 + //self.hideTooltip();
  826 + }
  827 +
  828 + // In some cases , such as <area> elements in image maps or big elements,
  829 + // we need to kill the balloon if the mouse has strayed too far.
  830 + if (deltaX > self.stopTrackingX || deltaY > self.stopTrackingY) {
  831 + //self.hideTooltip();
  832 + }
  833 + else if (self.trackCursor) {
  834 + var b = self.activeBalloon;
  835 + var bwidth = self.getLoc(b,'width');
  836 + var bheight = self.getLoc(b,'height');
  837 + var btop = self.getLoc(b,'y1');
  838 + var bleft = self.getLoc(b,'x1');
  839 +
  840 + if (self.hOrient == 'right') {
  841 + self.setStyle(b,'left',self.activeRight);
  842 + }
  843 + else if (self.hOrient == 'left') {
  844 + self.setStyle(b,'right',null);
  845 + var newLeft = self.activeLeft - bwidth;
  846 + self.setStyle(b,'left',newLeft);
  847 + }
  848 +
  849 + if (self.vOrient == 'up') {
  850 + self.setStyle(b,'top',self.activeTop - bheight);
  851 + }
  852 + else if (self.vOrient == 'down') {
  853 + self.setStyle(b,'top',self.activeBottom);
  854 + }
  855 + }
  856 + }
  857 +
  858 + return true;
  859 +}
  860 +
  861 +////
  862 +// event XY and getEventTarget Functions based on examples by Peter-Paul
  863 +// Koch http://www.quirksmode.org/js/events_properties.html
  864 +Balloon.prototype.eventXY = function(event) {
  865 + var XY = new Array(2);
  866 + var e = event || window.event;
  867 + if (!e) {
  868 + return false;
  869 + }
  870 + if (e.pageX || e.pageY) {
  871 + XY[0] = e.pageX;
  872 + XY[1] = e.pageY;
  873 + return XY;
  874 + }
  875 + else if ( e.clientX || e.clientY ) {
  876 + XY[0] = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
  877 + XY[1] = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
  878 + return XY;
  879 + }
  880 +}
  881 +
  882 +Balloon.prototype.getEventTarget = function(event) {
  883 + var targ;
  884 + var e = event || window.event;
  885 + if (e.target) targ = e.target;
  886 + else if (e.srcElement) targ = e.srcElement;
  887 + if (targ.nodeType == 3) targ = targ.parentNode; // Safari
  888 + return targ;
  889 +}
  890 +////
  891 +
  892 +
  893 +Balloon.prototype.setStyle = function(el,att,val) {
  894 + if (!el) {
  895 + return false;
  896 + }
  897 + if (typeof(el) != 'object') {
  898 + el = document.getElementById(el);
  899 + }
  900 + if (!el) {
  901 + return false;
  902 + }
  903 +
  904 + var v = val;
  905 +
  906 + if (val && att.match(/left|top|bottom|right|width|height|padding|margin/)) {
  907 + val = new String(val);
  908 + if (!val.match(/auto/)) {
  909 + val += 'px';
  910 + }
  911 + }
  912 +
  913 +
  914 + // z-index does not work as expected
  915 + if (att == 'z-index') {
  916 + if (el.style) {
  917 + el.style.zIndex = parseInt(val);
  918 + }
  919 + }
  920 + else {
  921 + // Oh just shut up, IE
  922 + if (this.isIE() && att.match(/^left|right|top|bottom$/) && !parseInt(val) && val != 0) {
  923 + val = null;
  924 + }
  925 +
  926 + YAHOO.util.Dom.setStyle(el,att,val);
  927 + }
  928 +}
  929 +
  930 +// Uses YAHOO's region class for element coordinates
  931 +Balloon.prototype.getLoc = function(el,request) {
  932 + var region = YAHOO.util.Dom.getRegion(el);
  933 +
  934 + switch(request) {
  935 + case ('y1') : return parseInt(region.top);
  936 + case ('y2') : return parseInt(region.bottom);
  937 + case ('x1') : return parseInt(region.left);
  938 + case ('x2') : return parseInt(region.right);
  939 + case ('width') : return (parseInt(region.right) - parseInt(region.left));
  940 + case ('height') : return (parseInt(region.bottom) - parseInt(region.top));
  941 + case ('region') : return region;
  942 + }
  943 +
  944 + return region;
  945 +}
  946 +
  947 +// We don't know if numbers are overridden with strings
  948 +// so play it safe
  949 +Balloon.prototype.parseIntAll = function() {
  950 + this.padding = parseInt(this.padding);
  951 + this.shadow = parseInt(this.shadow);
  952 + this.stemHeight = parseInt(this.stemHeight);
  953 + this.stemOverlap = parseInt(this.stemOverlap);
  954 + this.vOffset = parseInt(this.vOffset);
  955 + this.delayTime = parseInt(this.delayTime);
  956 + this.width = parseInt(this.width);
  957 + this.maxWidth = parseInt(this.maxWidth);
  958 + this.minWidth = parseInt(this.minWidth);
  959 + this.fadeIn = parseInt(this.fadeIn) || 1000;
  960 +}
  961 +
  962 +
  963 +// show/hide select elements in older IE
  964 +// plus user-defined elements
  965 +Balloon.prototype.showHide = function(visible) {
  966 + var self = currentBalloonClass || new Balloon;
  967 +
  968 + // IE z-index bug fix (courtesy of Lincoln Stein)
  969 + if (self.isOldIE()) {
  970 + var balloonContents = document.getElementById('contentWrapper');
  971 + if (!visible && balloonContents) {
  972 + var balloonSelects = balloonContents.getElementsByTagName('select');
  973 + var myHash = new Object();
  974 + for (var i=0; i<balloonSelects.length; i++) {
  975 + var id = balloonSelects[i].id || balloonSelects[i].name;
  976 + myHash[id] = 1;
  977 + }
  978 + balloonInvisibleSelects = new Array();
  979 + var allSelects = document.getElementsByTagName('select');
  980 + for (var i=0; i<allSelects.length; i++) {
  981 + var id = allSelects[i].id || allSelects[i].name;
  982 + if (self.isOverlap(allSelects[i],self.activeBalloon) && !myHash[id]) {
  983 + balloonInvisibleSelects.push(allSelects[i]);
  984 + self.setStyle(allSelects[i],'visibility','hidden');
  985 + }
  986 + }
  987 + }
  988 + else if (balloonInvisibleSelects) {
  989 + for (var i=0; i < balloonInvisibleSelects.length; i++) {
  990 + var id = balloonInvisibleSelects[i].id || balloonInvisibleSelects[i].name;
  991 + self.setStyle(balloonInvisibleSelects[i],'visibility','visible');
  992 + }
  993 + balloonInvisibleSelects = null;
  994 + }
  995 + }
  996 +
  997 + // show/hide any user-specified elements that overlap the balloon
  998 + if (self.hide) {
  999 + var display = visible ? 'inline' : 'none';
  1000 + for (var n=0;n<self.hide.length;n++) {
  1001 + if (self.isOverlap(self.activeBalloon,self.hide[n])) {
  1002 + self.setStyle(self.hide[n],'display',display);
  1003 + }
  1004 + }
  1005 + }
  1006 +}
  1007 +
  1008 +// Try to find overlap
  1009 +Balloon.prototype.isOverlap = function(el1,el2) {
  1010 + if (!el1 || !el2) return false;
  1011 + var R1 = this.getLoc(el1,'region');
  1012 + var R2 = this.getLoc(el2,'region');
  1013 + if (!R1 || !R2) return false;
  1014 + var intersect = R1.intersect(R2);
  1015 + if (intersect) {
  1016 + // extent of overlap;
  1017 + intersect = new Array((intersect.right - intersect.left),(intersect.bottom - intersect.top));
  1018 + }
  1019 + return intersect;
  1020 +}
  1021 +
  1022 +// Coordinate-based test for the same element
  1023 +Balloon.prototype.isSameElement = function(el1,el2) {
  1024 + if (!el1 || !el2) return false;
  1025 + var R1 = this.getLoc(el1,'region');
  1026 + var R2 = this.getLoc(el2,'region');
  1027 + var same = R1.contains(R2) && R2.contains(R1);
  1028 + return same ? true : false;
  1029 +}
  1030 +
  1031 +
  1032 +///////////////////////////////////////////////////////
  1033 +// Security -- get the balloon contents while checking
  1034 +// for disallowed elements.
  1035 +//////////////////////////////////////////////////////
  1036 +Balloon.prototype.getAndCheckContents = function(caption) {
  1037 + var originalCaption = caption;
  1038 + var notAllowed = 'are not allowed in popup balloons in this web site. \
  1039 + Please contact the site administrator for assistance.';
  1040 + var notSupported = 'AJAX is not supported for popup balloons in this web site. \
  1041 + Please contact the site administrator for assistance.';
  1042 +
  1043 + // no Help Url without AJAX
  1044 + if (this.helpUrl && !this.allowAJAX) {
  1045 + alert('Sorry, you have specified help URL '+this.helpUrl+' but '+notSupported);
  1046 + return null;
  1047 + }
  1048 +
  1049 + // look for a url in the balloon contents
  1050 + if (caption.match(/^url:/)) {
  1051 + this.activeUrl = caption.replace(/^url:/,'');
  1052 + caption = '';
  1053 + }
  1054 + // or if the text is a bare hyperlink
  1055 + else if (caption.match(/^(https?:|\/|ftp:)\S+$/i)) {
  1056 + this.activeUrl = caption;
  1057 + caption = '';
  1058 + }
  1059 +
  1060 + // Make sure AJAX is allowed
  1061 + if (this.activeUrl && !this.allowAJAX) {
  1062 + alert('Sorry, you asked for '+originalCaption+' but '+notSupported);
  1063 + return null;
  1064 + }
  1065 +
  1066 + // check if the contents are to be retrieved from an element
  1067 + if (caption.match(/^load:/)) {
  1068 + var load = caption.split(':');
  1069 + if (!document.getElementById(load[1])) alert ('problem locating element '+load[1]);
  1070 + caption = document.getElementById(load[1]).innerHTML;
  1071 + this.loadedFromElement = true;
  1072 + }
  1073 +
  1074 + // check if iframes are allowed
  1075 + if (caption.match(/\<\s*iframe/i) && !this.allowIframes) {
  1076 + alert('Sorry: iframe elements '+notAllowed);
  1077 + return null;
  1078 + }
  1079 +
  1080 + // check if event handlers are allowed
  1081 + if (caption.match(/\bon(load|mouse|click|unload|before)[^=]*=/i) && !this.allowEventHandlers) {
  1082 + alert('Sorry: JavaScript event handlers '+notAllowed);
  1083 + return null;
  1084 + }
  1085 +
  1086 + // check for script elements
  1087 + if (caption.match(/\<\s*script/i) && !this.allowScripts) {
  1088 + alert('Sorry: <script> elements '+notAllowed);
  1089 + return null;
  1090 + }
  1091 +
  1092 + // request the contents
  1093 + this.currentHelpText = this.getContents(caption);
  1094 + this.loadedFromElement = false;
  1095 +
  1096 + return this.currentHelpText;;
  1097 +}
  1098 +
  1099 +
  1100 +///////////////////////////////////////////////////////
  1101 +// AJAX widget to fill the balloons
  1102 +// requires prototype.js
  1103 +///////////////////////////////////////////////////////
  1104 +Balloon.prototype.getContents = function(section) {
  1105 +
  1106 + // just pass it back if no AJAX handler is required.
  1107 + if (!this.helpUrl && !this.activeUrl) return section;
  1108 +
  1109 + // or if the contents are already loaded from another element
  1110 + if (this.loadedFromElement) return section;
  1111 +
  1112 + // inline URL takes precedence
  1113 + var url = this.activeUrl || this.helpUrl;
  1114 + url += this.activeUrl ? '' : '?section='+section;
  1115 +
  1116 + // activeUrl is meant to be single-use only
  1117 + this.activeUrl = null;
  1118 +
  1119 + var ajax;
  1120 + if (window.XMLHttpRequest) {
  1121 + ajax = new XMLHttpRequest();
  1122 + } else {
  1123 + ajax = new ActiveXObject("Microsoft.XMLHTTP");
  1124 + }
  1125 +
  1126 + if (ajax) {
  1127 + ajax.open("GET", url, false);
  1128 + ajax.onreadystatechange=function() {
  1129 + //alert(ajax.readyState);
  1130 + };
  1131 + try {
  1132 + ajax.send(null);
  1133 + }
  1134 + catch (e) {
  1135 + // alert(e);
  1136 + }
  1137 + var txt = this.escapeHTML ? escape(ajax.responseText) : ajax.responseText;
  1138 + return txt || section;
  1139 + }
  1140 + else {
  1141 + return section;
  1142 + }
  1143 +}
  1144 +
  1145 +
  1146 +// test for internet explorer
  1147 +Balloon.prototype.isIE = function() {
  1148 + return document.all && !window.opera;
  1149 +}
  1150 +
  1151 +// test for internet explorer (but not IE7)
  1152 +Balloon.prototype.isOldIE = function() {
  1153 + if (navigator.appVersion.indexOf("MSIE") == -1) return false;
  1154 + var temp=navigator.appVersion.split("MSIE");
  1155 + return parseFloat(temp[1]) < 7;
  1156 +}
  1157 +
  1158 +// test for Konqueror
  1159 +Balloon.prototype.isKonqueror = function() {
  1160 + return navigator.userAgent.toLowerCase().indexOf( 'konqueror' ) != -1;
  1161 +}
  1162 +
  1163 +// and Google chrome
  1164 +Balloon.prototype.isChrome = function() {
  1165 + return navigator.userAgent.toLowerCase().indexOf('chrome') > -1;
  1166 +}
0 1167 \ No newline at end of file
... ...
pacotes/balloon-tooltips/htdocs/js/balloon.js~ 0 → 100644
... ... @@ -0,0 +1,1177 @@
  1 +/*
  2 + * balloon.js -- a DHTML library for balloon tooltips
  3 + *
  4 + * $Id: balloon.js 22300 2009-12-01 09:40:39Z sheldon_mckay $
  5 + *
  6 + * See http://www.gmod.org/wiki/index.php/Popup_Balloons
  7 + * for documentation.
  8 + *
  9 + * Copyright (c) 2007-2009 Sheldon McKay, Cold Spring Harbor Laboratory
  10 + *
  11 + * This balloon tooltip package and associated files not otherwise copyrighted are
  12 + * distributed under the MIT-style license:
  13 + *
  14 + * http://opensource.org/licenses/mit-license.php
  15 + *
  16 + * Permission is hereby granted, free of charge, to any person obtaining a copy
  17 + * of this software and associated documentation files (the "Software"), to deal
  18 + * in the Software without restriction, including without limitation the rights
  19 + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  20 + * copies of the Software, and to permit persons to whom the Software is
  21 + * furnished to do so, subject to the following conditions:
  22 + *
  23 + * The above copyright notice and this permission notice shall be included in
  24 + * all copies or substantial portions of the Software.
  25 + *
  26 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  27 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  28 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  29 + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  30 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  31 + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  32 + * THE SOFTWARE.
  33 + *
  34 + */
  35 +
  36 +// These global variables are necessary to avoid losing scope when
  37 +// setting the balloon timeout and for inter-object communication
  38 +var currentBalloonClass;
  39 +var balloonIsVisible;
  40 +var balloonIsSticky;
  41 +var balloonInvisibleSelects;
  42 +var balloonIsSuppressed;
  43 +var tooltipIsSuppressed;
  44 +
  45 +
  46 +//////////////////////////////////////////////////////////////////////////
  47 +// This is constructor that is called to initialize the Balloon object //
  48 +//////////////////////////////////////////////////////////////////////////
  49 +var Balloon = function () {
  50 + // Cursor tracking enabled by default
  51 + this.trackCursor = true;
  52 +
  53 + // Track the cursor every time the mouse moves
  54 + document.onmousemove = this.setActiveCoordinates;
  55 +
  56 + // scrolling aborts visible balloons
  57 + var myObject = this.isIE() ? window : document;
  58 + myObject.onscroll = function(){Balloon.prototype.nukeTooltip()};
  59 +
  60 + // make balloons go away if the page is unloading or waiting
  61 + // to unload.
  62 + window.onbeforeunload = function(){
  63 + Balloon.prototype.nukeTooltip();
  64 + balloonIsSuppressed = true;
  65 + };
  66 +
  67 + // for IE, the balloons can't start until the page is finished loading
  68 + // set a flag that will get toggled when loading is finished
  69 + if (this.isIE()) {
  70 + this.suppress = true;
  71 + }
  72 +
  73 + return this;
  74 +}
  75 +
  76 +//////////////////////////////////////////////////////////////////////////
  77 +// This is the method that is called on mouseover. It has a built-in //
  78 +// delay time to avoid balloons popping up on rapid mouseover events //
  79 +//////////////////////////////////////////////////////////////////////////
  80 +Balloon.prototype.showTooltip = function(evt,caption,sticky,width,height) {
  81 + // If the objext is not configured by now, fall back to default
  82 + if (!this.configured) {
  83 + BalloonConfig(this,'GBubble');
  84 + }
  85 +
  86 + // Cursor tracking halts after one of these vertical
  87 + // or horizontal thresholds are reached
  88 + this.stopTrackingX = this.trackCursor ? 100 : 10;
  89 + this.stopTrackingY = this.trackCursor ? 50 : 10;
  90 +
  91 + // Awful IE bug, page load aborts if the balloon is fired
  92 + // before the page is fully loaded.
  93 + if (this.isIE() && document.readyState.match(/complete/i)) {
  94 + this.suppress = false;
  95 + }
  96 +
  97 + // All balloons have been suppressed, go no further
  98 + if (this.suppress || balloonIsSuppressed) {
  99 + return false;
  100 + }
  101 +
  102 + // Non-sticky balloons suppressed
  103 + if (tooltipIsSuppressed && !sticky) {
  104 + return false;
  105 + }
  106 +
  107 + // We use 1-100 scale for opacity internally
  108 + if (this.opacity && this.opacity < 1) {
  109 + this.opacity = parseInt(parseFloat(this.opacity) * 100);
  110 + }
  111 + else if (this.opacity && this.opacity == 1) {
  112 + this.opacity = 100;
  113 + }
  114 + else if (!this.opacity) {
  115 + this.opacity == 100;
  116 + }
  117 +
  118 + // Sorry Konqueror, no fade-in or translucency for you!
  119 + if (this.isKonqueror()) {
  120 + this.allowFade = false;
  121 + this.opacity = 100;
  122 + }
  123 +
  124 + // With IE, fading and translucency are not very compatible
  125 + // use opaque balloons if fadein is enabled
  126 + if (this.isIE() && this.allowFade) {
  127 + this.opacity = 100;
  128 + }
  129 +
  130 + // Check for mouseover (vs. mousedown or click)
  131 + var mouseOver = true;
  132 + try{
  133 + var mouseOver = evt.type.match('mouseover','i');
  134 + }catch(e){}
  135 +
  136 + // if the firing event is a click, fade-in and a non-sticky balloon make no sense
  137 + if (!mouseOver) {
  138 + sticky = true;
  139 + this.fadeOK = false;
  140 + // case where hover and click events both trigger balloons
  141 + if (balloonIsVisible) {
  142 + this.hideTooltip();
  143 + }
  144 + }
  145 + else {
  146 + this.fadeOK = this.allowFade;
  147 + }
  148 +
  149 + // Don't fire on mouseover if a non-sticky balloon is visible
  150 + if (balloonIsVisible && !balloonIsSticky && mouseOver) {
  151 + return false;
  152 + }
  153 +
  154 + // Don't start a non-sticky balloon if a sticky one is visible
  155 + if (balloonIsVisible && balloonIsSticky && !sticky) {
  156 + return false;
  157 + }
  158 +
  159 + // Ignore repeated firing of mouseover->mouseout events on
  160 + // the same element (Safari)
  161 +
  162 + try{
  163 + var el = this.getEventTarget(evt);
  164 + }catch(e){var el = evt;}
  165 +
  166 + if (sticky && mouseOver && this.isSameElement(el,this.currentElement)) {
  167 + return false;
  168 + }
  169 + this.currentElement = el;
  170 +
  171 + // remember the coordinates of the element
  172 + this.elCoords = this.getLoc(el,'region');
  173 +
  174 + // attach a mouseout event handler to the target element
  175 + if (!sticky) {
  176 + var mouseoutFunc = el.onmouseout;
  177 + var closeBalloon = function() {
  178 + Balloon.prototype.hideTooltip();
  179 + // fall through to any onmouseout event specified elsewhere
  180 + if (mouseoutFunc) {
  181 + mouseoutFunc();
  182 + }
  183 + }
  184 + if (!mouseOver) {
  185 + el.onmouseup = function() {return false};
  186 + }
  187 + //el.onmouseout = closeBalloon;
  188 + }
  189 +
  190 + balloonIsSticky = sticky;
  191 +
  192 + this.hideTooltip();
  193 +
  194 + // request the contents synchronously (ie wait for result)
  195 + this.currentHelpText = this.getAndCheckContents(caption);
  196 +
  197 + // no contents? abort.
  198 + if (!this.currentHelpText) {
  199 + return false;
  200 + }
  201 +
  202 + this.width = width;
  203 + this.height = height;
  204 + this.actualWidth = null;
  205 +
  206 + // make sure old balloons are removed
  207 + this.hideTooltip();
  208 +
  209 + // Put the balloon contents and images into a visible (but offscreen)
  210 + // element so they will be preloaded and have a layout to
  211 + // calculate the balloon dimensions
  212 + this.container = document.createElement('div');
  213 + this.container.id = 'balloonPreloadContainer';
  214 + document.body.appendChild(this.container);
  215 + this.setStyle(this.container,'position','absolute');
  216 + this.setStyle(this.container,'top',-8888);
  217 + this.setStyle(this.container,'font-family',this.fontFamily);
  218 + this.setStyle(this.container,'font-size',this.fontSize);
  219 +
  220 + // protect escaped '&'
  221 + this.currentHelpText = this.currentHelpText.replace(/\&amp;/g, '&amp;amp');
  222 + this.container.innerHTML = unescape(this.currentHelpText);
  223 +
  224 + // make sure balloon image path is complete
  225 + if (this.images) {
  226 +
  227 + // main background image
  228 + this.balloonImage = this.balloonImage ? this.images +'/'+ this.balloonImage : false;
  229 + this.ieImage = this.ieImage ? this.images +'/'+ this.ieImage : false;
  230 +
  231 + // optional stems
  232 + this.upLeftStem = this.upLeftStem ? this.images +'/'+ this.upLeftStem : false;
  233 + this.upRightStem = this.upRightStem ? this.images +'/'+ this.upRightStem : false;
  234 + this.downLeftStem = this.downLeftStem ? this.images +'/'+ this.downLeftStem : false;
  235 + this.downRightStem = this.downRightStem ? this.images +'/'+ this.downRightStem : false;
  236 +
  237 + this.closeButton = this.closeButton ? this.images +'/'+ this.closeButton : false;
  238 +
  239 + this.images = false;
  240 + }
  241 +
  242 + // The PNG alpha channels (shadow transparency) are not
  243 + // handled properly by IE < 6. Also, if opacity is set to
  244 + // < 1 (translucent balloons), any version of IE does not
  245 + // handle the image properly.
  246 + // Google chrome is a bit dodgey too
  247 + // If there is an IE image provided, use that instead.
  248 + if (this.ieImage && (this.isIE() || this.isChrome())) {
  249 + if (this.isOldIE() || this.opacity || this.allowFade) {
  250 + this.balloonImage = this.ieImage;
  251 + }
  252 + }
  253 +
  254 + // preload balloon images
  255 + if (!this.preloadedImages) {
  256 + var images = new Array(this.balloonImage, this.closeButton);
  257 + if (this.ieImage) {
  258 + images.push(this.ieImage);
  259 + }
  260 + if (this.stem) {
  261 + images.push(this.upLeftStem,this.upRightStem,this.downLeftStem,this.downRightStem);
  262 + }
  263 + var len = images.length;
  264 + for (var i=0;i<len;i++) {
  265 + if ( images[i] ) {
  266 + this.preload(images[i]);
  267 + }
  268 + }
  269 + this.preloadedImages = true;
  270 + }
  271 +
  272 + currentBalloonClass = this;
  273 +
  274 + // Capture coordinates for mousedown or click
  275 + //if (!mouseOver) {this.setActiveCoordinates(evt);}
  276 + if (!mouseOver) el.onmouseup = function() {return false;};
  277 + // Remember which event started this
  278 + this.currentEvent = evt;
  279 +
  280 + // prevent interaction with gbrowse drag and drop
  281 + evt.cancelBubble = true;
  282 +
  283 + // Make delay time short for onmousedown
  284 + //var delay = mouseOver ? this.delayTime : 1;
  285 + //this.timeoutTooltip = window.setTimeout(this.doShowTooltip,delay);
  286 + this.doShowTooltip();
  287 + this.pending = true;
  288 +}
  289 +
  290 +// Preload the balloon background images
  291 +Balloon.prototype.preload = function(src) {
  292 + var i = new Image;
  293 + i.src = src;
  294 +
  295 + // append to the DOM tree so the images have a layout,
  296 + // then remove.
  297 + this.setStyle(i,'position','absolute');
  298 + this.setStyle(i,'top',-8000);
  299 + document.body.appendChild(i);
  300 + document.body.removeChild(i);
  301 +}
  302 +
  303 +
  304 +/////////////////////////////////////////////////////////////////////
  305 +// Tooltip rendering function
  306 +/////////////////////////////////////////////////////////////////////
  307 +Balloon.prototype.doShowTooltip = function() {
  308 + var self = currentBalloonClass;
  309 +
  310 + // Stop firing if a balloon is already being displayed
  311 + if (balloonIsVisible) {
  312 + return false;
  313 + }
  314 + if (!self.parent) {
  315 + if (self.parentID) {
  316 + self.parent = document.getElementById(self.parentID);
  317 + }
  318 + else {
  319 + self.parent = document.body;
  320 + }
  321 + self.xOffset = self.getLoc(self.parent, 'x1');
  322 + self.yOffset = self.getLoc(self.parent, 'y1');
  323 + }
  324 +
  325 + // a short delay time might cause some intereference
  326 + // with fading
  327 + window.clearTimeout(self.timeoutFade);
  328 + if (!balloonIsSticky) {
  329 + self.setStyle('visibleBalloonElement','display','none');
  330 + }
  331 +
  332 + // make sure user-configured numbers are not strings
  333 + self.parseIntAll();
  334 +
  335 + // create the balloon object
  336 + var balloon = self.makeBalloon();
  337 +
  338 + // window dimensions
  339 + var pageWidth = YAHOO.util.Dom.getViewportWidth();
  340 + var pageCen = Math.round(pageWidth/2);
  341 + var pageHeight = YAHOO.util.Dom.getViewportHeight();
  342 + var pageLeft = YAHOO.util.Dom.getDocumentScrollLeft();
  343 + var pageTop = YAHOO.util.Dom.getDocumentScrollTop();
  344 + var pageMid = pageTop + Math.round(pageHeight/2);
  345 + self.pageBottom = pageTop + pageHeight;
  346 + self.pageTop = pageTop;
  347 + self.pageLeft = pageLeft;
  348 + self.pageRight = pageLeft + pageWidth;
  349 +
  350 + // balloon orientation
  351 + var vOrient = self.activeTop > pageMid ? 'up' : 'down';
  352 + var hOrient = self.activeRight > pageCen ? 'left' : 'right';
  353 +
  354 + // get the preloaded balloon contents
  355 + var helpText = self.container.innerHTML;
  356 + self.actualWidth = self.getLoc(self.container,'width');
  357 + if (!isNaN(self.actualWidth)) {
  358 + self.actualWidth += 10;
  359 + }
  360 + self.parent.removeChild(self.container);
  361 + var wrapper = document.createElement('div');
  362 + wrapper.id = 'contentWrapper';
  363 + self.contents.appendChild(wrapper);
  364 + wrapper.innerHTML = helpText;
  365 +
  366 + // how and where to draw the balloon
  367 + self.setBalloonStyle(vOrient,hOrient,pageWidth,pageLeft);
  368 +
  369 + // close control for balloon or box
  370 + if (balloonIsSticky) {
  371 + self.addCloseButton();
  372 + }
  373 +
  374 + balloonIsVisible = true;
  375 + self.pending = false;
  376 +
  377 + // in IE < 7, hide <select> elements
  378 + self.showHide();
  379 +
  380 + self.startX = self.activeLeft;
  381 + self.startY = self.activeTop;
  382 + self.fade(0,self.opacity,self.fadeIn);
  383 +}
  384 +
  385 +Balloon.prototype.addCloseButton = function () {
  386 + var self = currentBalloonClass;
  387 + var margin = Math.round(self.padding/2);
  388 + var closeWidth = self.closeButtonWidth || 16;
  389 + var balloonTop = self.getLoc('visibleBalloonElement','y1') + margin + self.shadow;
  390 + var BalloonLeft = self.getLoc('topRight','x2') - self.closeButtonWidth - self.shadow - margin;
  391 + var closeButton = document.getElementById('closeButton');
  392 +
  393 + if (!closeButton) {
  394 + closeButton = new Image;
  395 + closeButton.setAttribute('id','closeButton');
  396 + closeButton.setAttribute('src',self.closeButton);
  397 + closeButton.onclick = function() {
  398 + Balloon.prototype.nukeTooltip();
  399 + };
  400 + self.setStyle(closeButton,'position','absolute');
  401 + document.body.appendChild(closeButton);
  402 + }
  403 +
  404 + // I have no idea why
  405 + if (self.isIE()) {
  406 + BalloonLeft = BalloonLeft - 5;
  407 + }
  408 +
  409 + self.setStyle(closeButton,'top',balloonTop);
  410 + self.setStyle(closeButton,'left',BalloonLeft);
  411 + self.setStyle(closeButton,'display','inline');
  412 + self.setStyle(closeButton,'cursor','pointer');
  413 + self.setStyle(closeButton,'z-index',999999999);
  414 +}
  415 +
  416 +// use a fresh object every time to make sure style
  417 +// is not polluted
  418 +Balloon.prototype.makeBalloon = function() {
  419 + var self = currentBalloonClass;
  420 +
  421 + var balloon = document.getElementById('visibleBalloonElement');
  422 + if (balloon) {
  423 + self.hideTooltip();
  424 + }
  425 +
  426 + balloon = document.createElement('div');
  427 + balloon.setAttribute('id','visibleBalloonElement');
  428 + self.parent.appendChild(balloon);
  429 + self.activeBalloon = balloon;
  430 +
  431 + self.parts = new Array();
  432 + var parts = new Array('contents','topRight','bottomRight','bottomLeft');
  433 + for (var i=0;i<parts.length;i++) {
  434 + var child = document.createElement('div');
  435 + child.setAttribute('id',parts[i]);
  436 + balloon.appendChild(child);
  437 + if (parts[i] == 'contents') self.contents = child;
  438 + self.parts.push(child);
  439 + }
  440 + //self.parts.push(balloon);
  441 +
  442 + if (self.displayTime) {
  443 + self.timeoutAutoClose = window.setTimeout(this.hideTooltip,self.displayTime);
  444 + }
  445 + return balloon;
  446 +}
  447 +
  448 +Balloon.prototype.setBalloonStyle = function(vOrient,hOrient,pageWidth,pageLeft) {
  449 + var self = currentBalloonClass;
  450 + var balloon = self.activeBalloon;
  451 +
  452 + if (typeof(self.shadow) != 'number') self.shadow = 0;
  453 + if (!self.stem) self.stemHeight = 0;
  454 +
  455 + var fullPadding = self.padding + self.shadow;
  456 + var insidePadding = self.padding;
  457 + var outerWidth = self.actualWidth + fullPadding;
  458 + var innerWidth = self.actualWidth;
  459 +
  460 + self.setStyle(balloon,'position','absolute');
  461 + self.setStyle(balloon,'top',-9999);
  462 + self.setStyle(balloon,'z-index',1000000);
  463 +
  464 + if (self.height) {
  465 + self.setStyle('contentWrapper','height',self.height-fullPadding);
  466 + }
  467 +
  468 + if (self.width) {
  469 + self.setStyle(balloon,'width',self.width);
  470 + innerWidth = self.width - fullPadding;
  471 + if (balloonIsSticky) {
  472 + innerWidth -= self.closeButtonWidth;
  473 + }
  474 + self.setStyle('contentWrapper','width',innerWidth);
  475 + }
  476 + else {
  477 + self.setStyle(balloon,'width',outerWidth);
  478 + self.setStyle('contentWrapper','width',innerWidth);
  479 + }
  480 +
  481 + // not too big...
  482 + if (!self.width && self.maxWidth && outerWidth > self.maxWidth) {
  483 + self.setStyle(balloon,'width',self.maxWidth);
  484 + self.setStyle('contentWrapper','width',self.maxWidth-fullPadding);
  485 + }
  486 + // not too small...
  487 + if (!self.width && self.minWidth && outerWidth < self.minWidth) {
  488 + self.setStyle(balloon,'width',self.minWidth);
  489 + self.setStyle('contentWrapper','width',self.minWidth-fullPadding);
  490 + }
  491 +
  492 + self.setStyle('contents','z-index',2);
  493 + self.setStyle('contents','color',self.fontColor);
  494 + self.setStyle('contents','font-family',self.fontFamily);
  495 + self.setStyle('contents','font-size',self.fontSize);
  496 + self.setStyle('contents','background','url('+self.balloonImage+') top left no-repeat');
  497 + self.setStyle('contents','padding-top',fullPadding);
  498 + self.setStyle('contents','padding-left',fullPadding);
  499 +
  500 + self.setStyle('bottomRight','background','url('+self.balloonImage+') bottom right no-repeat');
  501 + self.setStyle('bottomRight','position','absolute');
  502 + self.setStyle('bottomRight','right',0-fullPadding);
  503 + self.setStyle('bottomRight','bottom',0-fullPadding);
  504 + self.setStyle('bottomRight','height',fullPadding);
  505 + self.setStyle('bottomRight','width',fullPadding);
  506 + self.setStyle('bottomRight','z-index',-1);
  507 +
  508 + self.setStyle('topRight','background','url('+self.balloonImage+') top right no-repeat');
  509 + self.setStyle('topRight','position','absolute');
  510 + self.setStyle('topRight','right',0-fullPadding);
  511 + self.setStyle('topRight','top',0);
  512 + self.setStyle('topRight','width',fullPadding);
  513 +
  514 + self.setStyle('bottomLeft','background','url('+self.balloonImage+') bottom left no-repeat');
  515 + self.setStyle('bottomLeft','position','absolute');
  516 + self.setStyle('bottomLeft','left',0);
  517 + self.setStyle('bottomLeft','bottom',0-fullPadding);
  518 + self.setStyle('bottomLeft','height',fullPadding);
  519 + self.setStyle('bottomLeft','z-index',-1);
  520 +
  521 + if (this.stem) {
  522 + var stem = document.createElement('img');
  523 + self.setStyle(stem,'position','absolute');
  524 + balloon.appendChild(stem);
  525 +
  526 + if (vOrient == 'up' && hOrient == 'left') {
  527 + stem.src = self.upLeftStem;
  528 + var height = self.stemHeight + insidePadding - self.stemOverlap;
  529 + self.setStyle(stem,'bottom',0-height);
  530 + self.setStyle(stem,'right',0);
  531 + }
  532 + else if (vOrient == 'down' && hOrient == 'left') {
  533 + stem.src = self.downLeftStem;
  534 + var height = self.stemHeight - (self.shadow + self.stemOverlap);
  535 + self.setStyle(stem,'top',0-height);
  536 + self.setStyle(stem,'right',0);
  537 + }
  538 + else if (vOrient == 'up' && hOrient == 'right') {
  539 + stem.src = self.upRightStem;
  540 + var height = self.stemHeight + insidePadding - self.stemOverlap;
  541 + self.setStyle(stem,'bottom',0-height);
  542 + self.setStyle(stem,'left',self.shadow);
  543 + }
  544 + else if (vOrient == 'down' && hOrient == 'right') {
  545 + stem.src = self.downRightStem;
  546 + var height = self.stemHeight - (self.shadow + self.stemOverlap);
  547 + self.setStyle(stem,'top',0-height);
  548 + self.setStyle(stem,'left',self.shadow);
  549 + }
  550 + if (self.fadeOK && self.isIE()) {
  551 + self.parts.push(stem);
  552 + }
  553 + }
  554 +
  555 + if (self.allowFade) {
  556 + self.setOpacity(1);
  557 + }
  558 + else if (self.opacity) {
  559 + self.setOpacity(self.opacity);
  560 + }
  561 +
  562 + // flip left or right, as required
  563 + if (hOrient == 'left') {
  564 + var pageWidth = self.pageRight - self.pageLeft;
  565 + var activeRight = pageWidth - self.activeLeft;
  566 + self.setStyle(balloon,'right',activeRight);
  567 + }
  568 + else {
  569 + var activeLeft = self.activeRight - self.xOffset;
  570 + self.setStyle(balloon,'left',activeLeft);
  571 + }
  572 +
  573 + // oversized contents? Scrollbars for sticky balloons, clipped for non-sticky
  574 + var overflow = balloonIsSticky ? 'auto' : 'hidden';
  575 + self.setStyle('contentWrapper','overflow',overflow);
  576 +
  577 + // a bit of room for the closebutton
  578 + if (balloonIsSticky) {
  579 + self.setStyle('contentWrapper','margin-right',self.closeButtonWidth);
  580 + }
  581 +
  582 + // Make sure the balloon is not offscreen horizontally.
  583 + // We handle vertical sanity checking later, after the final
  584 + // layout is set.
  585 + var balloonLeft = self.getLoc(balloon,'x1');
  586 + var balloonRight = self.getLoc(balloon,'x2');
  587 + var scrollBar = 20;
  588 +
  589 + if (hOrient == 'right' && balloonRight > (self.pageRight - fullPadding)) {
  590 + var width = (self.pageRight - balloonLeft) - fullPadding - scrollBar;
  591 + self.setStyle(balloon,'width',width);
  592 + self.setStyle('contentWrapper','width',width-fullPadding);
  593 + }
  594 + else if (hOrient == 'left' && balloonLeft < (self.pageLeft + fullPadding)) {
  595 + var width = (balloonRight - self.pageLeft) - fullPadding;
  596 + self.setStyle(balloon,'width',width);
  597 + self.setStyle('contentWrapper','width',width-fullPadding);
  598 + }
  599 +
  600 + // Get the width/height for the right and bottom outlines
  601 + var balloonWidth = self.getLoc(balloon,'width');
  602 + var balloonHeight = self.getLoc(balloon,'height');
  603 +
  604 + // IE7 quirk -- look for unwanted overlap cause by an off by 1px error
  605 + var vOverlap = self.isOverlap('topRight','bottomRight');
  606 + var hOverlap = self.isOverlap('bottomLeft','bottomRight');
  607 + if (vOverlap) {
  608 + self.setStyle('topRight','height',balloonHeight-vOverlap[1]);
  609 + }
  610 + if (hOverlap) {
  611 + self.setStyle('bottomLeft','width',balloonWidth-hOverlap[0]);
  612 + }
  613 +
  614 + // vertical position of the balloon
  615 + if (vOrient == 'up') {
  616 + var activeTop = self.activeTop - balloonHeight;
  617 + self.setStyle(balloon,'top',activeTop);
  618 + }
  619 + else {
  620 + var activeTop = self.activeBottom;
  621 + self.setStyle(balloon,'top',activeTop);
  622 + }
  623 +
  624 + // Make sure the balloon is vertically contained in the window
  625 + var balloonTop = self.getLoc(balloon,'y1');
  626 + var balloonBottom = self.height ? balloonTop + self.height : self.getLoc(balloon,'y2');
  627 + var deltaTop = balloonTop < self.pageTop ? self.pageTop - balloonTop : 0;
  628 + var deltaBottom = balloonBottom > self.pageBottom ? balloonBottom - self.pageBottom : 0;
  629 +
  630 + if (vOrient == 'up' && deltaTop) {
  631 + var newHeight = balloonHeight - deltaTop;
  632 + if (newHeight > (self.padding*2)) {
  633 + self.setStyle('contentWrapper','height',newHeight-fullPadding);
  634 + self.setStyle(balloon,'top',self.pageTop+self.padding);
  635 + self.setStyle(balloon,'height',newHeight);
  636 + }
  637 + }
  638 + if (vOrient == 'down' && deltaBottom) {
  639 + var newHeight = balloonHeight - deltaBottom - scrollBar;
  640 + if (newHeight > (self.padding*2) + scrollBar) {
  641 + self.setStyle('contentWrapper','height',newHeight-fullPadding);
  642 + self.setStyle(balloon,'height',newHeight);
  643 + }
  644 + }
  645 +
  646 + // If we have an iframe, make sure it fits properly
  647 + var iframe = balloon.getElementsByTagName('iframe');
  648 + if (iframe[0]) {
  649 + iframe = iframe[0];
  650 + var w = self.getLoc('contentWrapper','width');
  651 + if (balloonIsSticky && !this.isIE()) {
  652 + w -= self.closeButtonWidth;
  653 + }
  654 + var h = self.getLoc('contentWrapper','height');
  655 + self.setStyle(iframe,'width',w);
  656 + self.setStyle(iframe,'height',h);
  657 + self.setStyle('contentWrapper','overflow','hidden');
  658 + }
  659 +
  660 + // Make edges match the main balloon body
  661 + self.setStyle('topRight','height', self.getLoc(balloon,'height'));
  662 + self.setStyle('bottomLeft','width', self.getLoc(balloon,'width'));
  663 +
  664 + self.hOrient = hOrient;
  665 + self.vOrient = vOrient;
  666 +}
  667 +
  668 +
  669 +// Fade method adapted from an example on
  670 +// http://brainerror.net/scripts/javascript/blendtrans/
  671 +Balloon.prototype.fade = function(opacStart, opacEnd, millisec) {
  672 + var self = currentBalloonClass || new Balloon;
  673 + if (!millisec || !self.allowFade) {
  674 + return false;
  675 + }
  676 +
  677 + opacEnd = opacEnd || 100;
  678 +
  679 + //speed for each frame
  680 + var speed = Math.round(millisec / 100);
  681 + var timer = 0;
  682 + for(o = opacStart; o <= opacEnd; o++) {
  683 + self.timeoutFade = setTimeout('Balloon.prototype.setOpacity('+o+')',(timer*speed));
  684 + timer++;
  685 + }
  686 +}
  687 +
  688 +Balloon.prototype.setOpacity = function(opc) {
  689 + var self = currentBalloonClass;
  690 + if (!self || !opc) return false;
  691 +
  692 + var o = parseFloat(opc/100);
  693 +
  694 + // opacity handled differently for IE
  695 + var parts = self.isIE() ? self.parts : [self.activeBalloon];
  696 +
  697 + var len = parts.length;
  698 + for (var i=0;i<len;i++) {
  699 + self.doOpacity(o,opc,parts[i]);
  700 + }
  701 +}
  702 +
  703 +Balloon.prototype.doOpacity = function(op,opc,el) {
  704 + var self = currentBalloonClass;
  705 + if (!el) return false;
  706 +
  707 + // CSS standards-compliant browsers!
  708 + self.setStyle(el,'opacity',op);
  709 +
  710 + // old IE
  711 + self.setStyle(el,'filter','alpha(opacity='+opc+')');
  712 +
  713 + // old Mozilla/NN
  714 + self.setStyle(el,'MozOpacity',op);
  715 +
  716 + // old Safari
  717 + self.setStyle(el,'KhtmlOpacity',op);
  718 +}
  719 +
  720 +Balloon.prototype.nukeTooltip = function() {
  721 + this.hideTooltip(1);
  722 +}
  723 +
  724 +Balloon.prototype.hideTooltip = function(override) {
  725 + // some browsers pass the event object == we don't want it
  726 + if (override && typeof override == 'object') override = false;
  727 + if (balloonIsSticky && !override) return false;
  728 + var self = currentBalloonClass;
  729 + Balloon.prototype.showHide(1);
  730 + Balloon.prototype.cleanup();
  731 +
  732 + if (self) {
  733 + window.clearTimeout(self.timeoutTooltip);
  734 + window.clearTimeout(self.timeoutFade);
  735 + window.clearTimeout(self.timeoutAutoClose);
  736 + if (balloonIsSticky) {
  737 + self.currentElement = null;
  738 + }
  739 + self.startX = 0;
  740 + self.startY = 0;
  741 + }
  742 +
  743 + balloonIsVisible = false;
  744 + balloonIsSticky = false;
  745 +}
  746 +
  747 +// Garbage collection
  748 +Balloon.prototype.cleanup = function() {
  749 + var self = currentBalloonClass;
  750 + var body;
  751 + if (self) {
  752 + body = self.parent ? self.parent
  753 + : self.parentID ? document.getElementById(self.parentID) || document.body
  754 + : document.body;
  755 + }
  756 + else {
  757 + body = document.body;
  758 + }
  759 +
  760 + var bubble = document.getElementById('visibleBalloonElement');
  761 + var close = document.getElementById('closeButton');
  762 + var cont = document.getElementById('balloonPreloadContainer');
  763 + if (bubble) { body.removeChild(bubble) }
  764 + if (close) { body.removeChild(close) }
  765 + if (cont) { body.removeChild(cont) }
  766 +}
  767 +
  768 +
  769 +// this function is meant to be called externally to clear
  770 +// any open balloons
  771 +hideAllTooltips = function() {
  772 + var self = currentBalloonClass;
  773 + if (!self) return;
  774 + window.clearTimeout(self.timeoutTooltip);
  775 + if (self.activeBalloon) self.setStyle(self.activeBalloon,'display','none');
  776 + balloonIsVisible = false;
  777 + balloonIsSticky = false;
  778 + currentBalloonClass = null;
  779 +}
  780 +
  781 +
  782 +// Track the active mouseover coordinates
  783 +Balloon.prototype.setActiveCoordinates = function(evt) {
  784 + var self = currentBalloonClass;
  785 + if (!self) {
  786 + return true;
  787 + }
  788 + var evt = evt || window.event || self.currentEvent;
  789 + if (!evt) {
  790 + return true;
  791 + }
  792 + //
  793 + //modificado por edmar
  794 + //
  795 + alert(evt.id)
  796 + try{
  797 + if(typeof(evt.id) == "string")
  798 + {
  799 + var pos = i3GEO.util.pegaPosicaoObjeto(event);
  800 + self.activeTop = pos[1] - 10;
  801 + self.activeLeft = pos[0] - 10;
  802 + self.activeRight = self.activeLeft + 20;
  803 + self.activeBottom = self.activeTop + 20;
  804 + return true;
  805 + }
  806 + }catch(e){}
  807 + self.currentEvent = {};
  808 + for (var i in evt) {
  809 + self.currentEvent[i] = evt[i];
  810 + }
  811 +
  812 + // avoid silent NaN errors
  813 + self.hOffset = self.hOffset || 1;
  814 + self.vOffset = self.vOffset || 1;
  815 + self.stemHeight = self.stem && self.stemHeight ? (self.stemHeight|| 0) : 0;
  816 +
  817 + var scrollTop = 0;
  818 + var scrollLeft = 0;
  819 +
  820 + var XY = self.eventXY(evt);
  821 + adjustment = self.hOffset < 20 ? 10 : 0;
  822 + self.activeTop = scrollTop + XY[1] - adjustment - self.vOffset - self.stemHeight;
  823 + self.activeLeft = scrollLeft + XY[0] - adjustment - self.hOffset;
  824 + self.activeRight = scrollLeft + XY[0];
  825 + self.activeBottom = scrollTop + XY[1] + self.vOffset + 2*adjustment;
  826 +
  827 + // dynamic positioning but only if the balloon is not sticky
  828 + // and cursor tracking is enabled
  829 + if (balloonIsVisible && !balloonIsSticky) {
  830 + var deltaX = Math.abs(self.activeLeft - self.startX);
  831 + var deltaY = Math.abs(self.activeTop - self.startY);
  832 +
  833 + // Close the balloon if the cursor has left the firing element
  834 + if ( XY[0] < self.elCoords.left || XY[0] > self.elCoords.right
  835 + || XY[1] < self.elCoords.top || XY[1] > self.elCoords.bottom ) {
  836 + //self.hideTooltip();
  837 + }
  838 +
  839 + // In some cases , such as <area> elements in image maps or big elements,
  840 + // we need to kill the balloon if the mouse has strayed too far.
  841 + if (deltaX > self.stopTrackingX || deltaY > self.stopTrackingY) {
  842 + //self.hideTooltip();
  843 + }
  844 + else if (self.trackCursor) {
  845 + var b = self.activeBalloon;
  846 + var bwidth = self.getLoc(b,'width');
  847 + var bheight = self.getLoc(b,'height');
  848 + var btop = self.getLoc(b,'y1');
  849 + var bleft = self.getLoc(b,'x1');
  850 +
  851 + if (self.hOrient == 'right') {
  852 + self.setStyle(b,'left',self.activeRight);
  853 + }
  854 + else if (self.hOrient == 'left') {
  855 + self.setStyle(b,'right',null);
  856 + var newLeft = self.activeLeft - bwidth;
  857 + self.setStyle(b,'left',newLeft);
  858 + }
  859 +
  860 + if (self.vOrient == 'up') {
  861 + self.setStyle(b,'top',self.activeTop - bheight);
  862 + }
  863 + else if (self.vOrient == 'down') {
  864 + self.setStyle(b,'top',self.activeBottom);
  865 + }
  866 + }
  867 + }
  868 +
  869 + return true;
  870 +}
  871 +
  872 +////
  873 +// event XY and getEventTarget Functions based on examples by Peter-Paul
  874 +// Koch http://www.quirksmode.org/js/events_properties.html
  875 +Balloon.prototype.eventXY = function(event) {
  876 + var XY = new Array(2);
  877 + var e = event || window.event;
  878 + if (!e) {
  879 + return false;
  880 + }
  881 + if (e.pageX || e.pageY) {
  882 + XY[0] = e.pageX;
  883 + XY[1] = e.pageY;
  884 + return XY;
  885 + }
  886 + else if ( e.clientX || e.clientY ) {
  887 + XY[0] = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
  888 + XY[1] = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
  889 + return XY;
  890 + }
  891 +}
  892 +
  893 +Balloon.prototype.getEventTarget = function(event) {
  894 + var targ;
  895 + var e = event || window.event;
  896 + if (e.target) targ = e.target;
  897 + else if (e.srcElement) targ = e.srcElement;
  898 + if (targ.nodeType == 3) targ = targ.parentNode; // Safari
  899 + return targ;
  900 +}
  901 +////
  902 +
  903 +
  904 +Balloon.prototype.setStyle = function(el,att,val) {
  905 + if (!el) {
  906 + return false;
  907 + }
  908 + if (typeof(el) != 'object') {
  909 + el = document.getElementById(el);
  910 + }
  911 + if (!el) {
  912 + return false;
  913 + }
  914 +
  915 + var v = val;
  916 +
  917 + if (val && att.match(/left|top|bottom|right|width|height|padding|margin/)) {
  918 + val = new String(val);
  919 + if (!val.match(/auto/)) {
  920 + val += 'px';
  921 + }
  922 + }
  923 +
  924 +
  925 + // z-index does not work as expected
  926 + if (att == 'z-index') {
  927 + if (el.style) {
  928 + el.style.zIndex = parseInt(val);
  929 + }
  930 + }
  931 + else {
  932 + // Oh just shut up, IE
  933 + if (this.isIE() && att.match(/^left|right|top|bottom$/) && !parseInt(val) && val != 0) {
  934 + val = null;
  935 + }
  936 +
  937 + YAHOO.util.Dom.setStyle(el,att,val);
  938 + }
  939 +}
  940 +
  941 +// Uses YAHOO's region class for element coordinates
  942 +Balloon.prototype.getLoc = function(el,request) {
  943 + var region = YAHOO.util.Dom.getRegion(el);
  944 +
  945 + switch(request) {
  946 + case ('y1') : return parseInt(region.top);
  947 + case ('y2') : return parseInt(region.bottom);
  948 + case ('x1') : return parseInt(region.left);
  949 + case ('x2') : return parseInt(region.right);
  950 + case ('width') : return (parseInt(region.right) - parseInt(region.left));
  951 + case ('height') : return (parseInt(region.bottom) - parseInt(region.top));
  952 + case ('region') : return region;
  953 + }
  954 +
  955 + return region;
  956 +}
  957 +
  958 +// We don't know if numbers are overridden with strings
  959 +// so play it safe
  960 +Balloon.prototype.parseIntAll = function() {
  961 + this.padding = parseInt(this.padding);
  962 + this.shadow = parseInt(this.shadow);
  963 + this.stemHeight = parseInt(this.stemHeight);
  964 + this.stemOverlap = parseInt(this.stemOverlap);
  965 + this.vOffset = parseInt(this.vOffset);
  966 + this.delayTime = parseInt(this.delayTime);
  967 + this.width = parseInt(this.width);
  968 + this.maxWidth = parseInt(this.maxWidth);
  969 + this.minWidth = parseInt(this.minWidth);
  970 + this.fadeIn = parseInt(this.fadeIn) || 1000;
  971 +}
  972 +
  973 +
  974 +// show/hide select elements in older IE
  975 +// plus user-defined elements
  976 +Balloon.prototype.showHide = function(visible) {
  977 + var self = currentBalloonClass || new Balloon;
  978 +
  979 + // IE z-index bug fix (courtesy of Lincoln Stein)
  980 + if (self.isOldIE()) {
  981 + var balloonContents = document.getElementById('contentWrapper');
  982 + if (!visible && balloonContents) {
  983 + var balloonSelects = balloonContents.getElementsByTagName('select');
  984 + var myHash = new Object();
  985 + for (var i=0; i<balloonSelects.length; i++) {
  986 + var id = balloonSelects[i].id || balloonSelects[i].name;
  987 + myHash[id] = 1;
  988 + }
  989 + balloonInvisibleSelects = new Array();
  990 + var allSelects = document.getElementsByTagName('select');
  991 + for (var i=0; i<allSelects.length; i++) {
  992 + var id = allSelects[i].id || allSelects[i].name;
  993 + if (self.isOverlap(allSelects[i],self.activeBalloon) && !myHash[id]) {
  994 + balloonInvisibleSelects.push(allSelects[i]);
  995 + self.setStyle(allSelects[i],'visibility','hidden');
  996 + }
  997 + }
  998 + }
  999 + else if (balloonInvisibleSelects) {
  1000 + for (var i=0; i < balloonInvisibleSelects.length; i++) {
  1001 + var id = balloonInvisibleSelects[i].id || balloonInvisibleSelects[i].name;
  1002 + self.setStyle(balloonInvisibleSelects[i],'visibility','visible');
  1003 + }
  1004 + balloonInvisibleSelects = null;
  1005 + }
  1006 + }
  1007 +
  1008 + // show/hide any user-specified elements that overlap the balloon
  1009 + if (self.hide) {
  1010 + var display = visible ? 'inline' : 'none';
  1011 + for (var n=0;n<self.hide.length;n++) {
  1012 + if (self.isOverlap(self.activeBalloon,self.hide[n])) {
  1013 + self.setStyle(self.hide[n],'display',display);
  1014 + }
  1015 + }
  1016 + }
  1017 +}
  1018 +
  1019 +// Try to find overlap
  1020 +Balloon.prototype.isOverlap = function(el1,el2) {
  1021 + if (!el1 || !el2) return false;
  1022 + var R1 = this.getLoc(el1,'region');
  1023 + var R2 = this.getLoc(el2,'region');
  1024 + if (!R1 || !R2) return false;
  1025 + var intersect = R1.intersect(R2);
  1026 + if (intersect) {
  1027 + // extent of overlap;
  1028 + intersect = new Array((intersect.right - intersect.left),(intersect.bottom - intersect.top));
  1029 + }
  1030 + return intersect;
  1031 +}
  1032 +
  1033 +// Coordinate-based test for the same element
  1034 +Balloon.prototype.isSameElement = function(el1,el2) {
  1035 + if (!el1 || !el2) return false;
  1036 + var R1 = this.getLoc(el1,'region');
  1037 + var R2 = this.getLoc(el2,'region');
  1038 + var same = R1.contains(R2) && R2.contains(R1);
  1039 + return same ? true : false;
  1040 +}
  1041 +
  1042 +
  1043 +///////////////////////////////////////////////////////
  1044 +// Security -- get the balloon contents while checking
  1045 +// for disallowed elements.
  1046 +//////////////////////////////////////////////////////
  1047 +Balloon.prototype.getAndCheckContents = function(caption) {
  1048 + var originalCaption = caption;
  1049 + var notAllowed = 'are not allowed in popup balloons in this web site. \
  1050 + Please contact the site administrator for assistance.';
  1051 + var notSupported = 'AJAX is not supported for popup balloons in this web site. \
  1052 + Please contact the site administrator for assistance.';
  1053 +
  1054 + // no Help Url without AJAX
  1055 + if (this.helpUrl && !this.allowAJAX) {
  1056 + alert('Sorry, you have specified help URL '+this.helpUrl+' but '+notSupported);
  1057 + return null;
  1058 + }
  1059 +
  1060 + // look for a url in the balloon contents
  1061 + if (caption.match(/^url:/)) {
  1062 + this.activeUrl = caption.replace(/^url:/,'');
  1063 + caption = '';
  1064 + }
  1065 + // or if the text is a bare hyperlink
  1066 + else if (caption.match(/^(https?:|\/|ftp:)\S+$/i)) {
  1067 + this.activeUrl = caption;
  1068 + caption = '';
  1069 + }
  1070 +
  1071 + // Make sure AJAX is allowed
  1072 + if (this.activeUrl && !this.allowAJAX) {
  1073 + alert('Sorry, you asked for '+originalCaption+' but '+notSupported);
  1074 + return null;
  1075 + }
  1076 +
  1077 + // check if the contents are to be retrieved from an element
  1078 + if (caption.match(/^load:/)) {
  1079 + var load = caption.split(':');
  1080 + if (!document.getElementById(load[1])) alert ('problem locating element '+load[1]);
  1081 + caption = document.getElementById(load[1]).innerHTML;
  1082 + this.loadedFromElement = true;
  1083 + }
  1084 +
  1085 + // check if iframes are allowed
  1086 + if (caption.match(/\<\s*iframe/i) && !this.allowIframes) {
  1087 + alert('Sorry: iframe elements '+notAllowed);
  1088 + return null;
  1089 + }
  1090 +
  1091 + // check if event handlers are allowed
  1092 + if (caption.match(/\bon(load|mouse|click|unload|before)[^=]*=/i) && !this.allowEventHandlers) {
  1093 + alert('Sorry: JavaScript event handlers '+notAllowed);
  1094 + return null;
  1095 + }
  1096 +
  1097 + // check for script elements
  1098 + if (caption.match(/\<\s*script/i) && !this.allowScripts) {
  1099 + alert('Sorry: <script> elements '+notAllowed);
  1100 + return null;
  1101 + }
  1102 +
  1103 + // request the contents
  1104 + this.currentHelpText = this.getContents(caption);
  1105 + this.loadedFromElement = false;
  1106 +
  1107 + return this.currentHelpText;;
  1108 +}
  1109 +
  1110 +
  1111 +///////////////////////////////////////////////////////
  1112 +// AJAX widget to fill the balloons
  1113 +// requires prototype.js
  1114 +///////////////////////////////////////////////////////
  1115 +Balloon.prototype.getContents = function(section) {
  1116 +
  1117 + // just pass it back if no AJAX handler is required.
  1118 + if (!this.helpUrl && !this.activeUrl) return section;
  1119 +
  1120 + // or if the contents are already loaded from another element
  1121 + if (this.loadedFromElement) return section;
  1122 +
  1123 + // inline URL takes precedence
  1124 + var url = this.activeUrl || this.helpUrl;
  1125 + url += this.activeUrl ? '' : '?section='+section;
  1126 +
  1127 + // activeUrl is meant to be single-use only
  1128 + this.activeUrl = null;
  1129 +
  1130 + var ajax;
  1131 + if (window.XMLHttpRequest) {
  1132 + ajax = new XMLHttpRequest();
  1133 + } else {
  1134 + ajax = new ActiveXObject("Microsoft.XMLHTTP");
  1135 + }
  1136 +
  1137 + if (ajax) {
  1138 + ajax.open("GET", url, false);
  1139 + ajax.onreadystatechange=function() {
  1140 + //alert(ajax.readyState);
  1141 + };
  1142 + try {
  1143 + ajax.send(null);
  1144 + }
  1145 + catch (e) {
  1146 + // alert(e);
  1147 + }
  1148 + var txt = this.escapeHTML ? escape(ajax.responseText) : ajax.responseText;
  1149 + return txt || section;
  1150 + }
  1151 + else {
  1152 + return section;
  1153 + }
  1154 +}
  1155 +
  1156 +
  1157 +// test for internet explorer
  1158 +Balloon.prototype.isIE = function() {
  1159 + return document.all && !window.opera;
  1160 +}
  1161 +
  1162 +// test for internet explorer (but not IE7)
  1163 +Balloon.prototype.isOldIE = function() {
  1164 + if (navigator.appVersion.indexOf("MSIE") == -1) return false;
  1165 + var temp=navigator.appVersion.split("MSIE");
  1166 + return parseFloat(temp[1]) < 7;
  1167 +}
  1168 +
  1169 +// test for Konqueror
  1170 +Balloon.prototype.isKonqueror = function() {
  1171 + return navigator.userAgent.toLowerCase().indexOf( 'konqueror' ) != -1;
  1172 +}
  1173 +
  1174 +// and Google chrome
  1175 +Balloon.prototype.isChrome = function() {
  1176 + return navigator.userAgent.toLowerCase().indexOf('chrome') > -1;
  1177 +}
0 1178 \ No newline at end of file
... ...
pacotes/balloon-tooltips/htdocs/js/box.js 0 → 100644
... ... @@ -0,0 +1,217 @@
  1 +/*
  2 + This is a subclass of balloon.js -- uses a simple box rather than a
  3 + a balloon/bubble image. It can have a background image and a styled
  4 + bgcolor and border but is otherwise meant to be simple and lightweight.
  5 +*/
  6 +
  7 +//////////////////////////////////////////////////////////////////////////
  8 +// This is constructor that is called to initialize the Balloon object //
  9 +//////////////////////////////////////////////////////////////////////////
  10 +var Box = function () {
  11 + // Track the cursor every time the mouse moves
  12 + document.onmousemove = this.setActiveCoordinates;
  13 +
  14 + // scrolling aborts unsticky box
  15 + document.onscroll = Balloon.prototype.hideTooltip;
  16 +
  17 + // go away if the page is unloading or waiting
  18 + // to unload.
  19 + window.onbeforeunload = function(){
  20 + Balloon.prototype.nukeTooltip;
  21 + balloonIsSuppressed = true;
  22 + };
  23 +
  24 + // for IE, the box can't start until the page is finished loading
  25 + // set a flag that will get toggled when loading is finished
  26 + if (this.isIE()) {
  27 + this.suppress = true;
  28 + }
  29 +
  30 + return this;
  31 +}
  32 +
  33 +// Inherit from Balloon class
  34 +Box.prototype = new Balloon();
  35 +
  36 +
  37 +// Make the box element -- this overrides the parent method
  38 +Box.prototype.makeBalloon = function() {
  39 + var self = currentBalloonClass;
  40 +
  41 + // use ID 'visibleBalloonElement' for consistency with parent class
  42 + var box = document.getElementById('visibleBalloonElement');
  43 + if (box) self.parent.removeChild(box);
  44 + box = document.createElement('div');
  45 + box.setAttribute('id','visibleBalloonElement');
  46 + self.parent.appendChild(box);
  47 + self.activeBalloon = box;
  48 +
  49 + var contents = document.createElement('div');
  50 + contents.setAttribute('id','contents');
  51 + box.appendChild(contents);
  52 + self.contents = contents;
  53 + self.parts = new Array(box);
  54 +
  55 + self.setStyle(contents,'z-index',2);
  56 + self.setStyle(contents,'color',self.fontColor);
  57 + self.setStyle(contents,'font-family',self.fontFamily);
  58 + self.setStyle(contents,'font-size',self.fontSize);
  59 +
  60 + if (balloonIsSticky) {
  61 + self.setStyle(contents,'margin-right',10);
  62 + }
  63 + else if (self.displayTime) {
  64 + self.timeoutAutoClose = window.setTimeout(this.hideTooltip,self.displayTime);
  65 + }
  66 +
  67 + return box;
  68 +}
  69 +
  70 +// Set the box style -- overrides the parent method
  71 +Box.prototype.setBalloonStyle = function(vOrient,hOrient) {
  72 + var self = currentBalloonClass;
  73 + var box = self.activeBalloon;
  74 +
  75 + self.shadow = 0;
  76 + self.stem = false;
  77 + self.stemHeight = 0;
  78 +
  79 + self.setStyle(box,'background',self.bgColor);
  80 + self.setStyle(box,'border',self.borderStyle);
  81 + self.setStyle(box,'position','absolute');
  82 + self.setStyle(box,'padding',self.padding);
  83 + self.setStyle(box,'top',-9999);
  84 + self.setStyle(box,'z-index',1000000);
  85 +
  86 + // If width and/or height are specified, harden the
  87 + // box at those dimensions, but not if the space needed
  88 + // is less tha the space that would be used.
  89 + if (self.width) {
  90 + var widthUsed = self.getLoc('contents','width') + 20;
  91 + var newWidth = widthUsed > self.width ? self.width : widthUsed;
  92 + self.setStyle('contents','width',newWidth);
  93 + }
  94 + if (self.height) {
  95 + var heightUsed = self.getLoc('contents','height') + 20;
  96 + var newHeight = heightUsed > self.height ? self.height : heightUsed;
  97 + self.setStyle('contents','height',newHeight+(2*self.padding));
  98 + }
  99 +
  100 + // flip left or right, as required
  101 + if (hOrient == 'left') {
  102 + var pageWidth = self.pageRight - self.pageLeft;
  103 + var activeRight = pageWidth - self.activeLeft;
  104 + self.setStyle(box,'right',activeRight);
  105 + }
  106 + else {
  107 + self.setStyle(box,'left',self.activeRight - self.xOffset);
  108 + }
  109 +
  110 + if (!self.width) {
  111 + var width = self.getLoc('contents','width');
  112 + if (self.isIE()) width += self.padding;
  113 + if (width > self.maxWidth) width = self.maxWidth + self.padding;
  114 + if (width < self.minWidth) width = self.minWidth;
  115 + self.setStyle(box,'width',width);
  116 + }
  117 +
  118 + var overflow = balloonIsSticky ? 'auto' : 'hidden';
  119 + self.setStyle('contents','overflow',overflow);
  120 +
  121 + // Make sure the box is not offscreen horizontally.
  122 + // We handle vertical sanity checking later, after the final
  123 + // layout is set.
  124 + var boxLeft = self.getLoc(box,'x1');
  125 + var boxRight = self.getLoc(box,'x2');
  126 + var scrollBar = 20;
  127 +
  128 + if (hOrient == 'right' && boxRight > (self.pageRight - self.padding)) {
  129 + self.setStyle('contents','width',(self.pageRight - boxLeft) - self.padding - scrollBar);
  130 + }
  131 + else if (hOrient == 'left' && boxLeft < (self.pageLeft + self.padding)) {
  132 + self.setStyle('contents','width',(boxRight - self.pageLeft) - self.padding);
  133 + }
  134 +
  135 + // Get the width/height for the right and bottom outlines
  136 + var boxWidth = self.getLoc(box,'width');
  137 + var boxHeight = self.getLoc(box,'height');
  138 +
  139 + if (self.allowFade) {
  140 + self.setOpacity(0.01);
  141 + }
  142 + else {
  143 + self.setOpacity(self.opacity);
  144 + }
  145 +
  146 + if (!(self.activeTop && self.activeBottom)) {
  147 + self.setActiveCoordinates();
  148 + }
  149 +
  150 + if (vOrient == 'up') {
  151 + var activeTop = self.activeTop - boxHeight;
  152 + self.setStyle(box,'top',activeTop);
  153 + }
  154 + else if (vOrient == 'down') {
  155 + var activeTop = self.activeBottom;
  156 + self.setStyle(box,'top',activeTop);
  157 + }
  158 + self.setStyle(box,'display','inline');
  159 +
  160 + // Make sure the box is vertically contained in the window
  161 + var boxTop = self.getLoc(box,'y1');
  162 + var boxBottom = self.getLoc(box,'y2');
  163 + var deltaTop = boxTop < self.pageTop ? self.pageTop - boxTop : 0;
  164 + var deltaBottom = boxBottom > self.pageBottom ? boxBottom - self.pageBottom : 0;
  165 +
  166 + if (vOrient == 'up' && deltaTop) {
  167 + var newHeight = boxHeight - deltaTop;
  168 + if (newHeight > (self.padding*2)) {
  169 + self.setStyle('contents','height',newHeight);
  170 + self.setStyle(box,'top',self.pageTop+self.padding);
  171 + self.setStyle(box,'height',newHeight);
  172 + }
  173 + }
  174 +
  175 + if (vOrient == 'down' && deltaBottom) {
  176 + var newHeight = boxHeight - deltaBottom - scrollBar;
  177 + if (newHeight > (self.padding*2) + scrollBar) {
  178 + self.setStyle('contents','height',newHeight);
  179 + self.setStyle(box,'height',newHeight);
  180 + }
  181 + }
  182 +
  183 + self.hOrient = hOrient;
  184 + self.vOrient = vOrient;
  185 +}
  186 +
  187 +
  188 +Box.prototype.addCloseButton = function () {
  189 + var self = currentBalloonClass;
  190 + var margin = Math.round(self.padding/2);
  191 + var closeWidth = self.closeButtonWidth || 16;
  192 + var balloonTop = self.getLoc('visibleBalloonElement','y1') + margin;
  193 + var balloonRight = self.getLoc('visibleBalloonElement','x2') - margin - self.closeButtonWidth;
  194 + var closeButton = document.getElementById('closeButton');
  195 +
  196 +
  197 + if (!closeButton) {
  198 + closeButton = new Image;
  199 + closeButton.setAttribute('id','closeButton');
  200 + closeButton.setAttribute('src',self.closeButton);
  201 + closeButton.onclick = function() {
  202 + Balloon.prototype.nukeTooltip();
  203 + };
  204 + self.setStyle(closeButton,'position','absolute');
  205 + document.body.appendChild(closeButton);
  206 + }
  207 +
  208 + if (self.isIE()) {
  209 + balloonRight -= self.padding;
  210 + }
  211 +
  212 + self.setStyle(closeButton,'top',balloonTop);
  213 + self.setStyle(closeButton,'left',balloonRight);
  214 + self.setStyle(closeButton,'display','inline');
  215 + self.setStyle(closeButton,'cursor','pointer');
  216 + self.setStyle(closeButton,'z-index',999999999);
  217 +}
... ...
pacotes/balloon-tooltips/htdocs/js/yahoo-dom-event.js 0 → 100644
... ... @@ -0,0 +1,197 @@
  1 +/*
  2 +Copyright (c) 2007, Yahoo! Inc. All rights reserved.
  3 +Code licensed under the BSD License:
  4 +http://developer.yahoo.net/yui/license.txt
  5 +version: 2.3.0
  6 +*/
  7 +
  8 +if(typeof YAHOO=="undefined"){var YAHOO={};}
  9 +YAHOO.namespace=function(){var a=arguments,o=null,i,j,d;for(i=0;i<a.length;i=i+1){d=a[i].split(".");o=YAHOO;for(j=(d[0]=="YAHOO")?1:0;j<d.length;j=j+1){o[d[j]]=o[d[j]]||{};o=o[d[j]];}}
  10 +return o;};YAHOO.log=function(msg,cat,src){var l=YAHOO.widget.Logger;if(l&&l.log){return l.log(msg,cat,src);}else{return false;}};YAHOO.register=function(name,mainClass,data){var mods=YAHOO.env.modules;if(!mods[name]){mods[name]={versions:[],builds:[]};}
  11 +var m=mods[name],v=data.version,b=data.build,ls=YAHOO.env.listeners;m.name=name;m.version=v;m.build=b;m.versions.push(v);m.builds.push(b);m.mainClass=mainClass;for(var i=0;i<ls.length;i=i+1){ls[i](m);}
  12 +if(mainClass){mainClass.VERSION=v;mainClass.BUILD=b;}else{YAHOO.log("mainClass is undefined for module "+name,"warn");}};YAHOO.env=YAHOO.env||{modules:[],listeners:[]};YAHOO.env.getVersion=function(name){return YAHOO.env.modules[name]||null;};YAHOO.env.ua=function(){var o={ie:0,opera:0,gecko:0,webkit:0};var ua=navigator.userAgent,m;if((/KHTML/).test(ua)){o.webkit=1;}
  13 +m=ua.match(/AppleWebKit\/([^\s]*)/);if(m&&m[1]){o.webkit=parseFloat(m[1]);}
  14 +if(!o.webkit){m=ua.match(/Opera[\s\/]([^\s]*)/);if(m&&m[1]){o.opera=parseFloat(m[1]);}else{m=ua.match(/MSIE\s([^;]*)/);if(m&&m[1]){o.ie=parseFloat(m[1]);}else{m=ua.match(/Gecko\/([^\s]*)/);if(m){o.gecko=1;m=ua.match(/rv:([^\s\)]*)/);if(m&&m[1]){o.gecko=parseFloat(m[1]);}}}}}
  15 +return o;}();(function(){YAHOO.namespace("util","widget","example");if(typeof YAHOO_config!="undefined"){var l=YAHOO_config.listener,ls=YAHOO.env.listeners,unique=true,i;if(l){for(i=0;i<ls.length;i=i+1){if(ls[i]==l){unique=false;break;}}
  16 +if(unique){ls.push(l);}}}})();YAHOO.lang={isArray:function(o){if(o){var l=YAHOO.lang;return l.isNumber(o.length)&&l.isFunction(o.splice)&&!l.hasOwnProperty(o.length);}
  17 +return false;},isBoolean:function(o){return typeof o==='boolean';},isFunction:function(o){return typeof o==='function';},isNull:function(o){return o===null;},isNumber:function(o){return typeof o==='number'&&isFinite(o);},isObject:function(o){return(o&&(typeof o==='object'||YAHOO.lang.isFunction(o)))||false;},isString:function(o){return typeof o==='string';},isUndefined:function(o){return typeof o==='undefined';},hasOwnProperty:function(o,prop){if(Object.prototype.hasOwnProperty){return o.hasOwnProperty(prop);}
  18 +return!YAHOO.lang.isUndefined(o[prop])&&o.constructor.prototype[prop]!==o[prop];},_IEEnumFix:function(r,s){if(YAHOO.env.ua.ie){var add=["toString","valueOf"];for(i=0;i<add.length;i=i+1){var fname=add[i],f=s[fname];if(YAHOO.lang.isFunction(f)&&f!=Object.prototype[fname]){r[fname]=f;}}}},extend:function(subc,superc,overrides){if(!superc||!subc){throw new Error("YAHOO.lang.extend failed, please check that "+"all dependencies are included.");}
  19 +var F=function(){};F.prototype=superc.prototype;subc.prototype=new F();subc.prototype.constructor=subc;subc.superclass=superc.prototype;if(superc.prototype.constructor==Object.prototype.constructor){superc.prototype.constructor=superc;}
  20 +if(overrides){for(var i in overrides){subc.prototype[i]=overrides[i];}
  21 +YAHOO.lang._IEEnumFix(subc.prototype,overrides);}},augmentObject:function(r,s){if(!s||!r){throw new Error("Absorb failed, verify dependencies.");}
  22 +var a=arguments,i,p,override=a[2];if(override&&override!==true){for(i=2;i<a.length;i=i+1){r[a[i]]=s[a[i]];}}else{for(p in s){if(override||!r[p]){r[p]=s[p];}}
  23 +YAHOO.lang._IEEnumFix(r,s);}},augmentProto:function(r,s){if(!s||!r){throw new Error("Augment failed, verify dependencies.");}
  24 +var a=[r.prototype,s.prototype];for(var i=2;i<arguments.length;i=i+1){a.push(arguments[i]);}
  25 +YAHOO.lang.augmentObject.apply(this,a);},dump:function(o,d){var l=YAHOO.lang,i,len,s=[],OBJ="{...}",FUN="f(){...}",COMMA=', ',ARROW=' => ';if(!l.isObject(o)||o instanceof Date||("nodeType"in o&&"tagName"in o)){return o;}else if(l.isFunction(o)){return FUN;}
  26 +d=(l.isNumber(d))?d:3;if(l.isArray(o)){s.push("[");for(i=0,len=o.length;i<len;i=i+1){if(l.isObject(o[i])){s.push((d>0)?l.dump(o[i],d-1):OBJ);}else{s.push(o[i]);}
  27 +s.push(COMMA);}
  28 +if(s.length>1){s.pop();}
  29 +s.push("]");}else{s.push("{");for(i in o){if(l.hasOwnProperty(o,i)){s.push(i+ARROW);if(l.isObject(o[i])){s.push((d>0)?l.dump(o[i],d-1):OBJ);}else{s.push(o[i]);}
  30 +s.push(COMMA);}}
  31 +if(s.length>1){s.pop();}
  32 +s.push("}");}
  33 +return s.join("");},substitute:function(s,o,f){var i,j,k,key,v,meta,l=YAHOO.lang,saved=[],token,DUMP='dump',SPACE=' ',LBRACE='{',RBRACE='}';for(;;){i=s.lastIndexOf(LBRACE);if(i<0){break;}
  34 +j=s.indexOf(RBRACE,i);if(i+1>=j){break;}
  35 +token=s.substring(i+1,j);key=token;meta=null;k=key.indexOf(SPACE);if(k>-1){meta=key.substring(k+1);key=key.substring(0,k);}
  36 +v=o[key];if(f){v=f(key,v,meta);}
  37 +if(l.isObject(v)){if(l.isArray(v)){v=l.dump(v,parseInt(meta,10));}else{meta=meta||"";var dump=meta.indexOf(DUMP);if(dump>-1){meta=meta.substring(4);}
  38 +if(v.toString===Object.prototype.toString||dump>-1){v=l.dump(v,parseInt(meta,10));}else{v=v.toString();}}}else if(!l.isString(v)&&!l.isNumber(v)){v="~-"+saved.length+"-~";saved[saved.length]=token;}
  39 +s=s.substring(0,i)+v+s.substring(j+1);}
  40 +for(i=saved.length-1;i>=0;i=i-1){s=s.replace(new RegExp("~-"+i+"-~"),"{"+saved[i]+"}","g");}
  41 +return s;},trim:function(s){try{return s.replace(/^\s+|\s+$/g,"");}catch(e){return s;}},merge:function(){var o={},a=arguments,i;for(i=0;i<a.length;i=i+1){YAHOO.lang.augmentObject(o,a[i],true);}
  42 +return o;},isValue:function(o){var l=YAHOO.lang;return(l.isObject(o)||l.isString(o)||l.isNumber(o)||l.isBoolean(o));}};YAHOO.util.Lang=YAHOO.lang;YAHOO.lang.augment=YAHOO.lang.augmentProto;YAHOO.augment=YAHOO.lang.augmentProto;YAHOO.extend=YAHOO.lang.extend;YAHOO.register("yahoo",YAHOO,{version:"2.3.0",build:"442"});
  43 +(function(){var Y=YAHOO.util,getStyle,setStyle,id_counter=0,propertyCache={},reClassNameCache={};var isOpera=YAHOO.env.ua.opera,isSafari=YAHOO.env.ua.webkit,isGecko=YAHOO.env.ua.gecko,isIE=YAHOO.env.ua.ie;var patterns={HYPHEN:/(-[a-z])/i,ROOT_TAG:/^body|html$/i};var toCamel=function(property){if(!patterns.HYPHEN.test(property)){return property;}
  44 +if(propertyCache[property]){return propertyCache[property];}
  45 +var converted=property;while(patterns.HYPHEN.exec(converted)){converted=converted.replace(RegExp.$1,RegExp.$1.substr(1).toUpperCase());}
  46 +propertyCache[property]=converted;return converted;};var getClassRegEx=function(className){var re=reClassNameCache[className];if(!re){re=new RegExp('(?:^|\\s+)'+className+'(?:\\s+|$)');reClassNameCache[className]=re;}
  47 +return re;};if(document.defaultView&&document.defaultView.getComputedStyle){getStyle=function(el,property){var value=null;if(property=='float'){property='cssFloat';}
  48 +var computed=document.defaultView.getComputedStyle(el,'');if(computed){value=computed[toCamel(property)];}
  49 +return el.style[property]||value;};}else if(document.documentElement.currentStyle&&isIE){getStyle=function(el,property){switch(toCamel(property)){case'opacity':var val=100;try{val=el.filters['DXImageTransform.Microsoft.Alpha'].opacity;}catch(e){try{val=el.filters('alpha').opacity;}catch(e){}}
  50 +return val/100;case'float':property='styleFloat';default:var value=el.currentStyle?el.currentStyle[property]:null;return(el.style[property]||value);}};}else{getStyle=function(el,property){return el.style[property];};}
  51 +if(isIE){setStyle=function(el,property,val){switch(property){case'opacity':if(YAHOO.lang.isString(el.style.filter)){el.style.filter='alpha(opacity='+val*100+')';if(!el.currentStyle||!el.currentStyle.hasLayout){el.style.zoom=1;}}
  52 +break;case'float':property='styleFloat';default:el.style[property]=val;}};}else{setStyle=function(el,property,val){if(property=='float'){property='cssFloat';}
  53 +el.style[property]=val;};}
  54 +var testElement=function(node,method){return node&&node.nodeType==1&&(!method||method(node));};YAHOO.util.Dom={get:function(el){if(!el||el.tagName||el.item){return el;}
  55 +if(YAHOO.lang.isString(el)){return document.getElementById(el);}
  56 +if(el.splice){var c=[];for(var i=0,len=el.length;i<len;++i){c[c.length]=Y.Dom.get(el[i]);}
  57 +return c;}
  58 +return el;},getStyle:function(el,property){property=toCamel(property);var f=function(element){return getStyle(element,property);};return Y.Dom.batch(el,f,Y.Dom,true);},setStyle:function(el,property,val){property=toCamel(property);var f=function(element){setStyle(element,property,val);};Y.Dom.batch(el,f,Y.Dom,true);},getXY:function(el){var f=function(el){if((el.parentNode===null||el.offsetParent===null||this.getStyle(el,'display')=='none')&&el!=document.body){return false;}
  59 +var parentNode=null;var pos=[];var box;var doc=el.ownerDocument;if(el.getBoundingClientRect){box=el.getBoundingClientRect();return[box.left+Y.Dom.getDocumentScrollLeft(el.ownerDocument),box.top+Y.Dom.getDocumentScrollTop(el.ownerDocument)];}
  60 +else{pos=[el.offsetLeft,el.offsetTop];parentNode=el.offsetParent;var hasAbs=this.getStyle(el,'position')=='absolute';if(parentNode!=el){while(parentNode){pos[0]+=parentNode.offsetLeft;pos[1]+=parentNode.offsetTop;if(isSafari&&!hasAbs&&this.getStyle(parentNode,'position')=='absolute'){hasAbs=true;}
  61 +parentNode=parentNode.offsetParent;}}
  62 +if(isSafari&&hasAbs){pos[0]-=el.ownerDocument.body.offsetLeft;pos[1]-=el.ownerDocument.body.offsetTop;}}
  63 +parentNode=el.parentNode;while(parentNode.tagName&&!patterns.ROOT_TAG.test(parentNode.tagName))
  64 +{if(Y.Dom.getStyle(parentNode,'display').search(/^inline|table-row.*$/i)){pos[0]-=parentNode.scrollLeft;pos[1]-=parentNode.scrollTop;}
  65 +parentNode=parentNode.parentNode;}
  66 +return pos;};return Y.Dom.batch(el,f,Y.Dom,true);},getX:function(el){var f=function(el){return Y.Dom.getXY(el)[0];};return Y.Dom.batch(el,f,Y.Dom,true);},getY:function(el){var f=function(el){return Y.Dom.getXY(el)[1];};return Y.Dom.batch(el,f,Y.Dom,true);},setXY:function(el,pos,noRetry){var f=function(el){var style_pos=this.getStyle(el,'position');if(style_pos=='static'){this.setStyle(el,'position','relative');style_pos='relative';}
  67 +var pageXY=this.getXY(el);if(pageXY===false){return false;}
  68 +var delta=[parseInt(this.getStyle(el,'left'),10),parseInt(this.getStyle(el,'top'),10)];if(isNaN(delta[0])){delta[0]=(style_pos=='relative')?0:el.offsetLeft;}
  69 +if(isNaN(delta[1])){delta[1]=(style_pos=='relative')?0:el.offsetTop;}
  70 +if(pos[0]!==null){el.style.left=pos[0]-pageXY[0]+delta[0]+'px';}
  71 +if(pos[1]!==null){el.style.top=pos[1]-pageXY[1]+delta[1]+'px';}
  72 +if(!noRetry){var newXY=this.getXY(el);if((pos[0]!==null&&newXY[0]!=pos[0])||(pos[1]!==null&&newXY[1]!=pos[1])){this.setXY(el,pos,true);}}};Y.Dom.batch(el,f,Y.Dom,true);},setX:function(el,x){Y.Dom.setXY(el,[x,null]);},setY:function(el,y){Y.Dom.setXY(el,[null,y]);},getRegion:function(el){var f=function(el){if((el.parentNode===null||el.offsetParent===null||this.getStyle(el,'display')=='none')&&el!=document.body){return false;}
  73 +var region=Y.Region.getRegion(el);return region;};return Y.Dom.batch(el,f,Y.Dom,true);},getClientWidth:function(){return Y.Dom.getViewportWidth();},getClientHeight:function(){return Y.Dom.getViewportHeight();},getElementsByClassName:function(className,tag,root,apply){tag=tag||'*';root=(root)?Y.Dom.get(root):null||document;if(!root){return[];}
  74 +var nodes=[],elements=root.getElementsByTagName(tag),re=getClassRegEx(className);for(var i=0,len=elements.length;i<len;++i){if(re.test(elements[i].className)){nodes[nodes.length]=elements[i];if(apply){apply.call(elements[i],elements[i]);}}}
  75 +return nodes;},hasClass:function(el,className){var re=getClassRegEx(className);var f=function(el){return re.test(el.className);};return Y.Dom.batch(el,f,Y.Dom,true);},addClass:function(el,className){var f=function(el){if(this.hasClass(el,className)){return false;}
  76 +el.className=YAHOO.lang.trim([el.className,className].join(' '));return true;};return Y.Dom.batch(el,f,Y.Dom,true);},removeClass:function(el,className){var re=getClassRegEx(className);var f=function(el){if(!this.hasClass(el,className)){return false;}
  77 +var c=el.className;el.className=c.replace(re,' ');if(this.hasClass(el,className)){this.removeClass(el,className);}
  78 +el.className=YAHOO.lang.trim(el.className);return true;};return Y.Dom.batch(el,f,Y.Dom,true);},replaceClass:function(el,oldClassName,newClassName){if(!newClassName||oldClassName===newClassName){return false;}
  79 +var re=getClassRegEx(oldClassName);var f=function(el){if(!this.hasClass(el,oldClassName)){this.addClass(el,newClassName);return true;}
  80 +el.className=el.className.replace(re,' '+newClassName+' ');if(this.hasClass(el,oldClassName)){this.replaceClass(el,oldClassName,newClassName);}
  81 +el.className=YAHOO.lang.trim(el.className);return true;};return Y.Dom.batch(el,f,Y.Dom,true);},generateId:function(el,prefix){prefix=prefix||'yui-gen';var f=function(el){if(el&&el.id){return el.id;}
  82 +var id=prefix+id_counter++;if(el){el.id=id;}
  83 +return id;};return Y.Dom.batch(el,f,Y.Dom,true)||f.apply(Y.Dom,arguments);},isAncestor:function(haystack,needle){haystack=Y.Dom.get(haystack);if(!haystack||!needle){return false;}
  84 +var f=function(node){if(haystack.contains&&node.nodeType&&!isSafari){return haystack.contains(node);}
  85 +else if(haystack.compareDocumentPosition&&node.nodeType){return!!(haystack.compareDocumentPosition(node)&16);}else if(node.nodeType){return!!this.getAncestorBy(node,function(el){return el==haystack;});}
  86 +return false;};return Y.Dom.batch(needle,f,Y.Dom,true);},inDocument:function(el){var f=function(el){if(isSafari){while(el=el.parentNode){if(el==document.documentElement){return true;}}
  87 +return false;}
  88 +return this.isAncestor(document.documentElement,el);};return Y.Dom.batch(el,f,Y.Dom,true);},getElementsBy:function(method,tag,root,apply){tag=tag||'*';root=(root)?Y.Dom.get(root):null||document;if(!root){return[];}
  89 +var nodes=[],elements=root.getElementsByTagName(tag);for(var i=0,len=elements.length;i<len;++i){if(method(elements[i])){nodes[nodes.length]=elements[i];if(apply){apply(elements[i]);}}}
  90 +return nodes;},batch:function(el,method,o,override){el=(el&&el.tagName)?el:Y.Dom.get(el);if(!el||!method){return false;}
  91 +var scope=(override)?o:window;if(el.tagName||(!el.item&&!el.slice)){return method.call(scope,el,o);}
  92 +var collection=[];for(var i=0,len=el.length;i<len;++i){collection[collection.length]=method.call(scope,el[i],o);}
  93 +return collection;},getDocumentHeight:function(){var scrollHeight=(document.compatMode!='CSS1Compat')?document.body.scrollHeight:document.documentElement.scrollHeight;var h=Math.max(scrollHeight,Y.Dom.getViewportHeight());return h;},getDocumentWidth:function(){var scrollWidth=(document.compatMode!='CSS1Compat')?document.body.scrollWidth:document.documentElement.scrollWidth;var w=Math.max(scrollWidth,Y.Dom.getViewportWidth());return w;},getViewportHeight:function(){var height=self.innerHeight;var mode=document.compatMode;if((mode||isIE)&&!isOpera){height=(mode=='CSS1Compat')?document.documentElement.clientHeight:document.body.clientHeight;}
  94 +return height;},getViewportWidth:function(){var width=self.innerWidth;var mode=document.compatMode;if(mode||isIE){width=(mode=='CSS1Compat')?document.documentElement.clientWidth:document.body.clientWidth;}
  95 +return width;},getAncestorBy:function(node,method){while(node=node.parentNode){if(testElement(node,method)){return node;}}
  96 +return null;},getAncestorByClassName:function(node,className){node=Y.Dom.get(node);if(!node){return null;}
  97 +var method=function(el){return Y.Dom.hasClass(el,className);};return Y.Dom.getAncestorBy(node,method);},getAncestorByTagName:function(node,tagName){node=Y.Dom.get(node);if(!node){return null;}
  98 +var method=function(el){return el.tagName&&el.tagName.toUpperCase()==tagName.toUpperCase();};return Y.Dom.getAncestorBy(node,method);},getPreviousSiblingBy:function(node,method){while(node){node=node.previousSibling;if(testElement(node,method)){return node;}}
  99 +return null;},getPreviousSibling:function(node){node=Y.Dom.get(node);if(!node){return null;}
  100 +return Y.Dom.getPreviousSiblingBy(node);},getNextSiblingBy:function(node,method){while(node){node=node.nextSibling;if(testElement(node,method)){return node;}}
  101 +return null;},getNextSibling:function(node){node=Y.Dom.get(node);if(!node){return null;}
  102 +return Y.Dom.getNextSiblingBy(node);},getFirstChildBy:function(node,method){var child=(testElement(node.firstChild,method))?node.firstChild:null;return child||Y.Dom.getNextSiblingBy(node.firstChild,method);},getFirstChild:function(node,method){node=Y.Dom.get(node);if(!node){return null;}
  103 +return Y.Dom.getFirstChildBy(node);},getLastChildBy:function(node,method){if(!node){return null;}
  104 +var child=(testElement(node.lastChild,method))?node.lastChild:null;return child||Y.Dom.getPreviousSiblingBy(node.lastChild,method);},getLastChild:function(node){node=Y.Dom.get(node);return Y.Dom.getLastChildBy(node);},getChildrenBy:function(node,method){var child=Y.Dom.getFirstChildBy(node,method);var children=child?[child]:[];Y.Dom.getNextSiblingBy(child,function(node){if(!method||method(node)){children[children.length]=node;}
  105 +return false;});return children;},getChildren:function(node){node=Y.Dom.get(node);if(!node){}
  106 +return Y.Dom.getChildrenBy(node);},getDocumentScrollLeft:function(doc){doc=doc||document;return Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft);},getDocumentScrollTop:function(doc){doc=doc||document;return Math.max(doc.documentElement.scrollTop,doc.body.scrollTop);},insertBefore:function(newNode,referenceNode){newNode=Y.Dom.get(newNode);referenceNode=Y.Dom.get(referenceNode);if(!newNode||!referenceNode||!referenceNode.parentNode){return null;}
  107 +return referenceNode.parentNode.insertBefore(newNode,referenceNode);},insertAfter:function(newNode,referenceNode){newNode=Y.Dom.get(newNode);referenceNode=Y.Dom.get(referenceNode);if(!newNode||!referenceNode||!referenceNode.parentNode){return null;}
  108 +if(referenceNode.nextSibling){return referenceNode.parentNode.insertBefore(newNode,referenceNode.nextSibling);}else{return referenceNode.parentNode.appendChild(newNode);}}};})();YAHOO.util.Region=function(t,r,b,l){this.top=t;this[1]=t;this.right=r;this.bottom=b;this.left=l;this[0]=l;};YAHOO.util.Region.prototype.contains=function(region){return(region.left>=this.left&&region.right<=this.right&&region.top>=this.top&&region.bottom<=this.bottom);};YAHOO.util.Region.prototype.getArea=function(){return((this.bottom-this.top)*(this.right-this.left));};YAHOO.util.Region.prototype.intersect=function(region){var t=Math.max(this.top,region.top);var r=Math.min(this.right,region.right);var b=Math.min(this.bottom,region.bottom);var l=Math.max(this.left,region.left);if(b>=t&&r>=l){return new YAHOO.util.Region(t,r,b,l);}else{return null;}};YAHOO.util.Region.prototype.union=function(region){var t=Math.min(this.top,region.top);var r=Math.max(this.right,region.right);var b=Math.max(this.bottom,region.bottom);var l=Math.min(this.left,region.left);return new YAHOO.util.Region(t,r,b,l);};YAHOO.util.Region.prototype.toString=function(){return("Region {"+"top: "+this.top+", right: "+this.right+", bottom: "+this.bottom+", left: "+this.left+"}");};YAHOO.util.Region.getRegion=function(el){var p=YAHOO.util.Dom.getXY(el);var t=p[1];var r=p[0]+el.offsetWidth;var b=p[1]+el.offsetHeight;var l=p[0];return new YAHOO.util.Region(t,r,b,l);};YAHOO.util.Point=function(x,y){if(YAHOO.lang.isArray(x)){y=x[1];x=x[0];}
  109 +this.x=this.right=this.left=this[0]=x;this.y=this.top=this.bottom=this[1]=y;};YAHOO.util.Point.prototype=new YAHOO.util.Region();YAHOO.register("dom",YAHOO.util.Dom,{version:"2.3.0",build:"442"});
  110 +YAHOO.util.CustomEvent=function(type,oScope,silent,signature){this.type=type;this.scope=oScope||window;this.silent=silent;this.signature=signature||YAHOO.util.CustomEvent.LIST;this.subscribers=[];if(!this.silent){}
  111 +var onsubscribeType="_YUICEOnSubscribe";if(type!==onsubscribeType){this.subscribeEvent=new YAHOO.util.CustomEvent(onsubscribeType,this,true);}};YAHOO.util.CustomEvent.LIST=0;YAHOO.util.CustomEvent.FLAT=1;YAHOO.util.CustomEvent.prototype={subscribe:function(fn,obj,override){if(!fn){throw new Error("Invalid callback for subscriber to '"+this.type+"'");}
  112 +if(this.subscribeEvent){this.subscribeEvent.fire(fn,obj,override);}
  113 +this.subscribers.push(new YAHOO.util.Subscriber(fn,obj,override));},unsubscribe:function(fn,obj){if(!fn){return this.unsubscribeAll();}
  114 +var found=false;for(var i=0,len=this.subscribers.length;i<len;++i){var s=this.subscribers[i];if(s&&s.contains(fn,obj)){this._delete(i);found=true;}}
  115 +return found;},fire:function(){var len=this.subscribers.length;if(!len&&this.silent){return true;}
  116 +var args=[],ret=true,i,rebuild=false;for(i=0;i<arguments.length;++i){args.push(arguments[i]);}
  117 +var argslength=args.length;if(!this.silent){}
  118 +for(i=0;i<len;++i){var s=this.subscribers[i];if(!s){rebuild=true;}else{if(!this.silent){}
  119 +var scope=s.getScope(this.scope);if(this.signature==YAHOO.util.CustomEvent.FLAT){var param=null;if(args.length>0){param=args[0];}
  120 +ret=s.fn.call(scope,param,s.obj);}else{ret=s.fn.call(scope,this.type,args,s.obj);}
  121 +if(false===ret){if(!this.silent){}
  122 +return false;}}}
  123 +if(rebuild){var newlist=[],subs=this.subscribers;for(i=0,len=subs.length;i<len;++i){s=subs[i];newlist.push(subs[i]);}
  124 +this.subscribers=newlist;}
  125 +return true;},unsubscribeAll:function(){for(var i=0,len=this.subscribers.length;i<len;++i){this._delete(len-1-i);}
  126 +this.subscribers=[];return i;},_delete:function(index){var s=this.subscribers[index];if(s){delete s.fn;delete s.obj;}
  127 +this.subscribers[index]=null;},toString:function(){return"CustomEvent: "+"'"+this.type+"', "+"scope: "+this.scope;}};YAHOO.util.Subscriber=function(fn,obj,override){this.fn=fn;this.obj=YAHOO.lang.isUndefined(obj)?null:obj;this.override=override;};YAHOO.util.Subscriber.prototype.getScope=function(defaultScope){if(this.override){if(this.override===true){return this.obj;}else{return this.override;}}
  128 +return defaultScope;};YAHOO.util.Subscriber.prototype.contains=function(fn,obj){if(obj){return(this.fn==fn&&this.obj==obj);}else{return(this.fn==fn);}};YAHOO.util.Subscriber.prototype.toString=function(){return"Subscriber { obj: "+this.obj+", override: "+(this.override||"no")+" }";};if(!YAHOO.util.Event){YAHOO.util.Event=function(){var loadComplete=false;var DOMReady=false;var listeners=[];var unloadListeners=[];var legacyEvents=[];var legacyHandlers=[];var retryCount=0;var onAvailStack=[];var legacyMap=[];var counter=0;var webkitKeymap={63232:38,63233:40,63234:37,63235:39};return{POLL_RETRYS:4000,POLL_INTERVAL:10,EL:0,TYPE:1,FN:2,WFN:3,OBJ:3,ADJ_SCOPE:4,lastError:null,isSafari:YAHOO.env.ua.webkit,webkit:YAHOO.env.ua.webkit,isIE:YAHOO.env.ua.ie,_interval:null,startInterval:function(){if(!this._interval){var self=this;var callback=function(){self._tryPreloadAttach();};this._interval=setInterval(callback,this.POLL_INTERVAL);}},onAvailable:function(p_id,p_fn,p_obj,p_override){onAvailStack.push({id:p_id,fn:p_fn,obj:p_obj,override:p_override,checkReady:false});retryCount=this.POLL_RETRYS;this.startInterval();},onDOMReady:function(p_fn,p_obj,p_override){if(DOMReady){setTimeout(function(){var s=window;if(p_override){if(p_override===true){s=p_obj;}else{s=p_override;}}
  129 +p_fn.call(s,"DOMReady",[],p_obj);},0);}else{this.DOMReadyEvent.subscribe(p_fn,p_obj,p_override);}},onContentReady:function(p_id,p_fn,p_obj,p_override){onAvailStack.push({id:p_id,fn:p_fn,obj:p_obj,override:p_override,checkReady:true});retryCount=this.POLL_RETRYS;this.startInterval();},addListener:function(el,sType,fn,obj,override){if(!fn||!fn.call){return false;}
  130 +if(this._isValidCollection(el)){var ok=true;for(var i=0,len=el.length;i<len;++i){ok=this.on(el[i],sType,fn,obj,override)&&ok;}
  131 +return ok;}else if(YAHOO.lang.isString(el)){var oEl=this.getEl(el);if(oEl){el=oEl;}else{this.onAvailable(el,function(){YAHOO.util.Event.on(el,sType,fn,obj,override);});return true;}}
  132 +if(!el){return false;}
  133 +if("unload"==sType&&obj!==this){unloadListeners[unloadListeners.length]=[el,sType,fn,obj,override];return true;}
  134 +var scope=el;if(override){if(override===true){scope=obj;}else{scope=override;}}
  135 +var wrappedFn=function(e){return fn.call(scope,YAHOO.util.Event.getEvent(e),obj);};var li=[el,sType,fn,wrappedFn,scope];var index=listeners.length;listeners[index]=li;if(this.useLegacyEvent(el,sType)){var legacyIndex=this.getLegacyIndex(el,sType);if(legacyIndex==-1||el!=legacyEvents[legacyIndex][0]){legacyIndex=legacyEvents.length;legacyMap[el.id+sType]=legacyIndex;legacyEvents[legacyIndex]=[el,sType,el["on"+sType]];legacyHandlers[legacyIndex]=[];el["on"+sType]=function(e){YAHOO.util.Event.fireLegacyEvent(YAHOO.util.Event.getEvent(e),legacyIndex);};}
  136 +legacyHandlers[legacyIndex].push(li);}else{try{this._simpleAdd(el,sType,wrappedFn,false);}catch(ex){this.lastError=ex;this.removeListener(el,sType,fn);return false;}}
  137 +return true;},fireLegacyEvent:function(e,legacyIndex){var ok=true,le,lh,li,scope,ret;lh=legacyHandlers[legacyIndex];for(var i=0,len=lh.length;i<len;++i){li=lh[i];if(li&&li[this.WFN]){scope=li[this.ADJ_SCOPE];ret=li[this.WFN].call(scope,e);ok=(ok&&ret);}}
  138 +le=legacyEvents[legacyIndex];if(le&&le[2]){le[2](e);}
  139 +return ok;},getLegacyIndex:function(el,sType){var key=this.generateId(el)+sType;if(typeof legacyMap[key]=="undefined"){return-1;}else{return legacyMap[key];}},useLegacyEvent:function(el,sType){if(this.webkit&&("click"==sType||"dblclick"==sType)){var v=parseInt(this.webkit,10);if(!isNaN(v)&&v<418){return true;}}
  140 +return false;},removeListener:function(el,sType,fn){var i,len;if(typeof el=="string"){el=this.getEl(el);}else if(this._isValidCollection(el)){var ok=true;for(i=0,len=el.length;i<len;++i){ok=(this.removeListener(el[i],sType,fn)&&ok);}
  141 +return ok;}
  142 +if(!fn||!fn.call){return this.purgeElement(el,false,sType);}
  143 +if("unload"==sType){for(i=0,len=unloadListeners.length;i<len;i++){var li=unloadListeners[i];if(li&&li[0]==el&&li[1]==sType&&li[2]==fn){unloadListeners[i]=null;return true;}}
  144 +return false;}
  145 +var cacheItem=null;var index=arguments[3];if("undefined"==typeof index){index=this._getCacheIndex(el,sType,fn);}
  146 +if(index>=0){cacheItem=listeners[index];}
  147 +if(!el||!cacheItem){return false;}
  148 +if(this.useLegacyEvent(el,sType)){var legacyIndex=this.getLegacyIndex(el,sType);var llist=legacyHandlers[legacyIndex];if(llist){for(i=0,len=llist.length;i<len;++i){li=llist[i];if(li&&li[this.EL]==el&&li[this.TYPE]==sType&&li[this.FN]==fn){llist[i]=null;break;}}}}else{try{this._simpleRemove(el,sType,cacheItem[this.WFN],false);}catch(ex){this.lastError=ex;return false;}}
  149 +delete listeners[index][this.WFN];delete listeners[index][this.FN];listeners[index]=null;return true;},getTarget:function(ev,resolveTextNode){var t=ev.target||ev.srcElement;return this.resolveTextNode(t);},resolveTextNode:function(node){if(node&&3==node.nodeType){return node.parentNode;}else{return node;}},getPageX:function(ev){var x=ev.pageX;if(!x&&0!==x){x=ev.clientX||0;if(this.isIE){x+=this._getScrollLeft();}}
  150 +return x;},getPageY:function(ev){var y=ev.pageY;if(!y&&0!==y){y=ev.clientY||0;if(this.isIE){y+=this._getScrollTop();}}
  151 +return y;},getXY:function(ev){return[this.getPageX(ev),this.getPageY(ev)];},getRelatedTarget:function(ev){var t=ev.relatedTarget;if(!t){if(ev.type=="mouseout"){t=ev.toElement;}else if(ev.type=="mouseover"){t=ev.fromElement;}}
  152 +return this.resolveTextNode(t);},getTime:function(ev){if(!ev.time){var t=new Date().getTime();try{ev.time=t;}catch(ex){this.lastError=ex;return t;}}
  153 +return ev.time;},stopEvent:function(ev){this.stopPropagation(ev);this.preventDefault(ev);},stopPropagation:function(ev){if(ev.stopPropagation){ev.stopPropagation();}else{ev.cancelBubble=true;}},preventDefault:function(ev){if(ev.preventDefault){ev.preventDefault();}else{ev.returnValue=false;}},getEvent:function(e){var ev=e||window.event;if(!ev){var c=this.getEvent.caller;while(c){ev=c.arguments[0];if(ev&&Event==ev.constructor){break;}
  154 +c=c.caller;}}
  155 +return ev;},getCharCode:function(ev){var code=ev.keyCode||ev.charCode||0;if(YAHOO.env.ua.webkit&&(code in webkitKeymap)){code=webkitKeymap[code];}
  156 +return code;},_getCacheIndex:function(el,sType,fn){for(var i=0,len=listeners.length;i<len;++i){var li=listeners[i];if(li&&li[this.FN]==fn&&li[this.EL]==el&&li[this.TYPE]==sType){return i;}}
  157 +return-1;},generateId:function(el){var id=el.id;if(!id){id="yuievtautoid-"+counter;++counter;el.id=id;}
  158 +return id;},_isValidCollection:function(o){try{return(o&&o.length&&typeof o!="string"&&!o.tagName&&!o.alert&&typeof o[0]!="undefined");}catch(e){return false;}},elCache:{},getEl:function(id){return document.getElementById(id);},clearCache:function(){},DOMReadyEvent:new YAHOO.util.CustomEvent("DOMReady",this),_load:function(e){if(!loadComplete){loadComplete=true;var EU=YAHOO.util.Event;EU._ready();EU._tryPreloadAttach();}},_ready:function(e){if(!DOMReady){DOMReady=true;var EU=YAHOO.util.Event;EU.DOMReadyEvent.fire();EU._simpleRemove(document,"DOMContentLoaded",EU._ready);}},_tryPreloadAttach:function(){if(this.locked){return false;}
  159 +if(this.isIE){if(!DOMReady){this.startInterval();return false;}}
  160 +this.locked=true;var tryAgain=!loadComplete;if(!tryAgain){tryAgain=(retryCount>0);}
  161 +var notAvail=[];var executeItem=function(el,item){var scope=el;if(item.override){if(item.override===true){scope=item.obj;}else{scope=item.override;}}
  162 +item.fn.call(scope,item.obj);};var i,len,item,el;for(i=0,len=onAvailStack.length;i<len;++i){item=onAvailStack[i];if(item&&!item.checkReady){el=this.getEl(item.id);if(el){executeItem(el,item);onAvailStack[i]=null;}else{notAvail.push(item);}}}
  163 +for(i=0,len=onAvailStack.length;i<len;++i){item=onAvailStack[i];if(item&&item.checkReady){el=this.getEl(item.id);if(el){if(loadComplete||el.nextSibling){executeItem(el,item);onAvailStack[i]=null;}}else{notAvail.push(item);}}}
  164 +retryCount=(notAvail.length===0)?0:retryCount-1;if(tryAgain){this.startInterval();}else{clearInterval(this._interval);this._interval=null;}
  165 +this.locked=false;return true;},purgeElement:function(el,recurse,sType){var elListeners=this.getListeners(el,sType);if(elListeners){for(var i=0,len=elListeners.length;i<len;++i){var l=elListeners[i];this.removeListener(el,l.type,l.fn,l.index);}}
  166 +if(recurse&&el&&el.childNodes){for(i=0,len=el.childNodes.length;i<len;++i){this.purgeElement(el.childNodes[i],recurse,sType);}}},getListeners:function(el,sType){var results=[],searchLists;if(!sType){searchLists=[listeners,unloadListeners];}else if(sType=="unload"){searchLists=[unloadListeners];}else{searchLists=[listeners];}
  167 +for(var j=0;j<searchLists.length;++j){var searchList=searchLists[j];if(searchList&&searchList.length>0){for(var i=0,len=searchList.length;i<len;++i){var l=searchList[i];if(l&&l[this.EL]===el&&(!sType||sType===l[this.TYPE])){results.push({type:l[this.TYPE],fn:l[this.FN],obj:l[this.OBJ],adjust:l[this.ADJ_SCOPE],index:i});}}}}
  168 +return(results.length)?results:null;},_unload:function(e){var EU=YAHOO.util.Event,i,j,l,len,index;for(i=0,len=unloadListeners.length;i<len;++i){l=unloadListeners[i];if(l){var scope=window;if(l[EU.ADJ_SCOPE]){if(l[EU.ADJ_SCOPE]===true){scope=l[EU.OBJ];}else{scope=l[EU.ADJ_SCOPE];}}
  169 +l[EU.FN].call(scope,EU.getEvent(e),l[EU.OBJ]);unloadListeners[i]=null;l=null;scope=null;}}
  170 +unloadListeners=null;if(listeners&&listeners.length>0){j=listeners.length;while(j){index=j-1;l=listeners[index];if(l){EU.removeListener(l[EU.EL],l[EU.TYPE],l[EU.FN],index);}
  171 +j=j-1;}
  172 +l=null;EU.clearCache();}
  173 +for(i=0,len=legacyEvents.length;i<len;++i){legacyEvents[i][0]=null;legacyEvents[i]=null;}
  174 +legacyEvents=null;EU._simpleRemove(window,"unload",EU._unload);},_getScrollLeft:function(){return this._getScroll()[1];},_getScrollTop:function(){return this._getScroll()[0];},_getScroll:function(){var dd=document.documentElement,db=document.body;if(dd&&(dd.scrollTop||dd.scrollLeft)){return[dd.scrollTop,dd.scrollLeft];}else if(db){return[db.scrollTop,db.scrollLeft];}else{return[0,0];}},regCE:function(){},_simpleAdd:function(){if(window.addEventListener){return function(el,sType,fn,capture){el.addEventListener(sType,fn,(capture));};}else if(window.attachEvent){return function(el,sType,fn,capture){el.attachEvent("on"+sType,fn);};}else{return function(){};}}(),_simpleRemove:function(){if(window.removeEventListener){return function(el,sType,fn,capture){el.removeEventListener(sType,fn,(capture));};}else if(window.detachEvent){return function(el,sType,fn){el.detachEvent("on"+sType,fn);};}else{return function(){};}}()};}();(function(){var EU=YAHOO.util.Event;EU.on=EU.addListener;if(EU.isIE){YAHOO.util.Event.onDOMReady(YAHOO.util.Event._tryPreloadAttach,YAHOO.util.Event,true);var el,d=document,b=d.body;if(("undefined"!==typeof YAHOO_config)&&YAHOO_config.injecting){el=document.createElement("script");var p=d.getElementsByTagName("head")[0]||b;p.insertBefore(el,p.firstChild);}else{d.write('<scr'+'ipt id="_yui_eu_dr" defer="true" src="//:"><'+'/script>');el=document.getElementById("_yui_eu_dr");}
  175 +if(el){el.onreadystatechange=function(){if("complete"===this.readyState){this.parentNode.removeChild(this);YAHOO.util.Event._ready();}};}else{}
  176 +el=null;}else if(EU.webkit){EU._drwatch=setInterval(function(){var rs=document.readyState;if("loaded"==rs||"complete"==rs){clearInterval(EU._drwatch);EU._drwatch=null;EU._ready();}},EU.POLL_INTERVAL);}else{EU._simpleAdd(document,"DOMContentLoaded",EU._ready);}
  177 +EU._simpleAdd(window,"load",EU._load);EU._simpleAdd(window,"unload",EU._unload);EU._tryPreloadAttach();})();}
  178 +YAHOO.util.EventProvider=function(){};YAHOO.util.EventProvider.prototype={__yui_events:null,__yui_subscribers:null,subscribe:function(p_type,p_fn,p_obj,p_override){this.__yui_events=this.__yui_events||{};var ce=this.__yui_events[p_type];if(ce){ce.subscribe(p_fn,p_obj,p_override);}else{this.__yui_subscribers=this.__yui_subscribers||{};var subs=this.__yui_subscribers;if(!subs[p_type]){subs[p_type]=[];}
  179 +subs[p_type].push({fn:p_fn,obj:p_obj,override:p_override});}},unsubscribe:function(p_type,p_fn,p_obj){this.__yui_events=this.__yui_events||{};var evts=this.__yui_events;if(p_type){var ce=evts[p_type];if(ce){return ce.unsubscribe(p_fn,p_obj);}}else{for(var i in evts){var ret=true;if(YAHOO.lang.hasOwnProperty(evts,i)){ret=ret&&evts[i].unsubscribe(p_fn,p_obj);}}
  180 +return ret;}
  181 +return false;},unsubscribeAll:function(p_type){return this.unsubscribe(p_type);},createEvent:function(p_type,p_config){this.__yui_events=this.__yui_events||{};var opts=p_config||{};var events=this.__yui_events;if(events[p_type]){}else{var scope=opts.scope||this;var silent=(opts.silent);var ce=new YAHOO.util.CustomEvent(p_type,scope,silent,YAHOO.util.CustomEvent.FLAT);events[p_type]=ce;if(opts.onSubscribeCallback){ce.subscribeEvent.subscribe(opts.onSubscribeCallback);}
  182 +this.__yui_subscribers=this.__yui_subscribers||{};var qs=this.__yui_subscribers[p_type];if(qs){for(var i=0;i<qs.length;++i){ce.subscribe(qs[i].fn,qs[i].obj,qs[i].override);}}}
  183 +return events[p_type];},fireEvent:function(p_type,arg1,arg2,etc){this.__yui_events=this.__yui_events||{};var ce=this.__yui_events[p_type];if(!ce){return null;}
  184 +var args=[];for(var i=1;i<arguments.length;++i){args.push(arguments[i]);}
  185 +return ce.fire.apply(ce,args);},hasEvent:function(type){if(this.__yui_events){if(this.__yui_events[type]){return true;}}
  186 +return false;}};YAHOO.util.KeyListener=function(attachTo,keyData,handler,event){if(!attachTo){}else if(!keyData){}else if(!handler){}
  187 +if(!event){event=YAHOO.util.KeyListener.KEYDOWN;}
  188 +var keyEvent=new YAHOO.util.CustomEvent("keyPressed");this.enabledEvent=new YAHOO.util.CustomEvent("enabled");this.disabledEvent=new YAHOO.util.CustomEvent("disabled");if(typeof attachTo=='string'){attachTo=document.getElementById(attachTo);}
  189 +if(typeof handler=='function'){keyEvent.subscribe(handler);}else{keyEvent.subscribe(handler.fn,handler.scope,handler.correctScope);}
  190 +function handleKeyPress(e,obj){if(!keyData.shift){keyData.shift=false;}
  191 +if(!keyData.alt){keyData.alt=false;}
  192 +if(!keyData.ctrl){keyData.ctrl=false;}
  193 +if(e.shiftKey==keyData.shift&&e.altKey==keyData.alt&&e.ctrlKey==keyData.ctrl){var dataItem;var keyPressed;if(keyData.keys instanceof Array){for(var i=0;i<keyData.keys.length;i++){dataItem=keyData.keys[i];if(dataItem==e.charCode){keyEvent.fire(e.charCode,e);break;}else if(dataItem==e.keyCode){keyEvent.fire(e.keyCode,e);break;}}}else{dataItem=keyData.keys;if(dataItem==e.charCode){keyEvent.fire(e.charCode,e);}else if(dataItem==e.keyCode){keyEvent.fire(e.keyCode,e);}}}}
  194 +this.enable=function(){if(!this.enabled){YAHOO.util.Event.addListener(attachTo,event,handleKeyPress);this.enabledEvent.fire(keyData);}
  195 +this.enabled=true;};this.disable=function(){if(this.enabled){YAHOO.util.Event.removeListener(attachTo,event,handleKeyPress);this.disabledEvent.fire(keyData);}
  196 +this.enabled=false;};this.toString=function(){return"KeyListener ["+keyData.keys+"] "+attachTo.tagName+
  197 +(attachTo.id?"["+attachTo.id+"]":"");};};YAHOO.util.KeyListener.KEYDOWN="keydown";YAHOO.util.KeyListener.KEYUP="keyup";YAHOO.register("event",YAHOO.util.Event,{version:"2.3.0",build:"442"});YAHOO.register("yahoo-dom-event", YAHOO, {version: "2.3.0", build: "442"});
... ...