<?php
/*======================================================================*\
|| #################################################################### ||
|| # vBulletin 4.0.0 Alpha 5
|| # ---------------------------------------------------------------- # ||
|| # Copyright ©2000-2009 Jelsoft Enterprises Ltd. All Rights Reserved. ||
|| # This file may not be redistributed in whole or significant part. # ||
|| # ---------------- VBULLETIN IS NOT FREE SOFTWARE ---------------- # ||
|| # http://www.vbulletin.com | http://www.vbulletin.com/license.html # ||
|| #################################################################### ||
\*======================================================================*/

/**
* Class to handle style variable storage
*
* @package	vBulletin
* @version	$Revision: 32333 $
* @date		$Date: 2009-10-02 18:29:44 -0500 (Fri, 02 Oct 2009) $
*/

abstract class vB_StyleVar
{
	public $registry;

	public $stylevarid;

	protected $definition;
	protected $value;
	protected $inherited = 0;		// used to set the color, 0 = unchanged, 1 = inherited from parent, -1 = customized in this style

	private $styleid = -1;
	
	// static variables for printing color input rows
	protected static $need_colorpicker = true;
	protected static $count = 0;

	//abstract public function validate();
	function validate()
	{
		return true;
	}

	public function print_editor()
	{
		global $vbulletin, $vbphrase;

		if ($this->inherited == -1)
		{
			$revert_link = construct_link_code($vbphrase['revert'], "stylevar.php?do=confirmrevert&dostyleid=" .
				$vbulletin->GPC['dostyleid'] . "&stylevarid=" . $this->stylevarid . "&rootstyle=-1");
		}

		//TODO use friendly name once we figure that out.
		print_table_header($this->stylevarid . ($revert_link ? " - $revert_link" : ""));

		// once we have LSB change this to self::
		$this->print_editor_form();


	}

	abstract public function print_editor_form();

	public function set_value($value)
	{
		$this->value = $value;
		//$this->validate();
	}

	public function set_definition($definition)
	{
		$this->definition = $definition;
	}

	public function set_inherited($inherited)
	{
		$this->inherited = $inherited;
	}

	public function set_stylevarid($stylevarid)
	{
		$this->stylevarid = $stylevarid;
	}

	public function set_styleid($styleid)
	{
		$this->styleid = $styleid;
	}

	public function get()
	{
		return ($this->value);
	}

	protected function fetch_inherit_color()
	{
		switch($this->inherited)
		{
			case 0:
				$class = 'col-g';
				break;

			case 1:
				$class = 'col-i';
				break;

			case -1:
			default:
				$class = 'col-c';
				break;
		}
		return $class;
	}

