<?php
class LineEdit {
	public $label, $name, $value;
		
	function LineEdit($label, $name, $value = "")
	{
		$this->label = $label;
		$this->name = $name;
		$this->value = $value;
	}

	function render($indent = "")
	{
		$str  = $indent . "<div class=\"input\">\n";
		$str .= $indent . "  <div class=\"label\">". $this->label ."</div>\n";
		$str .= $indent . "  <div class=\"widget\"><input name=\"vars[".$this->name."]\" value=\"".$this->value."\"/></div>\n";
		$str .= $indent . "</div>\n";
		return $str;
	}
}

class LineEditPwd {
	public $label, $name, $value;
		
	function LineEditPwd($label, $name, $value = "")
	{
		$this->label = $label;
		$this->name = $name;
		$this->value = $value;
	}

	function render($indent = "")
	{
		$str  = $indent . "<div class=\"input\">\n";
		$str .= $indent . "  <div class=\"label\">". $this->label ."</div>\n";
		$str .= $indent . "  <div class=\"widget\"><input name=\"vars[".$this->name."]\" value=\"".$this->value."\" type=\"password\"/></div>\n";
		$str .= $indent . "</div>\n";
		return $str;
	}
}

class FileUpload {
	public $label, $name, $accept;

	public function FileUpload($label, $name, $accept = "*")
	{
		$this->label = $label;
		$this->name = $name;
		$this->accept = $accept;
	}

	public function render($indent = "")
	{
		$str  = $indent . "<div class=\"input\">\n";
		$str .= $indent . "  <div class=\"label\">". $this->label . "</div>\n";
		$str .= $indent . "  <div class=\"widget\"><input type=\"file\" name=\"" 
			. $this->name. "\" accept=\"". $this->accept ."\"/></div>\n";
		$str .= $indent . "</div>\n";
		return $str;
	}
}

class Button {
	public $label;

	public function Button($label)
	{
		$this->label = $label;
	}

	public function render($indent = "")
	{
		$str  = $indent . "<div class=\"input\">\n";
		$str .= $indent . "  <div class=\"label\"></div>\n";
		$str .= $indent . "  <div class=\"widget\"><button type=\"submit\">".
			$this->label."</button></div>\n";
		$str .= $indent . "</div>\n";
		return $str;
	}
}

class CheckBox {
	public $label, $name, $value;
		
	public function CheckBox($label, $name, $value = "")
	{
		$this->label = $label;
		$this->name = $name;
		$this->value = $value;
	}

	public function render($indent = "")
	{
		$str  = $indent . "<div class=\"input\">\n";
		$str .= $indent . "  <div class=\"label\">". $this->label ."</div>\n";
		$str .= $indent . "  <div class=\"widget\"><input type=\"checkbox\" name=\"vars[".$this->name."]\" value=\"".$this->value."\"/></div>\n";
		$str .= $indent . "</div>\n";
		return $str;
	}
}

class ComboBox {
	public $label, $name, $value, $values;
		
	public function ComboBox($label, $name, $value, $values)
	{
		$this->label = $label;
		$this->name = $name;
		$this->value = $value;
		$this->values = $values;
	}

	public function render($indent = "")
	{
		$str  = $indent . "<div class=\"input\">\n";
		$str .= $indent . "  <div class=\"label\">".$this->label."</div>\n";
		$str .= $indent . "  <div class=\"widget\">\n";
		$str .= $indent . "    <select name=\"vars[".$this->name."]\">\n";
		foreach($this->values as $k => $v) {
			if($v != $this->value) $str .= $indent . "      <option value=\"".$v."\">".$k."</option>\n";
			else $str .= $indent .  "      <option value=\"".$v."\" selected>".$k."</option>\n";
		}
		$str .= $indent . "    </select>\n";
		$str .= $indent . "  </div>\n";
		$str .= $indent . "</div>\n";
		return $str;
	}
}

class Hidden {
	public $values;
		
	public function Hidden($values)
	{
		$this->values = $values;
	}

	public function render($indent = "")
	{
		$str = "";
		foreach($this->values as $key => $value) {
			$str .= $indent . "<input type=\"hidden\" name=\"vars[".$key."]\" value=\"".$value."\"/>\n";
		}
		return $str;
	}
}

class TextEdit {
	public $label, $name, $value;
		
