1 package HTMLUtil; 2 # 3 # $RCSfile: HTMLUtil.pm,v $ 4 # $Date: 2015/02/28 20:47:17 $ 5 # $Revision: 1.42 $ 6 # 7 # Author: Manish Sud <msud@san.rr.com> 8 # 9 # Copyright (C) 2015 Manish Sud. All rights reserved. 10 # 11 # This file is part of MayaChemTools. 12 # 13 # MayaChemTools is free software; you can redistribute it and/or modify it under 14 # the terms of the GNU Lesser General Public License as published by the Free 15 # Software Foundation; either version 3 of the License, or (at your option) any 16 # later version. 17 # 18 # MayaChemTools is distributed in the hope that it will be useful, but without 19 # any warranty; without even the implied warranty of merchantability of fitness 20 # for a particular purpose. See the GNU Lesser General Public License for more 21 # details. 22 # 23 # You should have received a copy of the GNU Lesser General Public License 24 # along with MayaChemTools; if not, see <http://www.gnu.org/licenses/> or 25 # write to the Free Software Foundation Inc., 59 Temple Place, Suite 330, 26 # Boston, MA, 02111-1307, USA. 27 # 28 29 use strict; 30 use Exporter; 31 32 use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); 33 34 @ISA = qw(Exporter); 35 @EXPORT = qw(InsertHTMLTags SetupHTMLAlignmentBegin SetupHTMLAlignmentEnd SetupHTMLButtonRef SetupHTMLDivBegin SetupHTMLDivEnd SetupHTMLEmptyLines SetupHTMLPageHeader SetupHTMLHRef SetupHTMLPageEnd SetupHTMLPageTitle SetupHTMLStyleSheetTags SetupHTMLTableHeader SetupHTMLTableEnd SetupHTMLTableColumnHeader SetupHTMLTableColumnEnd SetupHTMLTableRowHeader SetupHTMLTableRowEnd SetupHTMLTableRowHeaderValue SetupHTMLTableRowDataValue SetupJavaScriptCmds SetupStrViewerJSInitCmd SetupStrViewerJMEApplet SetupStrViewerJmolApplet SetupStrViewerChimePlugIn SetupStrViewerChem3DActiveX SetupStrViewerChemDrawActiveX SetupStrViewerChemDrawPlugIn SetupStrViewerMarvinViewApplet SetupStrViewerAccelrysActiveX); 36 @EXPORT_OK = qw(); 37 38 %EXPORT_TAGS = (all => [@EXPORT, @EXPORT_OK]); 39 40 # Default window size for various supported structure viewers... 41 my($StrViewerWidth, $StrViewerHeight) = (250, 170); 42 43 # Insert specfied tags into existing tag string... 44 sub InsertHTMLTags { 45 my($Tag, %TagsMap) = @_; 46 my($NewTag, $TagName, $TagValue, $TagPart1, $TagPart2); 47 48 $NewTag = $Tag; $TagPart1 = ""; $TagPart2 = ""; 49 ($TagPart1) = $Tag =~ /^(.*?)>/; 50 51 if ($TagPart1 && length($TagPart1)) { 52 $TagPart2 = $Tag; 53 $TagPart2 =~ s/^(.*?)>//; 54 if ($TagPart2 && length($TagPart2)) { 55 for $TagName (keys %TagsMap) { 56 $TagValue = $TagsMap{$TagName}; 57 $TagPart1 .= qq( $TagName="$TagValue" ); 58 } 59 $NewTag = "${TagPart1}>${TagPart2}"; 60 } 61 } 62 63 return $NewTag; 64 } 65 66 sub SetupHTMLAlignmentBegin { 67 my($AlignmentTag, $Alignment); 68 69 $Alignment = (@_ == 1) ? $_[0] : "left"; 70 $AlignmentTag = qq(<$Alignment>\n); 71 72 return $AlignmentTag; 73 } 74 75 sub SetupHTMLAlignmentEnd { 76 my($AlignmentTag, $Alignment); 77 78 $Alignment = (@_ == 1) ? $_[0] : "left"; 79 $AlignmentTag = qq(</$Alignment>\n); 80 81 return $AlignmentTag; 82 } 83 84 # Setup a button reference... 85 sub SetupHTMLButtonRef { 86 my($ButtonLabel, $RefFile, $ButtonTags); 87 88 ($ButtonLabel, $RefFile) = @_; 89 90 $ButtonTags = qq(<input type="button" value="$ButtonLabel" onClick="document.location='$RefFile'">); 91 return $ButtonTags; 92 } 93 94 sub SetupHTMLDivBegin { 95 my($Id) = @_; 96 my($DivTag); 97 98 $DivTag = qq(<div id="$Id">\n); 99 100 return $DivTag; 101 } 102 103 sub SetupHTMLDivEnd { 104 my($DivTag); 105 106 $DivTag = qq(</div>\n); 107 108 return $DivTag; 109 } 110 sub SetupHTMLEmptyLines { 111 my($LineCount, $Index, $EmptyLineTags); 112 113 $LineCount = 1; 114 $EmptyLineTags = qq(<p> </p>); 115 ($LineCount) = @_; 116 if ($LineCount > 1) { 117 for $Index (2 .. $LineCount) { 118 $EmptyLineTags .= qq(<p> </p>); 119 } 120 } 121 return $EmptyLineTags; 122 } 123 124 # Setup HTML page header... 125 sub SetupHTMLPageHeader { 126 my($HeaderTitle, $Stylesheet, $JavaScript, $PageHeader); 127 128 $HeaderTitle = ""; $Stylesheet = ""; $JavaScript = ""; 129 if (@_ == 3) { 130 ($HeaderTitle, $Stylesheet, $JavaScript) = @_; 131 } 132 elsif (@_ == 2) { 133 ($HeaderTitle, $Stylesheet) = @_; 134 } 135 else { 136 ($HeaderTitle) = @_; 137 } 138 $PageHeader = qq(<html>\n); 139 $PageHeader .= qq(<head>\n); 140 $PageHeader .= qq(<title>$HeaderTitle</title>\n); 141 $PageHeader .= qq(<meta http-equiv="content-type" content="text/html;charset=utf-8">\n); 142 if ($Stylesheet) { 143 $PageHeader .= qq(<link rel="stylesheet" type="text/css" href="$Stylesheet">\n); 144 } 145 if ($JavaScript) { 146 $PageHeader .= qq(<script src="$JavaScript"></script>\n); 147 } 148 $PageHeader .= <<ENDPAGEHEADER; 149 </head> 150 <body> 151 <p> </p> 152 ENDPAGEHEADER 153 154 return $PageHeader; 155 } 156 157 # Setup page title... 158 sub SetupHTMLPageTitle { 159 my($Title, $Alignment, $PageTitle); 160 161 $Alignment = "center"; 162 if (@_ == 2) { 163 ($Title, $Alignment) = @_; 164 } 165 else { 166 ($Title) = @_; 167 } 168 169 $PageTitle=<<ENDPAGETITLE; 170 <$Alignment> 171 <h3>$Title</h3> 172 </$Alignment> 173 ENDPAGETITLE 174 175 return $PageTitle; 176 } 177 178 # Setup HTML page end... 179 sub SetupHTMLPageEnd { 180 my($PageEnd, $Footer); 181 182 $Footer = ""; 183 if (@_ == 1) { 184 ($Footer) = @_; 185 } 186 if ($Footer) { 187 $Footer = qq(<span class="Footer">$Footer</span>); 188 } 189 $PageEnd=<<ENDPAGE; 190 <center> 191 <p> </p> 192 $Footer 193 </center> 194 </body> 195 </html> 196 ENDPAGE 197 198 return $PageEnd; 199 } 200 201 # Setup HTML link tags... 202 sub SetupHTMLHRef { 203 my($Value, $RefFile, $HRef, $Title); 204 205 $Title = ""; 206 if (@_ == 3) { 207 ($Value, $RefFile, $Title) = @_; 208 } 209 else { 210 ($Value, $RefFile) = @_; 211 } 212 213 $HRef = qq(<a href="$RefFile"); 214 if ($Title) { 215 $HRef .= qq( title="$Title"); 216 } 217 $HRef .= qq(>$Value</a>); 218 return $HRef; 219 } 220 221 # 222 sub SetupHTMLStyleSheetTags { 223 my($StyleSheetTags); 224 225 $StyleSheetTags=<<ENDSTYLESHEET; 226 body 227 { 228 background-color: #ffffff; 229 font-family: Verdana, Arial, Helvetica, sans-serif; 230 font-size: 11px; 231 } 232 p 233 { 234 font-family: Verdana, Arial, Helvetica, sans-serif; 235 font-size: 11px; 236 } 237 h1 238 { 239 font-family: Verdana, Arial, Helvetica, sans-serif; 240 font-size: 25px; 241 font-weight: bold; 242 color: #0054aa; 243 } 244 h2 245 { 246 font-family: Verdana, Arial, Helvetica, sans-serif; 247 font-size: 18px; 248 font-weight: bold; 249 color: #0054aa; 250 } 251 h3 252 { 253 font-family: Verdana, Arial, Helvetica, sans-serif; 254 font-size: 14px; 255 font-weight: bold; 256 color: #0054aa; 257 } 258 b 259 { 260 font-weight: bold; 261 } 262 td 263 { 264 font-family: Verdana, Arial, Helvetica, sans-serif; 265 font-size: 11px; 266 } 267 th 268 { 269 font-family: Verdana, Arial, Helvetica, sans-serif; 270 font-size: 11px; 271 color: #0054aa; 272 font-weight: bold; 273 } 274 .box { 275 border-color: #000000; 276 border-style: solid; 277 border-top-width: 1px; 278 border-bottom-width: 1px; 279 border-left-width: 1px; 280 border-right-width: 1px; 281 } 282 a 283 { 284 color: #0000bb; 285 text-decoration: none; 286 font-family: Verdana, Arial, Helvetica, sans-serif; 287 font-size: 11px; 288 } 289 a:hover 290 { 291 color: #ff0000; 292 } 293 #tablenav { 294 font-family: Verdana, Arial, Helvetica, sans-serif; 295 font-size: 11px; 296 } 297 #tablenav td 298 { 299 font-family: Verdana, Arial, Helvetica, sans-serif; 300 font-size: 11px; 301 } 302 #tablenav th 303 { 304 font-family: Verdana, Arial, Helvetica, sans-serif; 305 font-size: 11px; 306 font-weight: bold; 307 } 308 #tablenav a 309 { 310 color: #0000bb; 311 text-decoration: none; 312 font-family: Verdana, Arial, Helvetica, sans-serif; 313 font-size: 11px; 314 } 315 #tablenav a:hover 316 { 317 color: #ff0000; 318 } 319 .footer 320 { 321 font-family: Arial, Verdana, Helvetica, sans-serif; 322 font-size: 9px; 323 color: #888888; 324 } 325 ENDSTYLESHEET 326 327 return $StyleSheetTags; 328 } 329 330 # Setup HTML table header... 331 sub SetupHTMLTableHeader { 332 my($TableHeader, $BorderWidth, $CellPadding, $CellSpacing, $Width, $Height); 333 334 $BorderWidth = 1; $CellPadding = 2; $CellSpacing = 0; $Width = ""; $Height = ""; 335 if (@_ == 5) { 336 ($BorderWidth, $CellPadding, $CellSpacing, $Width, $Height) = @_; 337 } 338 elsif (@_ == 4) { 339 ($BorderWidth, $CellPadding, $CellSpacing, $Width) = @_; 340 } 341 elsif (@_ == 3) { 342 ($BorderWidth, $CellPadding, $CellSpacing) = @_; 343 } 344 elsif (@_ == 2) { 345 ($BorderWidth, $CellPadding) = @_; 346 } 347 elsif (@_ = 1) { 348 ($BorderWidth) = @_; 349 } 350 $TableHeader = qq(<table border=$BorderWidth cellpadding=$CellPadding cellspacing=$CellSpacing); 351 if ($Width) { 352 $TableHeader .= qq( width=$Width); 353 } 354 if ($Height) { 355 $TableHeader .= qq( height=$Height); 356 } 357 $TableHeader .= qq(>\n); 358 359 return $TableHeader; 360 } 361 362 # Setup HTML table end... 363 sub SetupHTMLTableEnd { 364 my($TableEnd); 365 366 $TableEnd=<<ENDTABLE; 367 </table> 368 ENDTABLE 369 370 return $TableEnd; 371 } 372 373 # Setup HTML table column header... 374 sub SetupHTMLTableColumnHeader { 375 my($BgColor, $Width, $ColumnHeader); 376 377 $BgColor = ""; $Width = ""; 378 if (@_ == 1) { 379 ($BgColor) = @_; 380 } 381 elsif (@_ == 2) { 382 ($BgColor, $Width) = @_; 383 } 384 $ColumnHeader = qq(<td); 385 if ($BgColor) { 386 $ColumnHeader .= qq( bgcolor="$BgColor") 387 } 388 if ($Width) { 389 $ColumnHeader .= qq( width="$Width") 390 } 391 $ColumnHeader .= qq(>); 392 return $ColumnHeader; 393 } 394 395 # Setup HTML table column end... 396 sub SetupHTMLTableColumnEnd { 397 my($ColumnEnd); 398 399 $ColumnEnd = qq(</td>); 400 return $ColumnEnd; 401 } 402 403 # Setup HTML table row header... 404 sub SetupHTMLTableRowHeader { 405 my($RowHeader, $HAlignment, $BgColor, $VAlignment); 406 407 $HAlignment = "center"; $BgColor = ""; $VAlignment = "top"; 408 if (@_ == 3) { 409 ($HAlignment, $BgColor, $VAlignment) = @_; 410 } 411 elsif (@_ == 2) { 412 ($HAlignment, $BgColor) = @_; 413 } 414 elsif (@_ == 1) { 415 ($HAlignment) = @_; 416 } 417 if ($BgColor) { 418 $RowHeader = qq(<tr bgcolor="$BgColor" align="$HAlignment" valign="$VAlignment">); 419 } 420 else { 421 $RowHeader = qq(<tr align="$HAlignment" valign="$VAlignment">); 422 } 423 424 return $RowHeader; 425 } 426 427 # Setup HTML table row end... 428 sub SetupHTMLTableRowEnd { 429 my($RowEnd); 430 431 $RowEnd = qq(</tr>\n); 432 return $RowEnd; 433 } 434 435 # Setup HTML table header values... 436 sub SetupHTMLTableRowHeaderValue { 437 my($HeaderValue, $Value); 438 439 $Value = ""; 440 if (@_ >= 1) { 441 ($Value) = @_; 442 } 443 if (defined $Value && length $Value) { 444 $HeaderValue = qq(<th>$Value</th>); 445 } 446 else { 447 $HeaderValue = qq(<th> </th>); 448 } 449 return $HeaderValue; 450 } 451 452 # Setup HTML table row data values... 453 sub SetupHTMLTableRowDataValue { 454 my($RowValues, $Value, $BgColor, $FontColor, $FontBold, $FontBoldTag1, $FontBoldTag2); 455 456 $Value = ""; $BgColor = ""; $FontColor = ""; $FontBold = ""; 457 if (@_ == 1) { 458 ($Value) = @_; 459 } 460 elsif (@_ == 2) { 461 ($Value, $BgColor) = @_; 462 } 463 elsif (@_ == 3) { 464 ($Value, $BgColor, $FontColor) = @_; 465 } 466 elsif (@_ == 4) { 467 ($Value, $BgColor, $FontColor, $FontBold) = @_; 468 } 469 if (!(defined $Value && length $Value)) { 470 $Value = qq( ); 471 } 472 $FontBoldTag1 = ""; $FontBoldTag2 = ""; 473 if ($FontBold) { 474 $FontBoldTag1 = qq(<b>); 475 $FontBoldTag2 = qq(</b>); 476 } 477 if ($BgColor || $FontColor) { 478 my ($BgColorTag, $FontTag1, $FontTag2); 479 480 $BgColorTag = ""; 481 if ($BgColor) { 482 $BgColorTag = qq( bgcolor="$BgColor"); 483 } 484 $FontTag1 = ""; $FontTag2 = ""; 485 if ($FontColor) { 486 $FontTag1 = qq(<font color="$FontColor">); 487 $FontTag2 = qq(</font>); 488 } 489 if ($FontBold) { 490 $RowValues = "<td" . $BgColorTag . ">" . $FontBoldTag1 . $FontTag1 . "$Value" . $FontTag2 . $FontBoldTag2 . "</td>"; 491 } 492 else { 493 $RowValues = "<td" . $BgColorTag . ">" . $FontTag1 . "$Value" . $FontTag2 . "</td>"; 494 } 495 } 496 elsif ($FontBold) { 497 $RowValues = "<td>" . $FontBoldTag1 . "$Value" . $FontBoldTag2 . "</td>"; 498 } 499 else { 500 $RowValues = qq(<td>$Value</td>); 501 } 502 return $RowValues; 503 } 504 505 # Setup Java scripts command... 506 sub SetupJavaScriptCmds { 507 my(@JSCmdList) = @_; 508 my($JSTags, $JSCmd); 509 510 $JSTags = qq(<script>\n); 511 for $JSCmd (@JSCmdList) { 512 $JSTags .= qq($JSCmd\n); 513 } 514 $JSTags .= qq(</script>\n); 515 516 return $JSTags; 517 } 518 519 # Setup Java script initialize command... 520 sub SetupStrViewerJSInitCmd { 521 my($StrViewerType, $CodeBase) = @_; 522 my($JSTag); 523 524 $JSTag = ""; 525 if ($StrViewerType eq "Jmol") { 526 $JSTag = qq(<script>jmolInitialize("$CodeBase", "JmolApplet.jar");</script>\n); 527 } 528 elsif ($StrViewerType eq "ChemDrawPlugIn" || $StrViewerType eq "ChemDrawActiveX") { 529 $JSTag = qq(<script>cd_includeWrapperFile("$CodeBase/");</script>\n); 530 } 531 elsif ($StrViewerType eq "Chem3DActiveX") { 532 } 533 return $JSTag; 534 } 535 536 537 # Setup Jmol applet... 538 sub SetupStrViewerJmolApplet { 539 my($MolString, $CodeBase, $ParamsMapRef, %ParamsMap, $AppletTags, $JavaScriptTags, $ReturnTags, $Name, $Code, $Archive, $Width, $Height, $ParamName, $ParamValue, $JSFileName, $UseJavaScript); 540 my($ProgressBar, $ProgressColor, $BoxMessage, $BoxFgColor, $BoxBgColor, $BgColor, $JMolScript); 541 542 $AppletTags = ""; $JavaScriptTags = ""; $ReturnTags = ""; 543 $ParamsMapRef = ""; %ParamsMap = (); 544 $Name = "Jmol"; $Code = "JmolApplet"; $Archive = "JmolApplet.jar"; $Width = $StrViewerWidth; $Height = $StrViewerHeight; 545 $ProgressBar = "true"; $ProgressColor = "#0000ff"; $BgColor = "#000000"; 546 $BoxMessage = "Setting up JmolApplet..."; $BoxFgColor = "#000000"; $BoxBgColor = "#ffffff"; 547 $UseJavaScript = 0; $JSFileName = ""; 548 $JMolScript = "select *; set frank off; wireframe on; spacefill off"; 549 550 PARAMS: { 551 if (@_ == 3) { ($MolString, $CodeBase, $ParamsMapRef) = @_; last PARAMS; } 552 ($MolString, $CodeBase) = @_; 553 } 554 555 if ($ParamsMapRef) { 556 %ParamsMap = %$ParamsMapRef; 557 if (exists $ParamsMap{usejavascript} ) { $JSFileName = $ParamsMap{usejavascript}; $UseJavaScript = 1; $ParamsMap{usejavascript} = ""; } 558 if (exists $ParamsMap{name} ) { $Name = $ParamsMap{name}; $ParamsMap{name} = ""; } 559 if (exists $ParamsMap{code} ) { $Code = $ParamsMap{code}; $ParamsMap{code} = ""; } 560 # if (exists $ParamsMap{archive} ) { $Archive = $ParamsMap{archive}; $ParamsMap{archive} = ""; } 561 if (exists $ParamsMap{archive} ) { $ParamsMap{archive} = ""; } 562 if (exists $ParamsMap{height} ) { $Height = $ParamsMap{height}; $ParamsMap{height} = ""; } 563 if (exists $ParamsMap{width} ) { $Width = $ParamsMap{width}; $ParamsMap{width} = ""; } 564 if (exists $ParamsMap{progressbar} ) { $ProgressBar = $ParamsMap{progressbar}; $ParamsMap{progressbar} = ""; } 565 if (exists $ParamsMap{progresscolor} ) { $ProgressColor = $ParamsMap{progresscolor}; $ParamsMap{progresscolor} = ""; } 566 if (exists $ParamsMap{boxmessage} ) { $BoxMessage = $ParamsMap{boxmessage}; $ParamsMap{boxmessage} = ""; } 567 if (exists $ParamsMap{script} ) { $JMolScript = $ParamsMap{script}; $ParamsMap{script} = ""; } 568 if (exists $ParamsMap{bgcolor}) { 569 $BgColor = $ParamsMap{bgcolor}; 570 if (length($BgColor)) { 571 if ($BgColor =~ /black/i || $BgColor =~ /#000000/ ) { 572 $BoxFgColor = "#ffffff"; 573 $BoxBgColor = "#000000"; 574 } 575 } 576 } 577 if (exists $ParamsMap{boxbgcolor} ) { $BoxBgColor = $ParamsMap{boxbgcolor}; $ParamsMap{boxbgcolor} = ""; } 578 if (exists $ParamsMap{boxfgcolor} ) { $BoxFgColor = $ParamsMap{boxfgcolor}; $ParamsMap{boxfgcolor} = ""; } 579 } 580 581 $MolString =~ s/(\r\n)|(\r)|(\n)/|/g; 582 if ($UseJavaScript) { 583 $JavaScriptTags = qq(\n<script>\n); 584 my($Size) = ($Width > $Height ) ? $Width : $Height; 585 $JavaScriptTags .= qq(var $Name = \n); 586 my(@MolLines) = split /\|/, $MolString; 587 my($LineIndex); 588 $JavaScriptTags .= qq("$MolLines[0]\\n"); 589 for $LineIndex (1 .. $#MolLines) { 590 $JavaScriptTags .= qq( + \n"$MolLines[$LineIndex]\\n"); 591 } 592 $JavaScriptTags .= qq(;\n); 593 $JavaScriptTags .= qq(jmolSetAppletColor("$BgColor", "$BoxBgColor", "$BoxFgColor", "$ProgressColor");\n); 594 # "set frank off turns" off JMol logo. For wireframe display; use wireframe on; spacefill off... 595 # $JavaScriptTags .= qq(jmolAppletInline($Size, $Name);\n); 596 $JavaScriptTags .= qq(jmolAppletInline([$Width,$Height], $Name, \"$JMolScript\");\n); 597 $JavaScriptTags .= qq(</script>\n); 598 $ReturnTags = $JavaScriptTags; 599 } 600 else { 601 # Setup applet header... 602 $AppletTags = qq(\n<applet name="$Name" id="$Name" code="$Code" archive="$Archive" codebase="$CodeBase" width="$Width" height="$Height">\n); 603 604 # Setup molecule data... 605 $AppletTags .= qq(<param name="loadInline" value="$MolString">\n); 606 607 # Setup prograss bar... 608 $AppletTags .= qq(<param name="progressbar" value="$ProgressBar">\n<param name="progresscolor" value="$ProgressColor">\n<param name="boxmessage" value="$BoxMessage">\n<param name="boxbgcolor" value="$BoxBgColor">\n<param name="boxfgcolor" value="$BoxFgColor">\n); 609 610 # "set frank off turns" off JMol logo. For wireframe display; use wireframe on; spacefill off... 611 $AppletTags .= qq(<param name="script" value="$JMolScript">); 612 613 #Setup other parameters... 614 for $ParamName (sort keys %ParamsMap) { 615 $ParamValue = $ParamsMap{$ParamName}; 616 if (length $ParamValue) { 617 $AppletTags .= qq(<param name="$ParamName" value="$ParamValue">\n); 618 } 619 } 620 #Finish it up... 621 $AppletTags .= qq(</applet>\n); 622 $ReturnTags = $AppletTags; 623 } 624 return $ReturnTags; 625 } 626 627 # Setup JME applet... 628 sub SetupStrViewerJMEApplet { 629 my($MolString, $CodeBase, $ParamsMapRef, %ParamsMap, $AppletTags, $Name, $Code, $Archive, $Width, $Height, $ParamName, $ParamValue); 630 my($Options); 631 632 $AppletTags = ""; $ParamsMapRef = ""; %ParamsMap = (); 633 $Name = "JME"; $Code = "JME"; $Archive = "JME.jar"; $Width = $StrViewerWidth; $Height = $StrViewerHeight; 634 $Options = "depict"; 635 636 if (@_ == 3) { 637 ($MolString, $CodeBase, $ParamsMapRef) = @_; 638 } 639 else { 640 ($MolString, $CodeBase) = @_; 641 } 642 $MolString =~ s/(\r\n)|(\r)|(\n)/|/g; 643 644 if ($ParamsMapRef) { 645 %ParamsMap = %$ParamsMapRef; 646 if (exists $ParamsMap{name} ) { $Name = $ParamsMap{name}; $ParamsMap{name} = ""; } 647 if (exists $ParamsMap{code} ) { $Code = $ParamsMap{code}; $ParamsMap{code} = ""; } 648 if (exists $ParamsMap{archive} ) { $Archive = $ParamsMap{archive}; $ParamsMap{archive} = ""; } 649 if (exists $ParamsMap{height} ) { $Height = $ParamsMap{height}; $ParamsMap{height} = ""; } 650 if (exists $ParamsMap{width} ) { $Width = $ParamsMap{width}; $ParamsMap{width} = ""; } 651 if (exists $ParamsMap{options} ) { $Options = $ParamsMap{options}; $ParamsMap{options} = ""; } 652 } 653 654 # Setup applet header... 655 $AppletTags = qq(\n<applet name="$Name" id="$Name" code="$Code" archive="$Archive" codebase="$CodeBase" width="$Width" height="$Height">\n); 656 657 # Setup molecule data... 658 $AppletTags .= qq(<param name="mol" value="$MolString">\n<param name="options" value="$Options">\n); 659 660 #Setup other parameters... 661 for $ParamName (sort keys %ParamsMap) { 662 $ParamValue = $ParamsMap{$ParamName}; 663 if (length $ParamValue) { 664 $AppletTags .= qq(<param name="$ParamName" value="$ParamValue">\n); 665 } 666 } 667 668 #Finish it up... 669 $AppletTags .= qq(</applet>\n); 670 671 return $AppletTags; 672 } 673 674 # Setup MarvinView applet... 675 sub SetupStrViewerMarvinViewApplet { 676 my($MolString, $CodeBase, $ParamsMapRef, %ParamsMap, $AppletTags, $JavaScriptTags, $ReturnTags, $Name, $Code, $Archive, $Width, $Height, $ParamName, $NavMode, $ParamValue, $JSFileName, $UseJavaScript, $MarvinJVM); 677 678 $AppletTags = ""; $JavaScriptTags = ""; $ReturnTags = ""; 679 $ParamsMapRef = ""; %ParamsMap = (); 680 $Name = "MView"; $Code = "MView"; $Archive = "marvin.jar"; $Width = $StrViewerWidth; $Height = $StrViewerHeight; 681 $NavMode = "zoom"; 682 $UseJavaScript = 0; $JSFileName = ""; $MarvinJVM = ""; 683 684 if (@_ == 3) { 685 ($MolString, $CodeBase, $ParamsMapRef) = @_; 686 } 687 else { 688 ($MolString, $CodeBase) = @_; 689 } 690 691 if ($ParamsMapRef) { 692 %ParamsMap = %$ParamsMapRef; 693 if (exists $ParamsMap{usejavascript} ) { $JSFileName = $ParamsMap{usejavascript}; $UseJavaScript = 1; $ParamsMap{usejavascript} = ""; } 694 if (exists $ParamsMap{marvin_jvm} ) { $MarvinJVM = $ParamsMap{marvin_jvm}; $ParamsMap{marvin_jvm} = ""; } 695 if (exists $ParamsMap{name} ) { $Name = $ParamsMap{name}; $ParamsMap{name} = ""; } 696 if (exists $ParamsMap{code} ) { $Code = $ParamsMap{code}; $ParamsMap{code} = ""; } 697 if (exists $ParamsMap{archive} ) { $Archive = $ParamsMap{archive}; $ParamsMap{archive} = ""; } 698 if (exists $ParamsMap{height} ) { $Height = $ParamsMap{height}; $ParamsMap{height} = ""; } 699 if (exists $ParamsMap{width} ) { $Width = $ParamsMap{width}; $ParamsMap{width} = ""; } 700 if (exists $ParamsMap{bgcolor}) { 701 $ParamsMap{background} = "$ParamsMap{bgcolor}"; 702 $ParamsMap{molbg} = "$ParamsMap{bgcolor}"; 703 $ParamsMap{bgcolor} = ""; 704 } 705 if (exists $ParamsMap{navmode}) { 706 $NavMode = $ParamsMap{navmode}; 707 $ParamsMap{navmode} = ""; 708 } 709 } 710 $MolString =~ s/(\r\n)|(\r)|(\n)/\\/g; 711 if ($UseJavaScript) { 712 $JavaScriptTags = qq(\n<script>\n); 713 $JavaScriptTags .= qq(var marvin_name = "$Name";\n); 714 $JavaScriptTags .= qq(var marvin_jvm = "$MarvinJVM";\n); 715 716 $JavaScriptTags .= qq(mview_begin("$CodeBase", $Width, $Height);\n); 717 718 $JavaScriptTags .= qq(var $Name = \n); 719 my(@MolLines) = split /\\/, $MolString; 720 my($LineIndex); 721 $JavaScriptTags .= qq("$MolLines[0]\\n"); 722 for $LineIndex (1 .. $#MolLines) { 723 $JavaScriptTags .= qq( + \n"$MolLines[$LineIndex]\\n"); 724 } 725 $JavaScriptTags .= qq(;\n); 726 $JavaScriptTags .= qq(mview_param("mol", $Name);\n); 727 728 $JavaScriptTags .= qq(mview_param("navmode", "$NavMode");\n); 729 730 for $ParamName (sort keys %ParamsMap) { 731 $ParamValue = $ParamsMap{$ParamName}; 732 if (length $ParamValue) { 733 $JavaScriptTags .= qq(mview_param("$ParamName", "$ParamValue");\n); 734 } 735 } 736 $JavaScriptTags .= qq(mview_end();\n); 737 $JavaScriptTags .= qq(</script>\n); 738 $ReturnTags = $JavaScriptTags; 739 } 740 else { 741 # Setup applet header... 742 $AppletTags = qq(\n<applet name="$Name" id="$Name" code="$Code" archive="$Archive" codebase="$CodeBase" width="$Width" height="$Height">\n); 743 744 # Setup molecule data... 745 $AppletTags .= qq(<param name="mol" value="$MolString">\n); 746 747 $AppletTags .= qq(<param name="navmode" value="$NavMode">\n); 748 749 #Setup other parameters... 750 for $ParamName (sort keys %ParamsMap) { 751 $ParamValue = $ParamsMap{$ParamName}; 752 if (length $ParamValue) { 753 $AppletTags .= qq(<param name="$ParamName" value="$ParamValue">\n); 754 } 755 } 756 $AppletTags .= qq(</applet>\n); 757 $ReturnTags = $AppletTags; 758 } 759 return $ReturnTags; 760 } 761 762 # Setup MDL chime plug-in... 763 sub SetupStrViewerChimePlugIn { 764 my($MolFile, $ParamsMapRef, %ParamsMap, $Width, $Height, $ParamName, $ParamValue, $PlugInTags); 765 my($Display2D); 766 767 $PlugInTags = ""; $ParamsMapRef = ""; %ParamsMap = (); 768 $Width = $StrViewerWidth; $Height = $StrViewerHeight; 769 $Display2D = "true"; 770 771 if (@_ == 2) { 772 ($MolFile, $ParamsMapRef) = @_; 773 } 774 else { 775 ($MolFile) = @_; 776 } 777 778 if ($ParamsMapRef) { 779 %ParamsMap = %$ParamsMapRef; 780 if (exists $ParamsMap{height} ) { $Height = $ParamsMap{height}; $ParamsMap{height} = ""; } 781 if (exists $ParamsMap{width} ) { $Width = $ParamsMap{width}; $ParamsMap{width} = ""; } 782 if (exists $ParamsMap{display2d} ) { $Display2D = $ParamsMap{display2d}; $ParamsMap{display2d} = ""; } 783 } 784 # Start plug-in tag... 785 $PlugInTags = qq(<embed src="$MolFile" width="$Width" height="$Height" display2d="$Display2D"); 786 787 #Setup other parameters... 788 for $ParamName (sort keys %ParamsMap) { 789 $ParamValue = $ParamsMap{$ParamName}; 790 if (length $ParamValue) { 791 $PlugInTags .= qq( $ParamName="$ParamValue"); 792 } 793 } 794 795 # Finish it off... 796 $PlugInTags .= qq( >); 797 798 return $PlugInTags; 799 } 800 801 # Setup Accelrys ViewerActiveX controls... 802 sub SetupStrViewerAccelrysActiveX { 803 my($MolFile, $ParamsMapRef, %ParamsMap, $ActiveXTags, $Name, $Width, $Height, $ParamName, $ParamValue); 804 my($ClassId, $Convert2DTo3D, $Style, $Mouse); 805 806 $ActiveXTags = ""; $ParamsMapRef = ""; %ParamsMap = (); 807 $Name = "ViewerActiveX"; $Width = $StrViewerWidth; $Height = $StrViewerHeight; 808 $ClassId = "clsid:90690CB6-BC07-11D4-AEF7-0050DA948176"; 809 $Convert2DTo3D = "0"; 810 $Mouse = 4; 811 812 if (@_ == 2) { 813 ($MolFile, $ParamsMapRef) = @_; 814 } 815 else { 816 ($MolFile) = @_; 817 } 818 819 if ($ParamsMapRef) { 820 %ParamsMap = %$ParamsMapRef; 821 if (exists $ParamsMap{classid} ) { $ClassId = $ParamsMap{classid}; $ParamsMap{classid} = ""; } 822 if (exists $ParamsMap{name} ) { $Name = $ParamsMap{name}; $ParamsMap{name} = ""; } 823 if (exists $ParamsMap{height} ) { $Height = $ParamsMap{height}; $ParamsMap{height} = ""; } 824 if (exists $ParamsMap{width} ) { $Width = $ParamsMap{width}; $ParamsMap{width} = ""; } 825 if (exists $ParamsMap{Convert2Dto3D} ) { $Convert2DTo3D = $ParamsMap{Convert2Dto3D}; $ParamsMap{Convert2Dto3D} = ""; } 826 if (exists $ParamsMap{Mouse} ) { $Mouse = $ParamsMap{Mouse}; $ParamsMap{Mouse} = ""; } 827 if (exists $ParamsMap{bgcolor} ) { 828 my($BgColor) = $ParamsMap{bgcolor}; 829 $ParamsMap{bgcolor} = ""; 830 # Get OLE color value: &aabbggrr& 831 # Set it to white for now... 832 $BgColor = "16777215"; 833 $ParamsMap{BackColor} = "$BgColor"; 834 } 835 } 836 $Style = qq(style="height: ) . $Height . qq(px; width: ) . $Width . qq(px"); 837 838 # Setup object header... 839 $ActiveXTags = qq(\n<object id="$Name" classid="$ClassId" $Style>\n); 840 841 # Setup molecule data... 842 $ActiveXTags .= qq(<param name="Source" value="$MolFile">\n<param name="Mouse" value="$Mouse">\n<param name="Convert2Dto3D" value="$Convert2DTo3D">\n); 843 844 #Setup other parameters... 845 for $ParamName (sort keys %ParamsMap) { 846 $ParamValue = $ParamsMap{$ParamName}; 847 if (length $ParamValue) { 848 $ActiveXTags .= qq(<param name="$ParamName" value="$ParamValue">\n); 849 } 850 } 851 852 # Finish it off... 853 $ActiveXTags .= qq(</object>\n); 854 855 return $ActiveXTags; 856 } 857 858 # Setup Chem3D ActiveX 8.0 control... 859 sub SetupStrViewerChem3DActiveX { 860 my($MolFile, $ParamsMapRef, %ParamsMap, $ActiveXTags, $JavaScriptTags, $ReturnTags, $Name, $Width, $Height, $ParamName, $ParamValue); 861 my($ClassId, $Style, $DisplayType, $RotationBars, $MovieController, $JSFileName, $UseJavaScript); 862 863 $ActiveXTags = ""; $JavaScriptTags = ""; $ReturnTags = ""; 864 $ParamsMapRef = ""; %ParamsMap = (); 865 $Name = "Chem3D"; $Width = $StrViewerWidth; $Height = $StrViewerHeight; 866 $ClassId = "clsid:B7A6B8E4-3E8B-4D18-8F8F-B4057EFC784B"; 867 $DisplayType = "Ball&Stick"; 868 $RotationBars = "false"; 869 $MovieController = "false"; 870 871 if (@_ == 2) { 872 ($MolFile, $ParamsMapRef) = @_; 873 } 874 else { 875 ($MolFile) = @_; 876 } 877 878 if ($ParamsMapRef) { 879 %ParamsMap = %$ParamsMapRef; 880 if (exists $ParamsMap{usejavascript} ) { $JSFileName = $ParamsMap{usejavascript}; $UseJavaScript = 1; $ParamsMap{usejavascript} = ""; } 881 if (exists $ParamsMap{classid} ) { $ClassId = $ParamsMap{classid}; $ParamsMap{classid} = ""; } 882 if (exists $ParamsMap{name} ) { $Name = $ParamsMap{name}; $ParamsMap{name} = ""; } 883 if (exists $ParamsMap{height} ) { $Height = $ParamsMap{height}; $ParamsMap{height} = ""; } 884 if (exists $ParamsMap{width} ) { $Width = $ParamsMap{width}; $ParamsMap{width} = ""; } 885 if (exists $ParamsMap{displaytype} ) { $DisplayType = $ParamsMap{displaytype}; $ParamsMap{displaytype} = ""; } 886 if (exists $ParamsMap{rotationbars} ) { $RotationBars = $ParamsMap{rotationbars}; $ParamsMap{rotationbars} = ""; } 887 if (exists $ParamsMap{moviecontroller} ) { $MovieController = $ParamsMap{moviecontroller}; $ParamsMap{moviecontroller} = ""; } 888 } 889 $Style = qq(style="height: ) . $Height . qq(px; width: ) . $Width . qq(px"); 890 891 if ($UseJavaScript) { 892 #Setup parameters... 893 my($Params) = ""; 894 for $ParamName (sort keys %ParamsMap) { 895 $ParamValue = $ParamsMap{$ParamName}; 896 if (length $ParamValue) { 897 $Params .= qq( $ParamName='$ParamValue'); 898 } 899 } 900 $JavaScriptTags = qq(\n<script>\n); 901 $JavaScriptTags .= qq(c3d_insert3dStr("name='$Name' src='$MolFile' width='$Width' height='$Height' displaytype='$DisplayType' rotation_bars_visible='$RotationBars' movie_controller_visible='$MovieController' $Params");\n); 902 $JavaScriptTags .= qq(</script>\n); 903 $ReturnTags = $JavaScriptTags; 904 } 905 else { 906 # Setup object header... 907 $ActiveXTags = qq(\n<object id="$Name" classid="$ClassId" $Style>\n); 908 909 # Setup molecule data... 910 $ActiveXTags .= qq(<param name="src" value="$MolFile">\n<param name="displaytype" value="$DisplayType">\n<param name="rotationbars" value="$RotationBars">\n<param name="moviecontroller" value="$MovieController">\n); 911 912 #Setup other parameters... 913 for $ParamName (sort keys %ParamsMap) { 914 $ParamValue = $ParamsMap{$ParamName}; 915 if (length $ParamValue) { 916 $ActiveXTags .= qq(<param name="$ParamName" value="$ParamValue">\n); 917 } 918 } 919 $ActiveXTags .= qq(</object>\n); 920 $ReturnTags = $ActiveXTags; 921 } 922 return $ReturnTags; 923 } 924 925 # Setup ChemDraw ActiveX 8.0 control... 926 # Problems: "bgcolor" parameter doesn't work. 927 sub SetupStrViewerChemDrawActiveX { 928 my($MolFile, $ParamsMapRef, %ParamsMap, $ActiveXTags, $JavaScriptTags, $ReturnTags, $Name, $Width, $Height, $ParamName, $ParamValue); 929 my($ClassId, $Style, $ViewOnly, $ShrinkToFit, $ShowToolsWhenVisible, $JSFileName, $UseJavaScript); 930 931 $ActiveXTags = ""; $JavaScriptTags = ""; $ReturnTags = ""; 932 $ParamsMapRef = ""; %ParamsMap = (); 933 $Name = "ChemDraw"; $Width = $StrViewerWidth; $Height = $StrViewerHeight; 934 $ClassId = "clsid:51A649C4-3E3D-4557-9BD8-B14C0AD44B0C"; 935 $ViewOnly = "1"; $JavaScriptTags = ""; 936 $ShrinkToFit = "1"; 937 $ShowToolsWhenVisible = "1"; 938 939 if (@_ == 2) { 940 ($MolFile, $ParamsMapRef) = @_; 941 } 942 else { 943 ($MolFile) = @_; 944 } 945 946 if ($ParamsMapRef) { 947 %ParamsMap = %$ParamsMapRef; 948 if (exists $ParamsMap{usejavascript} ) { $JSFileName = $ParamsMap{usejavascript}; $UseJavaScript = 1; $ParamsMap{usejavascript} = ""; } 949 if (exists $ParamsMap{classid} ) { $ClassId = $ParamsMap{classid}; $ParamsMap{classid} = ""; } 950 if (exists $ParamsMap{name} ) { $Name = $ParamsMap{name}; $ParamsMap{name} = ""; } 951 if (exists $ParamsMap{height} ) { $Height = $ParamsMap{height}; $ParamsMap{height} = ""; } 952 if (exists $ParamsMap{width} ) { $Width = $ParamsMap{width}; $ParamsMap{width} = ""; } 953 if (exists $ParamsMap{ViewOnly} ) { $ViewOnly = $ParamsMap{ViewOnly}; $ParamsMap{ViewOnly} = ""; } 954 if (exists $ParamsMap{ShrinkToFit} ) { $ShrinkToFit = $ParamsMap{ShrinkToFit}; $ParamsMap{ShrinkToFit} = ""; } 955 if (exists $ParamsMap{ShowToolsWhenVisible} ) { $ShowToolsWhenVisible = $ParamsMap{ShowToolsWhenVisible}; $ParamsMap{ShowToolsWhenVisible} = ""; } 956 } 957 if ($UseJavaScript) { 958 #Setup parameter... 959 my($Params) = ""; 960 for $ParamName (sort keys %ParamsMap) { 961 $ParamValue = $ParamsMap{$ParamName}; 962 if (length $ParamValue) { 963 $Params .= qq( $ParamName='$ParamValue'); 964 } 965 } 966 $JavaScriptTags = qq(\n<script>\n); 967 $JavaScriptTags .= qq(cd_insertObjectStr("name='$Name' src='$MolFile' width='$Width' height='$Height' shrinktofit='$ShrinkToFit' viewonly='$ViewOnly' $Params");\n); 968 $JavaScriptTags .= qq(</script>\n); 969 $ReturnTags = $JavaScriptTags; 970 } 971 else { 972 $Style = qq(style="height: ) . $Height . qq(px; width: ) . $Width . qq(px"); 973 974 # Setup object header... 975 $ActiveXTags = qq(\n<object id="$Name" classid="$ClassId" $Style>\n); 976 977 # Setup molecule data... 978 $ActiveXTags .= qq(<param name="SourceURL" value="$MolFile">\n<param name="ShrinkToFit" value="$ShrinkToFit">\n<param name="ViewOnly" value="$ViewOnly">\n<param name="ShowToolsWhenVisible" value="$ShowToolsWhenVisible">\n); 979 980 #Setup other parameters... 981 for $ParamName (sort keys %ParamsMap) { 982 $ParamValue = $ParamsMap{$ParamName}; 983 if (length $ParamValue) { 984 $ActiveXTags .= qq(<param name="$ParamName" value="$ParamValue">\n); 985 } 986 } 987 $ActiveXTags .= qq(</object>\n); 988 $ReturnTags = $ActiveXTags; 989 } 990 return $ReturnTags; 991 } 992 993 # Setup ChemDraw plug-in used for Netscape browsers... 994 # Problems: "bgcolor" parameter doesn't work. 995 sub SetupStrViewerChemDrawPlugIn { 996 my($MolFile, $Name, $ParamsMapRef, %ParamsMap, $Width, $Height, $ParamName, $ParamValue, $PlugInTags, $JavaScriptTags, $ReturnTags,); 997 my($MimeType, $ViewOnly, $ShrinkToFit, $ShowToolsWhenVisible, $JSFileName, $UseJavaScript); 998 999 $Name = "ChemDraw"; $PlugInTags = ""; $ParamsMapRef = ""; %ParamsMap = (); 1000 $Width = $StrViewerWidth; $Height = $StrViewerHeight; 1001 $MimeType = "chemical/x-mdl-molfile"; 1002 $ViewOnly = "1"; 1003 $ShrinkToFit = "1"; 1004 $ShowToolsWhenVisible = "1"; $JavaScriptTags = ""; 1005 1006 if (@_ == 2) { 1007 ($MolFile, $ParamsMapRef) = @_; 1008 } 1009 else { 1010 ($MolFile) = @_; 1011 } 1012 1013 if ($ParamsMapRef) { 1014 %ParamsMap = %$ParamsMapRef; 1015 if (exists $ParamsMap{usejavascript} ) { $JSFileName = $ParamsMap{usejavascript}; $UseJavaScript = 1; $ParamsMap{usejavascript} = ""; } 1016 if (exists $ParamsMap{height} ) { $Height = $ParamsMap{height}; $ParamsMap{height} = ""; } 1017 if (exists $ParamsMap{width} ) { $Width = $ParamsMap{width}; $ParamsMap{width} = ""; } 1018 if (exists $ParamsMap{type} ) { $MimeType = $ParamsMap{type}; $ParamsMap{type} = ""; } 1019 if (exists $ParamsMap{viewonly} ) { $ViewOnly = $ParamsMap{viewonly}; $ParamsMap{viewonly} = ""; } 1020 if (exists $ParamsMap{shrinktofit} ) { $ShrinkToFit = $ParamsMap{shrinktofit}; $ParamsMap{shrinktofit} = ""; } 1021 if (exists $ParamsMap{showtoolswhenvisible} ) { $ShowToolsWhenVisible = $ParamsMap{showtoolswhenvisible}; $ParamsMap{showtoolswhenvisible} = ""; } 1022 } 1023 if ($UseJavaScript) { 1024 $JavaScriptTags = qq(\n<script>\n); 1025 $JavaScriptTags .= qq(cd_insertObjectStr("name='$Name' src='$MolFile' type='$MimeType' width='$Width' height='$Height' shrinktofit='$ShrinkToFit' viewonly='$ViewOnly'");\n); 1026 $JavaScriptTags .= qq(</script>\n); 1027 $ReturnTags = $JavaScriptTags; 1028 } 1029 else { 1030 # Start plug-in tag... 1031 $PlugInTags = qq(<embed src="$MolFile" width="$Width" height="$Height" type="$MimeType" viewonly="$ViewOnly" shrinktofit="$ShrinkToFit" showtoolswhenvisible=''$ShowToolsWhenVisible"); 1032 1033 #Setup other parameters... 1034 for $ParamName (sort keys %ParamsMap) { 1035 $ParamValue = $ParamsMap{$ParamName}; 1036 if (length $ParamValue) { 1037 $PlugInTags .= qq(" $ParamName"="$ParamValue"); 1038 } 1039 } 1040 # Finish it off... 1041 $PlugInTags .= qq( >); 1042 $ReturnTags = $PlugInTags; 1043 } 1044 1045 return $ReturnTags; 1046 } 1047 1048