	public function build()
	{
		if (!is_array($this->value))
		{
			$this->value = array($this->value);
		}

		$value = serialize($this->value);
		$this->registry->db->query_write("
			REPLACE INTO " . TABLE_PREFIX . "stylevar
			(stylevarid, styleid, value, dateline, username)
			VALUE
			(
				'" . $this->registry->db->escape_string($this->stylevarid) . "',
				" . intval($this->styleid) . ",
				'" . $this->registry->db->escape_string($value) . "',
				" . TIMENOW . ",
				'" . $this->registry->db->escape_string($this->registry->userinfo['username']) . "'
			)
		");
	}

	public function print_units($current_units)
	{
		global $vbphrase;
		$svunitsarray = array(
			'' => '',
			'%' => '%',
			'px' => 'px',
			'pt' => 'pt',
			'em' => 'em',
			'ex' => 'ex',
			'pc' => 'pc',
			'in' => 'in',
			'cm' => 'cm',
			'mm' => 'mm'
		);

		print_select_row($vbphrase['units'], 'stylevar[' . $this->stylevarid . '][units]', $svunitsarray, $current_units);
	}
	
	protected function print_color_input_row($title, $name, $value)
	{
		$cp = "";
		
		//only include the colorpicker on the first color element.
		if (self::$need_colorpicker)
		{
			//construct all of the markup/javascript for the color picker.
			global $vbulletin;

			//set from construct_color_picker
			global $colorPickerWidth, $colorPickerType;

			$cp = '<script type="text/javascript" src="' . $vbulletin->options['bburl'] .
				'/clientscript/vbulletin_cpcolorpicker.js?v=' .
				$vbulletin->options['simpleversion'] . '"></script>' . "\n";
			$cp .= construct_color_picker(11);

			$js_phrases[] = array();
			foreach (array(
				'css_value_invalid',
				'color_picker_not_ready',
			) AS $phrasename)
			{
				$js_phrases[] = "vbphrase.$phrasename = \"" . fetch_js_safe_string($vbphrase["$phrasename"]) . "\"";
			}

			$js_phrases = implode(";\r\n\t", $js_phrases) . ";\r\n";

			$cp .= '
					<script type="text/javascript">
					<!--
					var bburl = "' . $vbulletin->options['bburl'] .'";
					var cpstylefolder = "' . $vbulletin->options['cpstylefolder'] .'";
					var colorPickerWidth = ' . intval($colorPickerWidth) . ';
					var colorPickerType = ' . intval($colorPickerType) . ';
					if(vbphrase == undefined) {vbphrase = new Object();}
					' . $js_phrases . '

					vBulletin.events.systemInit.subscribe(function()
					{
						init_color_preview();
					});
					var cleargifurl = "' .$vbulletin->options['cleargifurl'] .'";
					//-->
				</script>';

			self::$need_colorpicker = false;
		}

		$id = 'color_'. self::$count;

		$color_preview = '<div id="preview_' . self::$count .
			'" class="colorpreview" onclick="open_color_picker(' . self::$count . ', event)"></div>';

		$title_attr = ($vbulletin->debug ? " title=\"name=&quot;$name&quot;\"" : '');
		$cell =
			"<div id=\"ctrl_$name\" class=\"color_input_container\">" .
				"<input type=\"text\" name=\"$name\" id=\"$id\" " .
					"value=\"$value\" " .
					"tabindex=\"1\" $title_attr />" .
			"</div>";

		print_label_row(
			$title,
			$cp . $cell . $color_preview,
			'', 'top', $name
		);

		self::$count++;
	}
}

class vB_StyleVar_default extends vB_StyleVar
{
	private $datatype;

	public function __construct($datatype)
	{
		$this->datatype = $datatype;
	}

