<?php
if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../../').'/');
if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
require_once(DOKU_PLUGIN.'syntax.php');

class syntax_plugin_zul_zirkelundlineal extends DokuWiki_Syntax_Plugin {
	/*
   <applet
       code="rene.zirkel.ZirkelApplet.class"
       archive="zirkel.jar"
       width="551" height="359">
       <param name="file" value="einheitsvektor.zir">
   </applet>
*/

  var $dflt = array(
  'name' => '',             // Name der Konstruktionsdatei
  'width' => 551,
  'height' => 359,
  'demo' => '',#true', // Selbstablaufende Demo (siehe unten)
  'edit' => '',#false', Damit werden auch eingebettete Stile edierbar
  
	'style' => '',            // Applet-Stil ("plain", "full", "3D", "nonvisual", "icons", "breaks")
	'editdigits' => '',       //Nachkommastellen in Dialogen
	'displaydigits' => '',    // Nachkommastellen in Größenanzeigen
	'angledigits' => '',      // Nachkommastellen bei Winkeln
	'movefixname' => 'false', // Zeige Namen von fixen Objekten
	'grid' => '',             // Gitterstil ("none","coordinates","normal")
	'font' => '',             // Kann "bold" und "large" enthalten
	'color' => '255 255 255', // Setzt die Hintergrundfarbe für das Applet in der Form "255,255,255" oder "#FFFFFF".
	'colorbackground' => '',  // Setzt die Hintergrundfarbe für Dialoge etc.
	'colorselect' => '',      // Farbe für selektierte Objekte
	'colortarget' => '',      // Farbe für Zielobjekte
//	'colornochecktarget' => '',
	
	'tools' => '', // Enthält die Strings für die Werkzeuge (s.u.)
	'options' => '', // Enthält Strings für die Optionen (s.u.)
	'job' => '', //another "file" Name der Aufgabendatei
//	'track' => '',
	'smallicons' => '',  // Kleine Icons verwenden.
 
	'language' => 'de',   // Spracheinstellung ("de","en", etc.)
	'color1' => '',
	'color2' => '', 	  // Setzt die Farben für die Objekte
	'arrowsize' => '', 	  // Setzt die Größe der Pfeile
	'intersection' => '', // Frägt vor Schnitten
	'pointon' => '', 	  // Frägt vor Punkten auf Objekten
	'choice' => '', 	  // Stellt den Wahldialog an
	'showhidden' => '',   // Versteckte Objekte werden angezeigt
	'movename' => '',     // Zeige Namen bei Bewegungen an
	'minpointsize' => '', // Minimale Punktgröße
	'minfontsize' => '',  // Minimale Zeichengröße
	'interactive' => '',  // Verhindere Benutzereingaben, wenn "false"
	'snap' => '',         // "left" schnappt mit der linken Maustaste ein.
	'nomousezoom' => '',  // Verhindert verschieben oder Zoomen mit der Maus.
	'nopopupmenu' => '',  // Verhindert die Popupmenus.
	'jumptostart' => '',  // Springt zum Anfang, bzw. zum ersten Haltepunkt
	'noconfirmation' => '', // Zeigt keine Bestätigung nach dem Lösen der Aufgabe
	'restrictedmove' => '', // Erlaubt nur Bewegungen, bei denen keine Punkte ungültig werden. das funktioniert wie beim automatischen Ortslinienwerkzeug,
	'shadow' => '',          // Schaltet den Schatten an oder aus ("true" oder "false")
	'shadowcolor' => '',   // Farbe für den Hintergrund, auf den der Schatten geworfen wird.
	); 

    /**
     * return some info
     */
    function getInfo(){
        return array(
            'author' => 'jaloma',
            'email'  => 'jaloma.ac@googlemail.com',
            'date'   => '05/11/2008',
            'name'   => 'ZirkelUndLineal Plugin',
            'desc'   => 'Include ZirkelUndLineal-Files to your Wiki with <ZirkelUndLineal name="" width="" height="">. See http://www.geogebra.org/source/program/applet/geogebra_applet_param.html',
		 'url'    => 'http://jaloma.ac.googlepages.com/plugin:ZirkelUndLineal'
        );
    }

	/**
	 * Plugin Type
	 */
 
 	function getType(){ return 'substition'; }
 	function getSort(){ return 316; }
 	function connectTo($mode) { 
	$this->Lexer->addSpecialPattern("<ZirkelUndLineal.*?/>",$mode,'plugin_zul_zirkelundlineal');
	 }

	function matchLength() {
		return strlen("<ZirkelUndLineal ");
	}
	