	function TextEdit($label, $name, $value = "", $lines = "20")
	{
		$this->label = $label;
		$this->name = $name;
		$this->value = $value;
		$this->lines = $lines;
	}

	function render($indent = "")
	{
		$str  = $indent . "<div class=\"input\">\n";
		$str .= $indent . "  <div class=\"label\">". $this->label ."</div>\n";
    $str .= $indent . "  <div class=\"widget\"><textarea rows=\"".$this->lines."\" class=\"textedit\" name=\"vars[".$this->name."]\">".$this->value."</textarea></div>\n";
		$str .= $indent . "</div>\n";
		return $str;
	}
}

class DateTimeEdit {
	public $label, $name, $timestamp;
		
	function DateTimeEdit($label, $name, $timestamp = 0)
	{
		$this->label = $label;
		$this->name = $name;
		$this->timestamp = $timestamp;
	}

	function render($indent = "")
	{
		if($this->timestamp == 0) $t = time();
		else $t = $this->timestamp;

		$second = date('s',$t);
		$minute = date('i',$t);
		$hour = date('G',$t); 
		$day = date('d',$t);
		$month = date('m',$t);
		$year = date('Y',$t); 

		$str  = $indent . "<div class=\"input\">\n";
		$str .= $indent . "	<div class=\"label\">".$this->label."</div>\n";
		$str .= $indent . "  <div class=\"widget\">\n";
		$str .= $indent . "     <input style=\"width: 50px;\" name=\"vars[".$this->name."_year]\" value=\"".$year."\"/>";
		$str .= "/<input style=\"width: 30px;\" name=\"vars[".$this->name."_month]\" value=\"".$month."\"/>";
		$str .= "/<input style=\"width: 30px;\" name=\"vars[".$this->name."_day]\" value=\"".$day."\"/>";
		$str .= "	- ";
		$str .= "<input style=\"width: 30px;\" name=\"vars[".$this->name."_hour]\" value=\"".$hour."\"/>";
		$str .= ":<input style=\"width: 30px;\" name=\"vars[".$this->name."_minute]\" value=\"".$minute."\"/>";
		$str .= ":<input style=\"width: 30px;\" name=\"vars[".$this->name."_second]\" value=\"".$second."\"/>\n";
		$str .= $indent . "  </div>\n";
		$str .= $indent . "</div>\n";

		return $str;
	}

	public function toTimestamp($t, $name)
	{
		$timestring = sprintf("%d", $t[$name."_year"])  ."/".
			sprintf("%d", $t[$name."_month"]) ."/".
			sprintf("%d", $t[$name."_day"])   ." ".
			sprintf("%d", $t[$name."_hour"])  .":".
			sprintf("%02d", $t[$name."_minute"]).":".
			sprintf("%02d", $t[$name."_second"]);
		
		return strtotime($timestring);
	}
}

class ImageComboBox {
	public $label, $name, $value, $values;
		
	public function ImageComboBox($label, $name, $value, $values)
	{
		$this->label = $label;
		$this->name = $name;
		$this->value = $value;
		$this->values = $values;
	}

