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

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3