[Bio] / FigKernelPackages / display_related_genomes.pm Repository:
ViewVC logotype

Annotation of /FigKernelPackages/display_related_genomes.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.2 - (view) (download) (as text)

1 : overbeek 1.1 package display_related_genomes;
2 :    
3 :     use strict;
4 :     use gjocolorlib;
5 :     eval { use Data::Dumper };
6 :    
7 :     # Use FIGjs.pm if available:
8 :    
9 : golsen 1.2 my $have_FIGjs;
10 :     eval { require FIGjs; $have_FIGjs = 1; };
11 : overbeek 1.1
12 :     my @clrkey = qw( 1 2 3 4 5 6 7 );
13 :     my $lastkey = 0;
14 :    
15 :     my @colors2 = qw( #cccccc #ddbb99 #ffaaaa #ffcc66 #ffff00 #aaffaa #bbddff #ddaaff );
16 :     my @colors1 = map { gjocolorlib::blend_html_colors( $_, 'white' ) } @colors2;
17 :    
18 :     my $breakcolor = '#dddddd';
19 :     my $breakwidth = 3;
20 :    
21 :     #===============================================================================
22 :     # display_related_genomes
23 :     #
24 :     # $html = display_related_genomes( $contig_entries, $headings, $options )
25 :     #
26 :     # contig_entries = [ contig_entry, ... ]
27 :     # contig_entry = [ peg_entry, ... ]
28 :     # peg_entry = [ contig, gene, peg_len, mouseover, related_entries ]
29 :     # related_engties = [ related_entry, ... ]
30 :     # related_entry = [ type, contig, gene, indentity_frac, mouseover ]
31 : golsen 1.2 # type = <-> | -> | - (bbh, best hit, or no hit)
32 : overbeek 1.1 # mouseover = [ pop_up_title_html, pop_up_body_html, href_url ];
33 :     #
34 :     # headings = [ heading, ... ] = column heading information
35 :     # heading = [ pop_up_title_html, pop_up_body_html, href_url ]
36 :     #
37 :     # Options:
38 :     #
39 :     # color_by => keyword -- color matching entries by identity or contig
40 :     # breakcolor => html_color -- color of genome separator (D = #dddddd)
41 : golsen 1.2 # breakwidth => points -- width of genome separator (D = 3)
42 : overbeek 1.1 # page => boolean -- 0 for invoking from CGI; 1 gives HTML page
43 : golsen 1.2 #
44 : overbeek 1.1 #===============================================================================
45 :     sub display_related_genomes
46 :     {
47 :     my ( $contig_entries, $headings, $options ) = @_;
48 : golsen 1.2 $contig_entries && ref ( $contig_entries ) eq 'ARRAY' && $headings && ref( $headings ) eq 'ARRAY'
49 : overbeek 1.1 or print STDERR "display_related_genomes requires contig_entries and headings\n"
50 : golsen 1.2 and return '';
51 : overbeek 1.1 $options ||= {};
52 :    
53 :     my $color_by = $options->{ color_by } || 'identity';
54 : golsen 1.2 $breakcolor = $options->{ breakcolor } if $options->{ breakcolor };
55 :     $breakwidth = $options->{ breakwidth } if $options->{ breakwidth };
56 :     my $page = $options->{ page } || 0;
57 : overbeek 1.1
58 :     # Genome names
59 :    
60 :     my ( $genome1, @genomes ) = map { $_->[0] } @$headings;
61 :    
62 :     my $gen_sep = "<TH BgColor=$breakcolor Width=$breakwidth></TH>";
63 :     my @genome_header = ( " <TR>",
64 :     join( "\n $gen_sep\n", map { genome_column_head( $_ ) } @$headings ),
65 :     " </TR>"
66 :     );
67 :    
68 :     # Look at the data contig-by-contig:
69 :    
70 :     my @contigs;
71 :     my %n_genes;
72 :     foreach ( @$contig_entries )
73 :     {
74 :     my $contig = $_->[0]->[0];
75 :     push @contigs, $contig;
76 :     $n_genes{ $contig } = @$_;
77 :     }
78 :    
79 :     # Build the contig navigation menu:
80 :    
81 :     my $contig_menu = join( '<BR />',
82 :     "<B>Go to contig:</B>",
83 :     map { "<A Href=\"#$_\">$_</A> - $n_genes{$_} genes" }
84 :     @contigs
85 :     );
86 :    
87 :     my $contig_mouseover = mouseover( 'Contig navigation', 'Click for menu', $contig_menu, '', '' );
88 :    
89 :     # Start writing the html:
90 :    
91 :     my @html;
92 :     if ($page)
93 :     {
94 :     push @html, "<HTML>",
95 :     "<HEAD>",
96 :     "<TITLE>$headings->[0]->[0] Genome comparisons</TITLE>",
97 :     "</HEAD>",
98 :     "",
99 :     "<BODY>";
100 :     }
101 :     push @html, mouseover_JavaScript();
102 :    
103 :     my $tbl_cols = 4 * @$headings + 3;
104 :     push @html, "<TABLE Cols=$tbl_cols>\n";
105 :    
106 :     my $contig_entry;
107 :     foreach $contig_entry ( @$contig_entries )
108 :     {
109 :     my $contig = $contig_entry->[0]->[0];
110 :    
111 :     # Work out contig colors for each genome:
112 :    
113 :     my ( $peg_entry, $genome_data );
114 :     my %counts; # hash with counts per contig for each genome
115 :     my %colors; # hash mapping contig to color for each genome
116 :    
117 :     if ( $color_by =~ /contig/ )
118 :     {
119 :     my ( $genome2, $c2, @g2 );
120 :     foreach $peg_entry ( @$contig_entry ) # per gene information
121 :     {
122 :     @g2 = @genomes;
123 :     foreach $genome_data ( @{ $peg_entry->[4] } )
124 :     {
125 :     $genome2 = shift @g2;
126 :     $c2 = $genome_data->[1];
127 :     $counts{ $genome2 }->{ $c2 }++ if $c2;
128 :     }
129 :     }
130 :    
131 :     foreach $genome2 ( @genomes )
132 :     {
133 :     my @clr = @clrkey;
134 :     my %clr = map { $_->[0] => ( shift @clr ) || 0 } # contig->color
135 :     sort { $b->[1] <=> $a->[1] } # sort by counts
136 :     map { [ $_, $counts{ $genome2 }->{ $_ } ] } # contig-counts pair
137 :     keys %{ $counts{ $genome2 } }; # contigs
138 :    
139 :     $colors{ $genome2 } = \%clr;
140 :     }
141 :     }
142 :    
143 :     # Genome names
144 :    
145 :     push @html, @genome_header;
146 :    
147 :     # Column headers
148 :    
149 :     push @html, " <TR>",
150 :     " <TH><A Name=$contig $contig_mouseover>Contig</A></TH>",
151 :     " <TH>Gene</TH>",
152 :     " <TH>Length</TH>";
153 :    
154 :     my $genome2;
155 :     foreach $genome2 ( @genomes )
156 :     {
157 :     push @html, " <TH BgColor=$breakcolor></TH>",
158 :     " <TH>Match<BR />type</TH>",
159 :     " <TH>Contig</TH>",
160 :     " <TH>Gene</TH>";
161 :     }
162 :     push @html, " </TR>\n";
163 :    
164 :     # Contig data
165 :    
166 :     foreach $peg_entry ( @$contig_entry ) # per gene information
167 :     {
168 :     # Write the HTML for each gene in the contig:
169 :    
170 :     my ( $c1, $g1, $len1, $mouseover, $genome_data ) = @$peg_entry;
171 :    
172 :     push @html, " <TR Align=center>",
173 :     " <TD>$c1</TD>",
174 :     linked_datum( $g1, undef, $mouseover ),
175 :     " <TD>$len1</TD>";
176 :    
177 :     my @g2 = @genomes;
178 :     my $genome2;
179 :     foreach my $info2 ( @$genome_data )
180 :     {
181 :     my ( $t2, $c2, $g2, $f_id, $mouseover ) = @$info2;
182 :     $genome2 = shift @g2;
183 :    
184 :     if ( $g2 )
185 :     {
186 :     my $color;
187 :     if ( $color_by =~ /ident/ )
188 :     {
189 :     # Hue goes red, green, blue, red over the inverval 0 - 1
190 :     # We want 0.003 -> 0.01 -> 0.03 -> 0.10 -> 0.3 -> 1
191 :     # log( $diff ) / log( 10 ) is log10( $diff ); it starts at
192 :     # -3 for identity to 0 at 100% different.
193 :     # -log( $diff ) / log( 10 ) starts at 3 and becomes 0 at 100% diff.
194 :     # 2/9 of that takes the hue from blue to red at diff goes from 0 to 1.
195 :    
196 :     my $diff = 1 - $f_id + 0.001;
197 :    
198 :     $color = gjocolorlib::rgb2html(
199 :     gjocolorlib::hsb2rgb( -2/9 * log( $diff ) / log( 10 ), # hue
200 :     $t2 eq '<->' ? 0.4 : 0.2, # saturation
201 :     1.0 # brightness
202 :     )
203 :     );
204 :     }
205 :     else
206 :     {
207 :     my $clrkey = $colors{ $genome2 }->{ $c2 };
208 :     $color = $t2 eq '<->' ? $colors2[$clrkey] : $colors1[$clrkey];
209 :     }
210 :    
211 :     push @html, $gen_sep,
212 :     " <TD BgColor=$color>$t2</TD>",
213 :     " <TD BgColor=$color>$c2</TD>",
214 :     linked_datum( $g2, $color, $mouseover );
215 :     }
216 :     else
217 :     {
218 :     push @html, $gen_sep,
219 :     " <TD>$t2</TD>",
220 :     " <TD> </TD>",
221 :     " <TD> </TD>";
222 :     }
223 :     }
224 :     push @html, " </TR>";
225 :     }
226 :     }
227 :    
228 :     push @html, "</TABLE>";
229 :     if ($page)
230 :     {
231 :     push @html,"</BODY>","</HTML>";
232 :     }
233 :     return join( "\n", @html );
234 :     }
235 :    
236 :    
237 :     #-------------------------------------------------------------------------------
238 :     # Build the html string for the column header for a genome:
239 :     #
240 :     # $html = genome_column_head( $heading )
241 :     #
242 :     #-------------------------------------------------------------------------------
243 :     sub genome_column_head
244 :     {
245 :     my ( $abbrev, $text, $link ) = @{ $_[0] };
246 :     $link = $link ? " HRef=\"$link\" Target=\"$abbrev\"" : '';
247 :     my $mouse = $text ? mouseover( $abbrev, $text ) : '';
248 :     $abbrev = "<A$link>$abbrev</A>" if $link;
249 :     return " <TH ColSpan=3$mouse>$abbrev</TH>";
250 :     }
251 :    
252 :    
253 :     #-------------------------------------------------------------------------------
254 :     # Build the html string for the column header for a genome:
255 :     #
256 :     # $html = linked_datum( $datum, $color, $mouseover )
257 :     #
258 :     #-------------------------------------------------------------------------------
259 :     sub linked_datum
260 :     {
261 :     my ( $datum, $color, $mouse ) = @_;
262 : golsen 1.2 my ( $id, $text, $link ) = ( $mouse && ref( $mouse ) eq 'ARRAY' ) ? @$mouse : ();
263 : overbeek 1.1 $mouse = $text ? mouseover( $id, $text || '&nbsp;' ) : '';
264 :     $link = $link ? " HRef=$link Target='$id'" : '';
265 :     $color = $color ? " BgColor=$color" : '';
266 :     $datum = "<A$link>$datum</A>" if $link;
267 :     return " <TD$color$mouse>$datum</TD>";
268 :     }
269 :    
270 :    
271 :     #-------------------------------------------------------------------------------
272 :     # Escape special characters in text for use in inline javascript string:
273 :     #
274 :     # $js_string = js_escape( $text )
275 :     #
276 :     #-------------------------------------------------------------------------------
277 :     sub js_escape { local $_ = $_[0] || ''; s/'/\\'/g; s/"/&quot;/g; $_ }
278 :    
279 :    
280 :     #-------------------------------------------------------------------------------
281 :     # Return a string for adding an onMouseover tooltip handler:
282 :     #
283 :     # mouseover( $title, $text, $menu, $parent, $titlecolor, $bodycolor )
284 :     #
285 :     # The code here is virtually identical to that in FIGjs.pm, but makes this
286 :     # SEED independent.
287 :     #-------------------------------------------------------------------------------
288 :     sub mouseover
289 :     {
290 :     if ( $have_FIGjs ) { return &FIGjs::mouseover( @_ ) }
291 :    
292 :     my ($title, $text, $menu, $parent, $titlecolor, $bodycolor) = @_;
293 :    
294 :     $title = js_escape( $title );
295 :     $text = js_escape( $text );
296 :     $menu = js_escape( $menu );
297 :    
298 :     qq( onMouseover="javascript:if( ! this.tooltip ) this.tooltip=new Popup_Tooltip( this, '$title', '$text', '$menu', '$parent', '$titlecolor', '$bodycolor' ); this.tooltip.addHandler(); return false;")
299 :     }
300 :    
301 :    
302 :     #-------------------------------------------------------------------------------
303 :     # Return a text string with the necessary JavaScript for the mouseover
304 :     # tooltips.
305 :     #
306 :     # $html = mouseover_JavaScript()
307 :     #
308 :     # The code here is virtually identical to that in FIGjs.pm, but makes this
309 :     # SEED independent.
310 :     #-------------------------------------------------------------------------------
311 :     sub mouseover_JavaScript
312 :     {
313 :     if ( $have_FIGjs ) { return &FIGjs::toolTipScript( ) }
314 :    
315 :     return <<'End_of_JavaScript';
316 :     <SCRIPT Language='JavaScript'>
317 :     //
318 :     // javascript class for tooltips and popup menus
319 :     //
320 :     // This class manages the information, creating area to draw tooltips and
321 :     // popup menus and provides the event handlers to handle them
322 :     //
323 :     var DIV_WIDTH=400;
324 :     var px; // position suffix with "px" in some cases
325 :     var initialized = false;
326 :     var ns4 = false;
327 :     var ie4 = false;
328 :     var ie5 = false;
329 :     var kon = false;
330 :     var iemac = false;
331 :     var tooltip_name='popup_tooltip_div';
332 :    
333 :     function Popup_Tooltip(object, tooltip_title, tooltip_text,
334 :     popup_menu, use_parent_pos, head_color,
335 :     body_color) {
336 :     // The first time an object of this class is instantiated,
337 :     // we have to setup some browser specific settings
338 :    
339 :     if (!initialized) {
340 :     ns4 = (document.layers) ? true : false;
341 :     ie4 = (document.all) ? true : false;
342 :     ie5 = ((ie4) && ((navigator.userAgent.indexOf('MSIE 5') > 0) ||
343 :     (navigator.userAgent.indexOf('MSIE 6') > 0))) ? true : false;
344 :     kon = (navigator.userAgent.indexOf('konqueror') > 0) ? true : false;
345 :     if(ns4||kon) {
346 :     //setTimeout("window.onresize = function () {window.location.reload();};", 2000);
347 :     }
348 :     ns4 ? px="" : px="px";
349 :     iemac = ((ie4 || ie5) && (navigator.userAgent.indexOf('Mac') > 0)) ? true : false;
350 :    
351 :     initialized=true;
352 :     }
353 :    
354 :     if (iemac) { return; } // Give up
355 :    
356 :     this.tooltip_title = tooltip_title;
357 :     this.tooltip_text = tooltip_text;
358 :    
359 :     if (head_color) { this.head_color = head_color; }
360 :     else { this.head_color = "#333399"; }
361 :    
362 :     if (body_color) { this.body_color = body_color; }
363 :     else { this.body_color = "#CCCCFF"; }
364 :    
365 :     this.popup_menu = popup_menu;
366 :     if (use_parent_pos) {
367 :     this.popup_menu_x = object.offsetLeft;
368 :     this.popup_menu_y = object.offsetTop + object.offsetHeight + 3;
369 :     }
370 :     else {
371 :     this.popup_menu_x = -1;
372 :     this.popup_menu_y = -1;
373 :     }
374 :    
375 :     // create the div if necessary
376 :     // the div may be shared between several instances
377 :     // of this class
378 :    
379 :     this.div = getDiv(tooltip_name);
380 :     if (! this.div) {
381 :     // create a hidden div to contain the information
382 :     this.div = document.createElement("div");
383 :     this.div.id=tooltip_name;
384 :     this.div.style.position="absolute";
385 :     this.div.style.zIndex=0;
386 :     this.div.style.top="0"+px;
387 :     this.div.style.left="0"+px;
388 :     this.div.style.visibility=ns4?"hide":"hidden";
389 :     this.div.tooltip_visible=0;
390 :     this.div.menu_visible=0
391 :     document.body.appendChild(this.div);
392 :     }
393 :    
394 :     // register methods
395 :    
396 :     this.showTip = showTip;
397 :     this.hideTip = hideTip;
398 :     this.fillTip = fillTip;
399 :     this.showMenu = showMenu;
400 :     this.hideMenu = hideMenu;
401 :     this.fillMenu = fillMenu;
402 :     this.addHandler = addHandler;
403 :     this.delHandler = delHandler;
404 :     this.mousemove = mousemove;
405 :     this.showDiv = showDiv;
406 :    
407 :     // object state
408 :    
409 :     this.attached = object;
410 :     object.tooltip = this;
411 :     }
412 :    
413 :     function getDiv() {
414 :     if (ie5 || ie4) { return document.all[tooltip_name]; }
415 :     else if (document.layers) { return document.layers[tooltip_name]; }
416 :     else if (document.all) { return document.all[tooltip_name]; }
417 :     return document.getElementById(tooltip_name);
418 :     }
419 :    
420 :     function hideTip() {
421 :     if (this.div.tooltip_visible) {
422 :     this.div.innerHTML="";
423 :     this.div.style.visibility=ns4?"hide":"hidden";
424 :     this.div.tooltip_visible=0;
425 :     }
426 :     }
427 :    
428 :     function hideMenu() {
429 :     if (this.div && this.div.menu_visible) {
430 :     this.div.innerHTML="";
431 :     this.div.style.visibility=ns4?"hide":"hidden";
432 :     this.div.menu_visible=0;
433 :     }
434 :     }
435 :    
436 :     function fillTip() {
437 :     this.hideTip();
438 :     this.hideMenu();
439 :     if (this.tooltip_title && this.tooltip_text) {
440 :     this.div.innerHTML='<table width='+DIV_WIDTH+' border=0 cellpadding=2 cellspacing=0 bgcolor="'+this.head_color+'"><tr><td class="tiptd"><table width="100%" border=0 cellpadding=0 cellspacing=0><tr><th><span class="ptt"><b><font color="#FFFFFF">'+this.tooltip_title+'</font></b></span></th></tr></table><table width="100%" border=0 cellpadding=2 cellspacing=0 bgcolor="'+this.body_color+'"><tr><td><span class="pst"><font color="#000000">'+this.tooltip_text+'</font></span></td></tr></table></td></tr></table>';
441 :     this.div.tooltip_visible=1;
442 :     }
443 :     }
444 :    
445 :     function fillMenu() {
446 :     this.hideTip();
447 :     this.hideMenu();
448 :     if (this.popup_menu) {
449 :     this.div.innerHTML='<table cellspacing="2" cellpadding="1" bgcolor="#000000"><tr bgcolor="#eeeeee"><td><div style="max-height:300px;min-width:100px;overflow:auto;">'+this.popup_menu+'</div></td></tr></table>';
450 :     this.div.menu_visible=1;
451 :     }
452 :     }
453 :    
454 :     function showDiv(x,y) {
455 :     winW=(window.innerWidth)? window.innerWidth+window.pageXOffset-16 :
456 :     document.body.offsetWidth-20;
457 :     winH=(window.innerHeight)?window.innerHeight+window.pageYOffset :
458 :     document.body.offsetHeight;
459 :     if (window.getComputedStyle) {
460 :     current_style = window.getComputedStyle(this.div,null);
461 :     div_width = parseInt(current_style.width);
462 :     div_height = parseInt(current_style.height);
463 :     }
464 :     else {
465 :     div_width = this.div.offsetWidth;
466 :     div_height = this.div.offsetHeight;
467 :     }
468 :     this.div.style.left=(((x + div_width) > winW) ? winW - div_width : x) + px;
469 :     this.div.style.top=(((y + div_height) > winH) ? winH - div_height: y) + px;
470 :     // this.div.style.color = "#eeeeee";
471 :     this.div.style.visibility=ns4?"show":"visible";
472 :     }
473 :    
474 :     function showTip(e,y) {
475 :     if (!this.div.menu_visible) {
476 :     if (!this.div.tooltip_visible) {
477 :     this.fillTip();
478 :     }
479 :     var x;
480 :     if (typeof(e) == 'number') {
481 :     x = e;
482 :     }
483 :     else {
484 :     x=e.pageX?e.pageX:e.clientX?e.clientX:0;
485 :     y=e.pageY?e.pageY:e.clientY?e.clientY:0;
486 :     }
487 :     x+=2; y+=2;
488 :     this.showDiv(x,y);
489 :     this.div.tooltip_visible=1;
490 :     }
491 :     }
492 :    
493 :     function showMenu(e) {
494 :     if (this.div) {
495 :     if (!this.div.menu_visible) {
496 :     this.fillMenu();
497 :     }
498 :     var x;
499 :     var y;
500 :    
501 :     // if the menu position was given as parameter
502 :     // to the constructor, then use that position
503 :     // or fall back to mouse position
504 :    
505 :     if (this.popup_menu_x != -1) {
506 :     x = this.popup_menu_x;
507 :     y = this.popup_menu_y;
508 :     }
509 :     else {
510 :     x = e.pageX ? e.pageX : e.clientX ? e.clientX : 0;
511 :     y = e.pageY ? e.pageY : e.clientY ? e.clientY : 0;
512 :     }
513 :     this.showDiv(x,y);
514 :     this.div.menu_visible=1;
515 :     }
516 :     }
517 :    
518 :     // Add the event handler to the parent object.
519 :     // The tooltip is managed by the mouseover and mouseout
520 :     // events. mousemove is captured, too
521 :    
522 :     function addHandler() {
523 :     if (iemac) { return; } // ignore Ie on mac
524 :    
525 :     if(this.tooltip_text) {
526 :     this.fillTip();
527 :     this.attached.onmouseover = function (e) {
528 :     this.tooltip.showTip(e);
529 :     return false;
530 :     };
531 :     this.attached.onmousemove = function (e) {
532 :     this.tooltip.mousemove(e);
533 :     return false;
534 :     };
535 :     }
536 :    
537 :     if (this.popup_menu) {
538 :     this.attached.onclick = function (e) {
539 :     this.tooltip.showMenu(e);
540 :    
541 :     // reset event handlers
542 :     if (this.tooltip_text) {
543 :     this.onmousemove=null;
544 :     this.onmouseover=null;
545 :     this.onclick=null;
546 :     }
547 :    
548 :     // there are two mouseout events,
549 :     // one when the mouse enters the inner region
550 :     // of our div, and one when the mouse leaves the
551 :     // div. we need to handle both of them
552 :     // since the div itself got no physical region on
553 :     // the screen, we need to catch event for its
554 :     // child elements
555 :     this.tooltip.div.moved_in=0;
556 :     this.tooltip.div.onmouseout=function (e) {
557 :     var div = getDiv(tooltip_name);
558 :     if (e.target.parentNode == div) {
559 :     if (div.moved_in) {
560 :     div.menu_visible = 0;
561 :     div.innerHTML="";
562 :     div.style.visibility=ns4?"hide":"hidden";
563 :     }
564 :     else {
565 :     div.moved_in=1;
566 :     }
567 :     return true;
568 :     };
569 :     return true;
570 :     };
571 :     this.tooltip.div.onclick=function() {
572 :     this.menu_visible = 0;
573 :     this.innerHTML="";
574 :     this.style.visibility=ns4?"hide":"hidden";
575 :     return true;
576 :     }
577 :     return false; // do not follow existing links if a menu was defined!
578 :    
579 :     };
580 :     }
581 :     this.attached.onmouseout = function () {
582 :     this.tooltip.delHandler();
583 :     return false;
584 :     };
585 :     }
586 :    
587 :     function delHandler() {
588 :     if (this.div.menu_visible) { return true; }
589 :    
590 :     // clean up
591 :    
592 :     if (this.popup_menu) { this.attached.onmousedown = null; }
593 :     this.hideMenu();
594 :     this.hideTip();
595 :     this.attached.onmousemove = null;
596 :     this.attached.onmouseout = null;
597 :    
598 :     // re-register the handler for mouse over
599 :    
600 :     this.attached.onmouseover = function (e) {
601 :     this.tooltip.addHandler(e);
602 :     return true;
603 :     };
604 :     return false;
605 :     }
606 :    
607 :     function mousemove(e) {
608 :     if (this.div.tooltip_visible) {
609 :     if (e) {
610 :     x=e.pageX?e.pageX:e.clientX?e.clientX:0;
611 :     y=e.pageY?e.pageY:e.clientY?e.clientY:0;
612 :     }
613 :     else if (event) {
614 :     x=event.clientX;
615 :     y=event.clientY;
616 :     }
617 :     else {
618 :     x=0; y=0;
619 :     }
620 :    
621 :     if(document.documentElement) // Workaround for scroll offset of IE
622 :     {
623 :     x+=document.documentElement.scrollLeft;
624 :     y+=document.documentElement.scrollTop;
625 :     }
626 :     this.showTip(x,y);
627 :     }
628 :     }
629 :    
630 :     function setValue(id , val) {
631 :     var element = document.getElementById(id);
632 :     element.value = val;
633 :     }
634 :     </SCRIPT>
635 :    
636 :     End_of_JavaScript
637 :     }
638 :    
639 :    
640 :     1;

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3