<?php
/**
 * DokuWiki Plugin ryubin (Syntax Component)
 *
 * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
 * @author  Robert Kormann <ryubin@kormann.info>
 */

// must be run within Dokuwiki
if (!defined('DOKU_INC')) die();

if (!defined('DOKU_LF')) define('DOKU_LF', "\n");
if (!defined('DOKU_TAB')) define('DOKU_TAB', "\t");
if (!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');

require_once DOKU_PLUGIN.'syntax.php';

class syntax_plugin_ryubin_ryubin extends DokuWiki_Syntax_Plugin {
    public function getType() {
        return 'substition';
    }

    public function getPType() {
        return 'block';
    }

    public function getSort() {
        return 316;
    }

    public function connectTo($mode) {
        $this->Lexer->addSpecialPattern('\{\{ryubin>[^}]*\}\}',$mode,'plugin_ryubin_ryubin');
    }

    public function handle($match, $state, $pos, &$handler){
        global $conf;
        $data = array();

        $match = substr($match,9,-2);

        // extract image or xml path and parameters
        list($img,$params) = explode('&',$match,2);
        $img = trim($img);
        $data['id'] = substr(md5($img),0,8);
        $data['mime'] = strtolower(explode('.',$img));
        $data['img_path'] = $conf['basedir']."_media/".$img;

        // default values for the parameters
        $primary_xml               = 'ryubin.xml'; if (is_file(DOKU_PLUGIN."ryubin/".$this->getconf('primary_xml'))) $primary_xml = $this->getConf('primary_xml');
        $data['playmode']          = $this->getConf('playmode');
        $data['fov']               = $this->getConf('fov');
        $data['yaw']               = $this->getConf('yaw');
        $data['pitch']             = $this->getConf('pitch');
        $data['view_mode']         = intval($this->getConf('view_mode'));
        $data['hv_ratio']          = $this->getConf('hv_ratio');
        $data['lock_nadirs']       = 'no'; if ($this->getConf('lock_nadirs')) $data['lock_nadirs'] = 'yes';
        $data['lock_vertical']     = 'no'; if ($this->getConf('lock_vertical')) $data['lock_vertical'] = 'yes';
        $data['lock_fov']          = 'no'; if ($this->getConf('lock_fov')) $data['lock_fov'] = 'yes';
        $data['limit_vertical']    = 'no'; if ($this->getConf('limit_vertical')) $data['limit_vertical'] = 'yes';
        $data['top_limit']         = $this->getConf('top_limit');
        $data['bottom_limit']      = $this->getConf('bottom_limit');
        $data['limit_horizontal']  = 'no'; if ($this->getConf('limit_horizontal')) $data['limit_horizontal'] = 'yes';
        $data['right_limit']       = $this->getConf('right_limit');
        $data['left_limit']        = $this->getConf('left_limit');
        $data['proj_implicit']     = 'no'; if ($this->getConf('proj_implicit')) $data['proj_implicit'] = 'yes';
        $data['elevation']         = $this->getConf('elevation');
        $data['depression']        = $this->getConf('depression');
        $data['proj_type']         = intval($this->getConf('proj_type'));
        $data['adminMode']         = 'no'; if ($this->getConf('adminMode')) $data['adminMode'] = 'yes';
        $data['width']             = $this->getConf('width');
        $data['height']            = $this->getConf('height');
        $data['bgcolor']           = $this->getConf('bgcolor');
        $data['xml_path']          = $conf['basedir']."lib/plugins/ryubin/".$primary_xml;
        $data['smooth']            = 'no'; if ($this->getConf('smooth')) $data['smooth'] = 'yes';
        $data['disable_wheel']     = 'no'; if ($this->getConf('disable_wheel')) $data['disable_wheel'] = 'yes';
        $data['allowFullScreen']   = 'false'; if ($this->getConf('allowFullScreen')) $data['allowFullScreen'] = 'true';
        $data['allowScriptAccess'] = $this->getConf('allowScriptAccess');

        // implement parameters from markup
        $params = explode('&',$params);
        foreach ($params as $param) {
            list($xml,$value)=explode('=',$param,2);
            $xml = trim($xml);
            switch ($xml) {
                case 'playmode':
                    $modes = array('cube3x2','cube2x3','cube6','cube24','cylinder','doughnut','dualfisheye','fish2rect','fisheye','flat','simpleflat','sphere','sphere8','verticalfish2rect','verticalfisheye');
                    foreach ($modes as $mode) {
                        if ($value == $mode) $data['playmode'] = $value;
                    }
                    break;
                case 'fov':               $value = intval($value); if ($value > 19 && $value < 131) $data['fov'] = $value; break;
                case 'yaw':               $value = intval($value); if ($value > -181 && $value < 181) $data['yaw'] = $value; break;
                case 'pitch':             $value = intval($value); if ($value > -181 && $value < 181) $data['pitch'] = $value; break;
                case 'view_mode':         $value = intval($value); if ($value > 0 && $value < 4) $data['view_mode'] = $value; break;
                case 'hv_ratio':          if (is_numeric($value) && $value >= 0.1 && $value <= 10.0) $data['hv_ratio'] = $value; break;
                case 'lock_nadirs':       if ($value == 'yes') $data['lock_nadirs'] = $value; break;
                case 'lock_vertical':     if ($value == 'yes') $data['lock_vertical'] = $value; break;
                case 'lock_fov':          if ($value == 'yes') $data['lock_fov'] = $value; break;
                case 'limit_vertical':    if ($value == 'yes') $data['limit_vertical'] = $value; break;
                case 'top_limit':         $value = intval($value); if ($value > 9 && $value < 91) $data['top_limit'] = $value; break;
                case 'bottom_limit':      $value = intval($value); if ($value > 9 && $value < 91) $data['bottom_limit'] = $value; break;
                case 'limit_horizontal':  if ($value == 'yes') $data['limit_horizontal'] = $value; break;
                case 'right_limit':       $value = intval($value); if ($value > 9 && $value < 91) $data['right_limit'] = $value; break;
                case 'left_limit':        $value = intval($value); if ($value > 9 && $value < 91) $data['left_limit'] = $value; break;
                case 'proj_implicit':     if ($value == 'no') $data['proj_implicit'] = $value; break;
                case 'elevation':         $value = intval($value); if ($value > 0 && $value < 91) $data['elevation'] = $value; break;
                case 'depression':        $value = intval($value); if ($value > 0 && $value < 91) $data['depression'] = $value; break;
                case 'proj_type':         $value = intval($value); if ($value == 2) $data['proj_type'] = $value; break;
            }
            if ($data['adminMode']) {
                if ($data['mime'] == 'xml') $data['xml_path'] = $conf['basedir']."_media/".$img;
                switch ($xml) {
                    case 'width':             $value = intval($value); if ($value > 319 && $value < 1921) $data['width'] = $value; break;
                    case 'height':            $value = intval($value); if ($value > 239 && $value < 1081) $data['height'] = $value; break;
                    case 'bgcolor':           if (preg_match("^\#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$",$value)) $data['bgcolor'] = $value; break; //TODO reason for preg_match warning?
                    case 'smooth':            if ($value == 'yes') $data['smooth'] = $value; break;
                    case 'disable_wheel':     if ($value == 'yes') $data['disable_wheel'] = $value; break;
                    case 'allowFullScreen':   if ($value == 'true') $data['allowFullScreen'] = $value; break;
                    case 'allowScriptAccess': if ($value == 'sameDomain') $data['allowFullScreen'] = $value;
                                              if ($value == 'always') $data['allowFullScreen'] = $value; break;
                }
            }
        }

        // check markup parameters for consistency
        // TODO

        return $data;
    }

    public function render($mode, &$renderer, $data) {
        global $conf;
        if($mode != 'xhtml') return false;

        $doc = "\n<div class=\"ryubin\" id=\"".$data['id']."\">\n  <script type=\"text/javascript\">\n";
        $doc .= "    AC_FL_RunContent(\n    'codebase', 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0',\n    'pluginspage', 'http://www.macromedia.com/go/getflashplayer',\n";
        $doc .= "    'width', '".$data['width']."',\n";
        $doc .= "    'height', '".$data['height']."',\n";
        $doc .= "    'bgcolor', '".$data['bgcolor']."',\n";
        $doc .= "    'id','".$data['id']."',\n";
        $doc .= "    'movie', '".$conf['basedir']."lib/plugins/ryubin/ryubin/swf/RyubinPanoPlayer5',\n";

        // FlashVars
        $doc .= "    'FlashVars','";
        $doc .= "playmode=".$renderer->_xmlEntities($data['playmode']);
        $doc .= "&internal_ctrl=no";
        $doc .= "&xml_path=".$renderer->_xmlEntities($data['xml_path']);
        if ($data['mime'] != 'xml')  $doc .= "&img_path=".$renderer->_xmlEntities($data['img_path']);
        if ($data['fov'] != 60) $doc .= "&fov=".$data['fov'];
        if ($data['yaw'] != 0) $doc .= "&yaw=".$data['yaw'];
        if ($data['pitch'] != 0) $doc .= "&pitch=".$data['pitch'];
        if ($data['view_mode'] != 1) $doc .= "&view_mode=".$data['view_mode'];
        if ($data['hv_ratio'] != 2.0) $doc .= "&hv_ratio=".$data['hv_ratio'];
        if ($data['smooth'] == 'yes') $doc .= "&smooth=".$data['smooth'];
        if ($data['lock_nadirs'] == 'yes') $doc .= "&lock_nadirs=".$data['lock_nadirs'];
        if ($data['lock_vertical'] == 'yes') $doc .= "&lock_vertical=".$data['lock_vertical'];
        if ($data['lock_fov'] == 'yes') $doc .= "&lock_fov=".$data['lock_fov'];
        if ($data['limit_vertical'] == 'yes') $doc .= "&limit_vertical=".$data['limit_vertical']."&top_limit=".$data['top_limit']."&bottom_limit=".$data['bottom_limit'];
        if ($data['limit_horizontal'] == 'yes') $doc .= "&limit_horizontal=".$data['limit_horizontal']."&right_limit=".$data['right_limit']."&left_limit=".$data['left_limit'];
        if ($data['proj_implicit'] == 'no') $doc .= "&proj_implicit=".$data['proj_implicit']."&elevation=".$data['elevation']."&depression=".$data['depression'];
        if ($data['proj_type'] == 2) $doc .= "&proj_type=".$data['proj_type'];
        if ($data['disable_wheel'] == 'yes') $doc .= "&disable_wheel=".$data['disable_wheel'];
        $doc .= "',\n";

        if ($data['allowFullScreen'] == 'true') $doc .= "    'allowFullScreen','true',\n";
        $doc .= "    'allowScriptAccess','".$data['allowScriptAccess']."'\n    );\n";
        $doc .= "  </script>\n</div>\n\n";

        $renderer->doc .= $doc;

        return true;
    }
}