	public function print_editor_form()
	{
		global $vbphrase;

		// imagedir, url, path, and string are technically all just strings
		switch ($this->datatype)
		{
			case 'string':
				print_input_row($vbphrase['string'], 'stylevar[' . $this->stylevarid . ']', $this->value[$this->datatype], true);
			break;

			case 'url':
				print_input_row($vbphrase['url'], 'stylevar[' . $this->stylevarid . ']', $this->value[$this->datatype], true);
			break;

			case 'imagedir':
				print_input_row($vbphrase['image_path'], 'stylevar[' . $this->stylevarid . ']', $this->value[$this->datatype], true);
			break;

			case 'path':
				print_input_row($vbphrase['path'], 'stylevar[' . $this->stylevarid . ']', $this->value[$this->datatype], true);
			break;

			case 'numeric':
				print_input_row($vbphrase['numeric'], 'stylevar[' . $this->stylevarid . ']', $this->value[$this->datatype], true);
			break;

			case 'size':
				$this->print_units($this->value['units']);
				print_input_row($vbphrase['size'], 'stylevar[' . $this->stylevarid . '][size]', $this->value['size'], true);
			break;

			case 'fontlist':
				print_textarea_row($vbphrase['fontlist'], 'stylevar[' . $this->stylevarid . ']', $this->value[$this->datatype], 20, 40, true);
			break;
		}
	}
}

class vB_StyleVar_padding extends vB_StyleVar
{
	public function print_editor_form()
	{
		global $vbphrase;
		$this->print_units($this->value['units']);
		print_checkbox_row($vbphrase['use_same_padding_margin'], 'stylevar[' . $this->stylevarid . '][same]', $this->value['same']);
		print_input_row($vbphrase['top'], 'stylevar[' . $this->stylevarid . '][top]', $this->value['top'], true);
		print_input_row($vbphrase['right'], 'stylevar[' . $this->stylevarid . '][right]', $this->value['right'], true);
		print_input_row($vbphrase['bottom'], 'stylevar[' . $this->stylevarid . '][bottom]', $this->value['bottom'], true);
		print_input_row($vbphrase['left'], 'stylevar[' . $this->stylevarid . '][left]', $this->value['left'], true);
	}
}

class vB_StyleVar_margin extends vB_StyleVar
{
	public function print_editor_form()
	{
		global $vbphrase;

		$this->print_units($this->value['units']);
		print_checkbox_row($vbphrase['same'], 'stylevar[' . $this->stylevarid . '][same]', $this->value['same']);
		print_input_row($vbphrase['top'], 'stylevar[' . $this->stylevarid . '][top]', $this->value['top'], true);
		print_input_row($vbphrase['right'], 'stylevar[' . $this->stylevarid . '][right]', $this->value['right'], true);
		print_input_row($vbphrase['bottom'], 'stylevar[' . $this->stylevarid . '][bottom]', $this->value['bottom'], true);
		print_input_row($vbphrase['left'], 'stylevar[' . $this->stylevarid . '][left]', $this->value['left'], true);
	}
}

class vB_StyleVar_textdecoration extends vB_StyleVar
{
	public function print_editor_form()
	{
		global $vbphrase;
		// needs checked
		print_checkbox_row($vbphrase['none'], 'stylevar[' . $this->stylevarid . '][none]', $this->value['none']);
		print_checkbox_row($vbphrase['underline'], 'stylevar[' . $this->stylevarid . '][underline]', $this->value['underline']);
		print_checkbox_row($vbphrase['overline'], 'stylevar[' . $this->stylevarid . '][overline]', $this->value['overline']);
		print_checkbox_row($vbphrase['linethrough'], 'stylevar[' . $this->stylevarid . '][line-through]', $this->value['line-through']);
		print_checkbox_row($vbphrase['blink'], 'stylevar[' . $this->stylevarid . '][blink]', $this->value['blink']);
	}
}

class vB_StyleVar_font extends vB_StyleVar
{
	public function print_editor_form()
	{
		global $vbphrase;

		$font_weights = array(
			'' => '',
			'normal' => $vbphrase['normal'],
			'bold' => $vbphrase['bold'],
			'bolder' => $vbphrase['bolder'],
			'lighter' => $vbphrase['lighter'],
		);

		$font_styles = array(
			'' => '',
			'normal' => $vbphrase['normal'],
			'italic' => $vbphrase['italic'],
			'oblique' => $vbphrase['oblique'],
		);

		$font_variants = array(
			'' => '',
			'normal' => $vbphrase['normal'],
			'small-caps' => $vbphrase['small_caps'],
		);

		// TODO: add repeat, offset
		print_input_row($vbphrase['font_family'], 'stylevar[' . $this->stylevarid . '][family]', $this->value['family'], true);

		$this->print_units($this->value['units']);
		print_input_row($vbphrase['font_size'], 'stylevar[' . $this->stylevarid . '][size]', $this->value['size'], true);

		print_select_row($vbphrase['font_weight'], 'stylevar[' . $this->stylevarid . '][weight]', $font_weights, $this->value['weight']);
		print_select_row($vbphrase['font_style'], 'stylevar[' . $this->stylevarid . '][style]', $font_styles, $this->value['style']);
		print_select_row($vbphrase['font_variant'], 'stylevar[' . $this->stylevarid . '][variant]', $font_variants, $this->value['variant']);
	}
}

class vB_StyleVar_background extends vB_StyleVar
{

