<?php
/**
  * JMol2-Plugin: Parses jmol file blocks
  *
  * @license  GPL 2 (http://www.gnu.org/licenses/gpl.html)
  * @author  Luigi Micco
  * @version  1.0
  */
if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/');
  require_once(DOKU_INC.'inc/init.php');
if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
  require_once(DOKU_PLUGIN.'syntax.php');
class syntax_plugin_jmol2 extends DokuWiki_Syntax_Plugin {
  var $jmolDir = '';
  var $jmolJS  = '';
//  var $pdbdir = '';
  
  // Constructor
  function syntax_plugin_jmol2(){
    $sl = (substr(DOKU_BASE,-1)!='/')?'/':'';    
    $this->jmolDir = DOKU_BASE.$sl.'lib/plugins/jmol2/jmol/';
    $this->jmolJS  = $this->jmolDir.'Jmol.js';
  }
  function getInfo(){
    return array(
     'author' => 'Luigi Micco',
     'email'  => 'l.micco@tiscali.it',
     'date'   => '2010-02-15',
     'name'   => 'Jmol2 Plugin',
     'desc'   => 'Parses jmol-blocks
                  <jmol (FILENAME) (WIDTH) (HEIGHT) (BACKGROUND)>... script ...</jmol>',
     'url'  => 'http://www.bitlibero.com/dokuwiki/jmol2.zip',);
  }
  
  function getType(){  return 'protected';  }
  function getSort(){  return 815;  }
  function connectTo($mode){
    $this->Lexer->addEntryPattern('<jmol.*?>(?=.*?</jmol>)',$mode,'plugin_jmol2');
  }
  function postConnect(){
    $this->Lexer->addExitPattern('</jmol>','plugin_jmol2');
  }

  // Handling lexer
  function handle($match, $state, $pos) {
    switch ($state){
      case DOKU_LEXER_ENTER :
        list($pdbname,$width,$height,$background) = explode(" ", substr($match, 2+4, -1));
        return array($state, array($pdbname,$width,$height,$background));
      case DOKU_LEXER_UNMATCHED :
        return array($state, $match);
      case DOKU_LEXER_EXIT :
        return array($state, '');
    }
    return array();
  }
/**
  * Render Jmol applet
  */
  function render($mode, &$renderer, $data){
    if($mode != 'xhtml')
      return false;
    global $conf;
    @list($state, $match) = $data;
    
    switch ($state){
      case DOKU_LEXER_ENTER :
        list($pdbname,$width,$height,$background) = $match;

        if (!empty($pdbname)) {
          $width  = empty($width)?300:urlencode($width);
          $height = empty($height)?$width:urlencode($height);
          $background = empty($background)?"#ffffff":$background;

          $pdbname = preg_replace("/{{([^|}]+).*}}/","$1",$pdbname);
          if ($pdbname != ".") {    
            $pdbFileLink = ml($pdbname);          
          }  

          $renderer->doc .= '<form><script type="text/javascript" src="'.$this->jmolJS.'"></script>';
          $renderer->doc .= '<script>jmolInitialize(" '.$this->jmolDir .'",false);';
          $renderer->doc .= 'jmolSetAppletColor("'.$background.'");';
          $renderer->doc .= 'jmolApplet(['.$width.','.$height.']';
          if (!empty($pdbFileLink)) $renderer->doc .= ',"load '.$pdbFileLink.'"';
          $renderer->doc .= ');';
        } else {
          $renderer->doc .= '<form><script>';
        }        
        break;
      case DOKU_LEXER_UNMATCHED :
        $temp = $data[1];
        $items = explode("}}", $data[1]);
        for ($i = 0; $i < count($items); $i++) {
          $pdbname = "";
          if (stristr($items[$i], "load {{")) {
            $pdbname = ereg_replace(".*\load \{\{", "", $items[$i]);
            $pdbname = ereg_replace("\}\}.*", "", $pdbname);
            if ($pdbname != "") {
              $temp = str_replace("load {{" . $pdbname . "}}", "load ".ml($pdbname), $temp);
            }
          }
        }  
         
        $renderer->doc .= $temp; 
        break;
      case DOKU_LEXER_EXIT :
        $renderer->doc .= '</script></form>';
        break;
      }
   }
}
?>