    function handle($match, $state, $pos, &$handler){
	  // strip markup
      $match = html_entity_decode(substr($match,$this->matchLength(),-2));
      $gmap = $this->_extract_params($match);
      return $gmap;
	}

  /**
   * extract parameters for the gmsdisplay from the parameter string
   *
   * @param   string    $str_params   string of key="value" pairs
   * @return  array                   associative array of parameters key=>value
   */
  function _extract_params($str_params) {
    $param = array();
    preg_match_all('/(\w*)="(.*?)"/us',$str_params,$param,PREG_SET_ORDER);
    if (sizeof($param) == 0) {
      preg_match_all("/(\w*)='(.*?)'/us",$str_params,$param,PREG_SET_ORDER);
    }
    // parse match for instructions, break into key value pairs      
    $gmap = $this->dflt;
    foreach($param as $kvpair) {
      list($match,$key,$val) = $kvpair;
      if (isset($gmap[$key])) $gmap[$key] = $val;        
    }

    return $gmap;
  }
	
/**
 * Create output
 */
    function render($mode, &$renderer, $data) {
        if($mode == 'xhtml'){
            $renderer->doc .= $this->_contact($data);
            return true;
        }
        return false;
    }

	function getCode() {
		return "rene.zirkel.ZirkelApplet.class";
	}
	function getArchive() {
		return "zirkel.jar";
	}