	public function print_editor_form()
	{
		global $vbphrase;

		$values = array(
			'' => '',
			'repeat' => $vbphrase['repeat'],
			'repeat-x' => $vbphrase['repeat_x'],
			'repeat-y' => $vbphrase['repeat_y'],
			'no-repeat' => $vbphrase['no_repeat'],
		);

		// TODO: add repeat, offset
		$this->print_color_input_row($vbphrase['background_color'], 'stylevar[' . $this->stylevarid . '][color]', $this->value['color']);
		print_input_row($vbphrase['background_image'], 'stylevar[' . $this->stylevarid . '][image]', $this->value['image'], true);
		print_select_row($vbphrase['background_repeat'], 'stylevar[' . $this->stylevarid . '][repeat]', $values, $this->value['repeat']);
	}
}

class vB_StyleVar_dimension extends vB_StyleVar
{
	public function print_editor_form()
	{
		global $vbphrase;

		$this->print_units($this->value['units']);
		print_input_row($vbphrase['width'], 'stylevar[' . $this->stylevarid . '][width]', $this->value['width'], true);
		print_input_row($vbphrase['height'], 'stylevar[' . $this->stylevarid . '][height]', $this->value['height'], true);
	}
}

class vB_StyleVar_border extends vB_StyleVar
{
	public function print_editor_form()
	{
		global $vbphrase;

		$this->print_units($this->value['units']);
		print_input_row($vbphrase['width'], 'stylevar[' . $this->stylevarid . '][width]', $this->value['width'], true);
		print_input_row($vbphrase['style'], 'stylevar[' . $this->stylevarid . '][style]', $this->value['style'], true);
		//print_input_row($vbphrase['color'], 'stylevar[' . $this->stylevarid . '][color]', $this->value['color'], true);
		$this->print_color_input_row($vbphrase['color'], 'stylevar[' . $this->stylevarid . '][color]', $this->value['color']);
	}
}

class vB_StyleVar_color extends vB_StyleVar
{
	public function print_editor_form()
	{
		global $vbphrase;

		$this->print_color_input_row($vbphrase['color'], 'stylevar[' . $this->stylevarid . '][color]', $this->value['color']);
	}
}

class vB_StyleVar_factory
{
	/**
	 * Creates a stylevar.
	 * 
	 * @param string $type
	 * @return vB_StyleVar
	 */
	public static function create($type)
	{
		// not really a good factory, in fact, this is a dumb factory
		$stylevarobj = null;
		switch ($type)
		{
			case 'numeric':
			case 'string':
			case 'url':
			case 'imagedir':
			case 'image':
			case 'path':
			case 'fontlist':
			case 'size':
				$stylevarobj = new vB_StyleVar_default($type);
				break;

			case 'color':
				$stylevarobj = new vB_StyleVar_color();
				break;

			case 'background':
				$stylevarobj = new vB_StyleVar_background();
				break;

			case 'textdecoration':
				$stylevarobj = new vB_StyleVar_textdecoration();
				break;

			case 'font':
				$stylevarobj = new vB_StyleVar_font();
				break;

			case 'dimension':
				$stylevarobj = new vB_StyleVar_dimension();
				break;

			case 'border':
				$stylevarobj = new vB_StyleVar_border();
				break;

			case 'padding':
				$stylevarobj = new vB_StyleVar_padding();
				break;

			case 'margin':
				$stylevarobj = new vB_StyleVar_margin();
				break;

			default:
				trigger_error("Unknown Data Type ( Type: " . $type . ")", E_USER_ERROR);
		}
		return $stylevarobj;
	}
}

/*======================================================================*\
|| ####################################################################

|| # CVS: $RCSfile$ - $Revision: 32333 $
|| ####################################################################
\*======================================================================*/