	public function render($indent = "")
	{
		$selheight = 64;
		$height = $selheight * 0.8;

		if(get_class($this->values) == "Icons") $numicons = sizeof($this->values->icons);
		else $numicons = sizeof($this->values);

		$str  = $indent . "<div class=\"input\">\n";
		$str .= $indent . "  <div class=\"label\">".$this->label."</div>\n";
		$str .= $indent . "  <div class=\"widget\">\n";
		$str .= $indent . "    <script type=\"text/javascript\">\n";
		$str .= $indent . "    function setSelection(value)\n";
		$str .= $indent . "    {\n";
		$str .= $indent . "      document.getElementById('".$this->name."').value = value\n";
		$str .= $indent . "      var container = document.getElementById('icons');\n";
		$str .= $indent . "      var icons = document.getElementsByName('icon');\n";
		$str .= $indent . "      for(i = 0; i < icons.length; i++) {\n";
		$str .= $indent . "        if(icons[i].alt == value) icons[i].height = ".$selheight.";\n";
		$str .= $indent . "        else icons[i].height = ".$height.";\n";
		//		$str .= $indent . "        if(icons[i].src == value) icons[i].style.border = '10px blue';\n";
		//		$str .= $indent . "        else { icons[i].style.border = '0px' }\n";
		$str .= $indent . "      }\n";
		$str .= $indent . "    }\n";
		$str .= $indent . "    </script>\n";
		$str .= $indent . "    <div style=\"width:300px;overflow:auto;height:".($selheight+24)."px;\">\n";
		$str .= $indent . "      <div id=\"icons\" style=\"text-align: left; height: ".$selheight."px; width:".(($height+8)*($numicons-1)+$selheight)."px; display: block;\">\n";
		$str .= $indent . "        <input id=\"".$this->name."\" name=\"vars[".$this->name."]\" type=\"hidden\" value=\"\"/>\n";
		if(get_class($this->values) == "Icons") {
			foreach($this->values->icons as $icon) {
				$str .= $indent . "        <img name=\"icon\" alt=\"".$icon->file."\" src=\"".$icon->prefix.$icon->file."\" onclick=\"setSelection('".$icon->file."')\"/>\n";
			}
		} else {
			foreach($this->values as $k => $v) {
				$str .= $indent . "        <img name=\"icon\" alt=\"".$v."\" src=\"".$v."\" onclick=\"setSelection('".$v."')\"/>\n";
			}
		}
		$str .= $indent . "      </div>\n"; // box
		$str .= $indent . "    </div>\n"; // overflow
		$str .= $indent . "    <script type=\"text/javascript\">setSelection('".$this->value."');</script>\n";
		$str .= $indent . "  </div>\n"; // widget
		$str .= $indent . "</div>\n"; // input
		return $str;
	}
}

class ListEditor {
	public $label, $name, $namewidget, $valuewidget, $values;

	public function ListEditor($label, $name, $namewidget, $valuewidget, $values = array())
	{
		$this->label = $label;
		$this->name = $name;
		$this->namewidget = $namewidget;
		$this->valuewidget = $valuewidget;
		$this->values = $values;
	}

	public function render($indent = "")
	{
		$str  = $indent . "<script type=\"text/javascript\">\n";
		$str .= $indent . "//<!--\n";
		$str .= $indent . "function deleteItem()\n";
		$str .= $indent . "{\n";
		$str .= $indent . "  var items = document.getElementById('items');\n";
		$str .= $indent . "  var selIndex = items.selectedIndex;\n";
		$str .= $indent . "  if(selIndex < 0) return;\n";
		$str .= $indent . "  var item = items.options.item(selIndex);\n";
		$str .= $indent . "  items.removeChild(item);\n";
		$str .= $indent . "}\n";
		$str .= $indent . "\n";
		$str .= $indent . "function addItem()\n";
		$str .= $indent . "{\n";
		$str .= $indent . "  var items = document.getElementById('items');\n";
		$str .= $indent . "  var item_names = document.getElementsByName('vars[".$this->namewidget->name."]');\n";
		$str .= $indent . "  var item_values = document.getElementsByName('vars[".$this->valuewidget->name."]');\n";
		$str .= $indent . "  var item_name = item_names[0].value;\n";
		$str .= $indent . "  var item_value = item_values[0].value;\n";
		$str .= $indent . "  var item = document.createElement('option');\n";
		$str .= $indent . "  item.value = item_value + ':' + item_name;\n";
		$str .= $indent . "  item.innerHTML = item_value + ':' + item_name;\n";
		$str .= $indent . "  items.appendChild(item);\n";
		$str .= $indent . "}\n";
		$str .= $indent . "\n";
		$str .= $indent . "function move(mod)\n";
		$str .= $indent . "{\n";
		$str .= $indent . "  var items = document.getElementById('items');\n";
		$str .= $indent . "  var idx = items.selectedIndex;\n";
		$str .= $indent . "\n";
		$str .= $indent . "  if(idx < 0 || idx + mod < 0 || idx + mod > items.length - 1) return;\n";
		$str .= $indent . "\n";
		$str .= $indent . "  var tmp_value = items.options[idx].value;\n";
		$str .= $indent . "  var tmp_innerHTML = items.options[idx].innerHTML;\n";
		$str .= $indent . "\n";
		$str .= $indent . "  items.options[idx].value = items.options[idx + mod].value;\n";
		$str .= $indent . "  items.options[idx].innerHTML = items.options[idx + mod].innerHTML;\n";
		$str .= $indent . "  items.options[idx + mod].value = tmp_value;\n";
		$str .= $indent . "  items.options[idx + mod].innerHTML = tmp_innerHTML;\n";
		$str .= $indent . "\n";
		$str .= $indent . "  items.selectedIndex += mod;\n";
		$str .= $indent . "}\n";
		$str .= $indent . "\n";
		$str .= $indent . "function moveUp()\n";
		$str .= $indent . "{\n";
		$str .= $indent . "  move(-1)\n";
		$str .= $indent . "}\n";
		$str .= $indent . "\n";
		$str .= $indent . "function moveDown()\n";
		$str .= $indent . "{\n";
		$str .= $indent . "  move(1)\n";
		$str .= $indent . "}\n";
		$str .= $indent . "\n";
		$str .= $indent . "function selectAll()\n";
		$str .= $indent . "{\n";
		$str .= $indent . "  var items = document.getElementById('items');\n";
		$str .= $indent . "  var len = items.length;\n";
		$str .= $indent . "  var data = '';\n";
		$str .= $indent . "  for(i = 0; i < len; i++) {\n";
		$str .= $indent . "    items.options[i].selected = true;\n";
		$str .= $indent . "  }\n";
		$str .= $indent . "}\n";
		$str .= $indent . "//-->\n";
		$str .= $indent . "</script>\n";
		$str .= $indent . "<select multiple size=\"8\" id=\"items\" name=\"".$this->name."[]\">\n";
		if(sizeof($this->values)) {
			foreach($this->values as $key => $val) {
				$str .= $indent . "  <option value=\"".$key.":".$val."\">".$key.":".$val."</option>\n";
			}
		}
		$str .= $indent . "</select><br/>\n";
		$str .= $indent . "<div class=\"button\" button onclick=\"moveUp()\">/\</div><br/>\n";
		$str .= $indent . "<div class=\"button\" onclick=\"moveDown()\">\/</div><br/>\n";
		$str .= $this->namewidget->render($indent);
		$str .= $this->valuewidget->render($indent);
		$str .= "<div class=\"button\" onclick=\"addItem()\">+</div><br/>\n";
		$str .= $indent . "<div class=\"button\" onclick=\"deleteItem()\">-</div><br/>\n";
		return $str;
	}