    function _contact($data){
    	global $conf;
    	$file = $data['name'];
		$hasfile = $file != null && $file != '';
     	$file = $conf['savedir'] . '/media/' . str_replace( ":", "/", $file );
//		echo $file.'<br/>';
		
		$width = $data['width'];
		$height = $data['height'];

		$style = $data['style'];
		$editdigits = $data['editdigits'];
		$displaydigits = $data['displaydigits'];
		$angledigits = $data['angledigits'];
		$movefixname = $data['movefixname'];
		$grid = $data['grid'];
		$font = $data['font'];	
		$color = $data['color'];
		$colorbackground = $data['colorbackground'];
		$colorselect = $data['colorselect'];
		$colortarget = $data['colortarget'];
		$colornochecktarget = $data['colornochecktarget'];
		$language = $data['language'];
		
		$tools = $data['tools'];
		$options = $data['options'];
		$job = $data['job'];
		$track = $data['track'];
		$smallicons = $data['smallicons'];
		$demo = $data['demo'];
		$edit = $data['edit'];

		$color1 = $data['color1'];
		$color2 = $data['color2'];
		$arrowsize = $data['arrowsize'];
		$intersection = $data['intersection'];
		$pointon = $data['pointon'];
		$choice = $data['choice'];
		$showhidden = $data['showhidden'];
		$movename = $data['movename'];
		$minpointsize = $data['minpointsize'];
		$minfontsize = $data['minfontsize'];
		$interactive = $data['interactive'];
		$snap = $data['snap'];
		$nomousezoom = $data['nomousezoom'];
		$nopopupmenu = $data['nopopupmenu'];
		$jumptostart = $data['jumptostart'];
		$noconfirmation = $data['noconfirmation'];
		$restrictedmove = $data['restrictedmove'];
		$shadow = $data['shadow'];
		$shadowcolor = $data['shadowcolor'];


    	$txt = "";
        $archive = $this->getConf('jarbase').'/'.$this->getArchive();
	  	$txt .= '<applet'.
       		' code="'.$this->getCode().'"'.
       		' archive="'.$archive.'"'.
       		' width="'.$width.'" height="'.$height.'">';
		if ($hasfile != '') {
       		$txt .= '<param name="file" value="'.$file.'"/>';
		}
		
		if ($style != '') {
			$txt .= '<param name="style" value="'.$style.'"/>';
		}		
		if ($editdigits != '') {
			$txt .= '<param name="editdigits" value="'.$editdigits.'"/>';
		}		
		if ($displaydigits != '') {
			$txt .= '<param name="displaydigits" value="'.$displaydigits.'"/>';
		}		
		if ($angledigits != '') {
			$txt .= '<param name="angledigits" value="'.$angledigits.'"/>';
		}
		if ($movefixname != '') {
			$txt .= '<param name="movefixname" value="'.$movefixname.'"/>';
		}
		if ($grid != '') {
			$txt .= '<param name="grid" value="'.$grid.'"/>';
		}
		if ($font != '') {
			$txt .= '<param name="font" value="'.$font.'"/>';
		}
		if ($color != '') {
			$txt .= '<param name="color" value="'.$color.'"/>';
		}
		if ($demo != '') {
			$txt .= '<param name="demo" value="'.$demo.'"/>';
		}
		if ($edit != '') {
			$txt .= '<param name="edit" value="'.$edit.'"/>';
		}
		if ($colorbackground != '') {
			$txt .= '<param name="colorbackground" value="'.$colorbackground.'"/>';
		}
		if ($colorselect != '') {
			$txt .= '<param name="colorselect" value="'.$colorselect.'"/>';
		}
		if ($colortarget != '') {
			$txt .= '<param name="colortarget" value="'.$colortarget.'"/>';
		}
		if ($colornochecktarget != '') {
			$txt .= '<param name="colornochecktarget" value="'.$colornochecktarget.'"/>';
		}


		if ($tools != '') {
			$txt .= '<param name="tools" value="'.$tools.'"/>';
		}
		if ($options != '') {
			$txt .= '<param name="options" value="'.$options.'"/>';
		}
		if ($job != '') {
			$txt .= '<param name="job" value="'.$job.'"/>';
		}
		if ($track != '') {
			$txt .= '<param name="track" value="'.$track.'"/>';
		}
		if ($smallicons != '') {
			$txt .= '<param name="smallicons" value="'.$smallicons.'"/>';
		}
		
		if ($language != '') {
			$txt .= '<param name="language" value="'.$language.'"/>';
		}

		if ($color1 != '') {
			$txt .= '<param name="color1" value="'.$color1.'"/>';
		}
		if ($color2 != '') {
			$txt .= '<param name="color2" value="'.$color2.'"/>';
		}
		if ($arrowsize != '') {
			$txt .= '<param name="arrowsize" value="'.$arrowsize.'"/>';
		}
		if ($intersection != '') {
			$txt .= '<param name="intersection" value="'.$intersection.'"/>';
		}
		if ($pointon != '') {
			$txt .= '<param name="pointon" value="'.$pointon.'"/>';
		}
		if ($choice != '') {
			$txt .= '<param name="choice" value="'.$choice.'"/>';
		}
		if ($showhidden != '') {
			$txt .= '<param name="showhidden" value="'.$showhidden.'"/>';
		}
		if ($movename != '') {
			$txt .= '<param name="movename" value="'.$movename.'"/>';
		}
		if ($minpointsize != '') {
			$txt .= '<param name="minpointsize" value="'.$minpointsize.'"/>';
		}
		if ($minfontsize != '') {
			$txt .= '<param name="minfontsize" value="'.$minfontsize.'"/>';
		}
		if ($interactive != '') {
			$txt .= '<param name="interactive" value="'.$interactive.'"/>';
		}
		if ($snap != '') {
			$txt .= '<param name="snap" value="'.$snap.'"/>';
		}
		if ($nomousezoom != '') {
			$txt .= '<param name="nomousezoom" value="'.$nomousezoom.'"/>';
		}
		if ($nopopupmenu != '') {
			$txt .= '<param name="nopopupmenu" value="'.$nopopupmenu.'"/>';
		}
		if ($jumptostart != '') {
			$txt .= '<param name="jumptostart" value="'.$jumptostart.'"/>';
		}
		if ($noconfirmation != '') {
			$txt .= '<param name="noconfirmation" value="'.$noconfirmation.'"/>';
		}
		if ($restrictedmove != '') {
			$txt .= '<param name="restrictedmove" value="'.$restrictedmove.'"/>';
		}
	
		if ($shadow != '') {
			$txt .= '<param name="shadow" value="'.$shadow.'"/>';
		}
		if ($shadowcolor != '') {
			$txt .= '<param name="shadowcolor" value="'.$shadowcolor.'"/>';
		}
	   $txt .= 'Please <a href="http://www.java.com">install Java 1.4.2</a> (or later) to use this page.'.
   			'</applet>';
		$txt .= '<br />';
		if ($this->getConf('showHelpUrl')) {
//			$txt .= '<a href="http://www.geogebra.org/help/docude/" target="help_geogebra">Online-Hilfe</a> &mdash;';
		}
		if ($this->getConf('showDownloadUrl') && $hasfile) {
			$txt .= ' <a href="'.$file.'">Download</a> &mdash;';
		}
		$user = $_SERVER['REMOTE_USER'];
		$txt .= ' Erstellt mit © <a href="http://mathsrv.ku-eichstaett.de/MGF/homes/grothman/java/zirkel/" target="zirkelundlineal">ZirkelUndLineal</a> durch '.$user;
    	return $txt;	
	}
	
}//class
