<?php
/**
 * flowplay2: embeds a video stream player flash applet into your page
 *
 * This is mostly based on the flowplay-plugin by Dave Kliczbor et al.
 *
 * Syntax:
 *   Please look at the README
 *
 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
 * @version    0.3
 * @author     bSpot <blind@bspot.de>
 */
 
if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/');
if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
define('PLUGIN_FLOW', DOKU_BASE.'lib/plugins/flowplay2/flowplayer/');
require_once(DOKU_PLUGIN.'syntax.php');
 
if (!function_exists('hsc')) 
{
	function hsc($string){ return htmlspecialchars($string, ENT_QUOTES, 'UTF-8'); }
}
 
class syntax_plugin_flowplay2 extends DokuWiki_Syntax_Plugin 
{
 
	function getInfo()
	{
		return array (
			'author' => 'bSpot',
			'email'  => 'blind@bspot.de',
			'date'   => '2008-04-16',
			'version'=> '0.3',
			'name'   => 'flowplay2',
			'desc'   => 'Embeds a video stream player flash applet into your page',
			'url'    => 'http://wiki.splitbrain.org/plugin:flowplay2',
			'ack'    => 'This is mostly based on the flowplay-plugin by Dave Kliczbor et al.',
		);
	}

	function getType() { return 'protected';}
	function getAllowedTypes() { return array('container','substition','protected','disabled','formatting','paragraphs'); }
	function getPType() { return 'normal';}

	
	function getSort()
	{
		return 191;
	}
	
	function connectTo($mode) 
	{ 
		// pattern for the flashplayer
		$this->Lexer->addSpecialPattern('{{flowplay>.*?}}', $mode, 'plugin_flowplay2');
		// entry pattern for playlist-items
		$this->Lexer->addEntryPattern('\[\[flowplay>[^|]*\|',$mode,'plugin_flowplay2');
	}
	
	function postConnect()
	{
		// exit pattern for playlist-items
		$this->Lexer->addExitPattern('\]\]','plugin_flowplay2'); 
	}
 
	function handle($match, $state, $pos, &$handler)
	{
		$m = array();
		
		switch ($state) 
		{
			// player
			case DOKU_LEXER_SPECIAL:
				list($url, $paramStr) = explode('?', substr($match, strlen('{{flowplay>'), -2), 2);
				// prepare parameter list
				foreach (explode(" ", $paramStr) as $param)
				{
					// width/height parameter
					if ( preg_match('/(\d+)x(\d+)/', $param, $m) )
					{
						$params['width'] = $m[1];
						$params['height'] = $m[2];
					}
					// non-boolean parameter
					else if ( preg_match('/([^:]+):(.*)$/', $param, $m) )
						$params[$m[1]] = $m[2];
					// boolean parameter set to false
					else if (substr($param, 0, 2) == "no")
						$params[strtolower(substr($param, 2, 1)) . substr($param, 3)] = False;
					// boolean parameter set to true
					else
						$params[$param] = True;
				}
			
				return array('type' => 'player', 'url' => $url, 'paramStr' => $paramStr, 'params' => $params);
			
			// playlist
			case DOKU_LEXER_ENTER:
				$url = substr($match, strlen('[[flowplay>'), -1);
				return array('type' => 'playlist_open', 'url' => $url);

			case DOKU_LEXER_MATCHED:
				return array('type' => 'data', 'match' => $match);

			case DOKU_LEXER_UNMATCHED:
				return array('type' => 'data', 'match' => $match);

			case DOKU_LEXER_EXIT:
				return array('type' => 'playlist_close', 'match' => $match);
        	}
		return false;
	}

	function render($mode, &$renderer, $indata) 
	{
		if($mode == 'xhtml')
		{
			switch ($indata['type']) 
			{
				// player
				case 'player' :   
					/*
					// DISABLED DEBUG OUTPUT
					$renderer->doc .= "<ul>";
					$renderer->doc .= "<b>url => " . $indata['url'] . " (" . ml($indata['url']) . ")</b>";
					foreach ($indata['params'] as $k => $v)
						$renderer->doc .= "<li>" . $k . " => " . $v. "</li>";
					$renderer->doc .= "</ul>";*/
					
					$renderer->doc .= $this->_renderPlayer($indata);
					break;
				
				// playlist
				case 'playlist_open' :
					$renderer->doc .= "<a href='" . ml($indata["url"]) . "' class='flowplayitem'>";
					break;
				
				case 'data':
					$renderer->doc .= $renderer->_xmlEntities($indata['match']); 
					break;
				
				case 'playlist_close' : 
					$renderer->doc .= "</a>";
					break;
			}
			
			return true;
		}
		return false;
	}
	
	function _renderPlayer($indata)
	{
		// determine player url
		if( strlen($this->getConf('player_base_url')) > 0 ) 
			$prefix = $this->getConf('player_base_url');
		else 
			$prefix = PLUGIN_FLOW;
		if( $prefix{strlen($prefix)-1} !== '/' ) $prefix .= '/';	
		
		$params = $indata["params"];
		
		// embed javascript
		$r = '<script language="javascript" src="' . $prefix . 'html/flashembed.min.js"></script>';
		$r .= '<script language="javascript" src="' . $prefix . '../playlist.js"></script>';
		
		// player configuration
		$r .= 	"<script language='javascript'>" . DOKU_LF .
			"var playerConfig =   " . DOKU_LF .
			"{   " . DOKU_LF .
			"	controlBarBackgroundColor: '0x99cddc',   " . DOKU_LF;
			
		// add params
		foreach ($indata['params'] as $k => $v)
			$r .= $k . ": " . ($v === True ? "true" : ($v === False ? "false" : "'" . $v . "'")) . ",";	
		
		// run player on startup if a url is given
		if ($indata["url"] != "")
			$r .= "videoFile: '" . ml($indata["url"]) . "'";
		
		$r .= 	"}   " . DOKU_LF;
			
		// EMBED configuration
		$r .= "var embedConfig =   " . DOKU_LF .
			"{   " . DOKU_LF .
			($params["width"] ? "width: " . $params["width"] . ",   " . DOKU_LF : "") . 
			($params["height"] ? "height: " . $params["height"] . ",   " . DOKU_LF : "") . 
			"	src:'" . $prefix . $this->getConf('player_swf') . "',   " . DOKU_LF .
			"	bgcolor:'#6F7485'   " . DOKU_LF .
			"}   " . DOKU_LF . 
			"</script>" . DOKU_LF;
		
		// add the player-div
		$r .= "<div id='flowplayer'></div>";
		
		return $r;
	}
}
 
?>