	public function splitValues($values)
	{
		$out = array();
		foreach($values as $value) {
			$vals = explode(":", $value);
			$out[$vals[0]]=$vals[1];
		}
		return $out;
	}
}

class MultiList {
	public $label, $name, $values;
		
	function MultiList($label, $name, $values = "")
	{
		$this->label = $label;
		$this->name = $name;
		$this->values = $values;
	}

	function render($indent = "")
	{
		$str  = $indent . "<div class=\"input\">\n";
		$str .= $indent . "  <div class=\"label\">". $this->label ."</div>\n";
		$str .= $indent . "  <div class=\"widget\">\n";
		$str .= $indent . "    <select multiple size=\"8\" id=\"items\" name=\"".$this->name."[]\">\n";
		if(sizeof($this->values)) {
			foreach($this->values as $value => $active) {
				if($active == true) $sel = " selected=\"true\"";
				else $sel = "";
				$str .= $indent . "      <option value=\"".$value."\"".$sel.">".$value."</option>\n";
			}
		}
		$str .= $indent . "    </select>\n";
		$str .= $indent . "  </div>\n";
		$str .= $indent . "</div>\n";
		return $str;
	}
}

class Form {
	public $widgets = array();
	public $action;
	public $hasFileUpload = false;
	public $hasListEditor = false;

	public function addWidget($widget)
	{
		if(get_class($widget) == "FileUpload") $this->hasFileUpload = true;
		if(get_class($widget) == "ListEditor") $this->hasListEditor = true;
		array_push($this->widgets, $widget);	
	}

	public function render($indent = "")
	{
		global $m, $s;
		$str  = $indent . "<form method=\"post\"\n";
		if($this->hasFileUpload) $str .= $indent . "      enctype=\"multipart/form-data\"\n";
		if($this->hasListEditor) $str .= $indent . "      onsubmit=\"selectAll();\"\n";
		$str .= $indent . "      action=\"?page=admin&amp;m=".$m."&amp;s=".$s."&amp;a=".$this->action."\">\n";
		foreach($this->widgets as $widget) {
			$str .= $widget->render($indent . "  ");
		}
		$str .= $indent . "</form>\n";
		echo $str;
	}

	public function Form($action)
	{
		$this->action = $action;
	}
}

?>