<?php
/**
 * File contains the class files for ExcelWriterXML_Style
 * @package ExcelWriterXML
 */

/**
 * Style class for generating Excel styles
 * @link http://msdn.microsoft.com/en-us/library/aa140066(office.10).aspx
 * @author Robert F Greer
 * @version 1.0
 * @package ExcelWriterXML
 */
class ExcelWriterXML_Style {
	// Private Variables
	/////////////////////
	// Options
	private $id;
	private $name;
	private $useAlignment = false;
	private $useFont = false;
	private $useBorder = false;
	private $useInterior = false;
	
	// Alignment
	private $valign;
	private $halign;
	private $rotate;
	private $shrinktofit = 0;
	private $verticaltext = 0;
	private $wraptext = 0;

	// Font
	private $fontColor = 'Automatic';
	private $fontName;
	private $fontFamily;
	private $fontSize;
	private $bold;
	private $italic;
	private $underline;
	private $strikethrough;
	private $shadow;
	private $outline;
	/////////////////////
	
	// Borders
	private $borderTop = array();
	private $borderBottom = array();
	private $borderLeft = array();
	private $borderRight = array();
	private $borderDL = array();
	private $borderDR = array();
	/////////////////////
	
	// Interior
	private $interiorColor;
	private $interiorPattern;
	private $interiorPatternColor;
	/////////////////////
	
	// NumberFormat
	private $numberFormat;
	/////////////////////
	
	// Other Vars
	private $formatErrors = array();
	private $namedColorsIE = array (
		'aliceblue' => '#F0F8FF',
		'antiquewhite' => '#FAEBD7',
		'aqua' => '#00FFFF',
		'aquamarine' => '#7FFFD4',
		'azure' => '#F0FFFF',
		'beige' => '#F5F5DC',
		'bisque' => '#FFE4C4',
		'black' => '#000000',
		'blanchedalmond' => '#FFEBCD',
		'blue' => '#0000FF',
		'blueviolet' => '#8A2BE2',
		'brown' => '#A52A2A',
		'burlywood' => '#DEB887',
		'cadetblue' => '#5F9EA0',
		'chartreuse' => '#7FFF00',
		'chocolate' => '#D2691E',
		'coral' => '#FF7F50',
		'cornflowerblue' => '#6495ED',
		'cornsilk' => '#FFF8DC',
		'crimson' => '#DC143C',
		'cyan' => '#00FFFF',
		'darkblue' => '#00008B',
		'darkcyan' => '#008B8B',
		'darkgoldenrod' => '#B8860B',
		'darkgray' => '#A9A9A9',
		'darkgreen' => '#006400',
		'darkkhaki' => '#BDB76B',
		'darkmagenta' => '#8B008B',
		'darkolivegreen' => '#556B2F',
		'darkorange' => '#FF8C00',
		'darkorchid' => '#9932CC',
		'darkred' => '#8B0000',
		'darksalmon' => '#E9967A',
		'darkseagreen' => '#8FBC8F',
		'darkslateblue' => '#483D8B',
		'darkslategray' => '#2F4F4F',
		'darkturquoise' => '#00CED1',
		'darkviolet' => '#9400D3',
		'deeppink' => '#FF1493',
		'deepskyblue' => '#00BFFF',
		'dimgray' => '#696969',
		'dodgerblue' => '#1E90FF',
		'firebrick' => '#B22222',
		'floralwhite' => '#FFFAF0',
		'forestgreen' => '#228B22',
		'fuchsia' => '#FF00FF',
		'gainsboro' => '#DCDCDC',
		'ghostwhite' => '#F8F8FF',
		'gold' => '#FFD700',
		'goldenrod' => '#DAA520',
		'gray' => '#808080',
		'green' => '#008000',
		'greenyellow' => '#ADFF2F',
		'honeydew' => '#F0FFF0',
		'hotpink' => '#FF69B4',
		'indianred' => '#CD5C5C',
		'indigo' => '#4B0082',
		'ivory' => '#FFFFF0',
		'khaki' => '#F0E68C',
		'lavender' => '#E6E6FA',
		'lavenderblush' => '#FFF0F5',
		'lawngreen' => '#7CFC00',
		'lemonchiffon' => '#FFFACD',
		'lightblue' => '#ADD8E6',
		'lightcoral' => '#F08080',
		'lightcyan' => '#E0FFFF',
		'lightgoldenrodyellow' => '#FAFAD2',
		'lightgreen' => '#90EE90',
		'lightgrey' => '#D3D3D3',
		'lightpink' => '#FFB6C1',
		'lightsalmon' => '#FFA07A',
		'lightseagreen' => '#20B2AA',
		'lightskyblue' => '#87CEFA',
		'lightslategray' => '#778899',
		'lightsteelblue' => '#B0C4DE',
		'lightyellow' => '#FFFFE0',
		'lime' => '#00FF00',
		'limegreen' => '#32CD32',
		'linen' => '#FAF0E6',
		'magenta' => '#FF00FF',
		'maroon' => '#800000',
		'mediumaquamarine' => '#66CDAA',
		'mediumblue' => '#0000CD',
		'mediumorchid' => '#BA55D3',
		'mediumpurple' => '#9370DB',
		'mediumseagreen' => '#3CB371',
		'mediumslateblue' => '#7B68EE',
		'mediumspringgreen' => '#00FA9A',
		'mediumturquoise' => '#48D1CC',
		'mediumvioletred' => '#C71585',
		'midnightblue' => '#191970',
		'mintcream' => '#F5FFFA',
		'mistyrose' => '#FFE4E1',
		'moccasin' => '#FFE4B5',
		'navajowhite' => '#FFDEAD',
		'navy' => '#000080',
		'oldlace' => '#FDF5E6',
		'olive' => '#808000',
		'olivedrab' => '#6B8E23',
		'orange' => '#FFA500',
		'orangered' => '#FF4500',
		'orchid' => '#DA70D6',
		'palegoldenrod' => '#EEE8AA',
		'palegreen' => '#98FB98',
		'paleturquoise' => '#AFEEEE',
		'palevioletred' => '#DB7093',
		'papayawhip' => '#FFEFD5',
		'peachpuff' => '#FFDAB9',
		'peru' => '#CD853F',
		'pink' => '#FFC0CB',
		'plum' => '#DDA0DD',
		'powderblue' => '#B0E0E6',
		'purple' => '#800080',
		'red' => '#FF0000',
		'rosybrown' => '#BC8F8F',
		'royalblue' => '#4169E1',
		'saddlebrown' => '#8B4513',
		'salmon' => '#FA8072',
		'sandybrown' => '#F4A460',
		'seagreen' => '#2E8B57',
		'seashell' => '#FFF5EE',
		'sienna' => '#A0522D',
		'silver' => '#C0C0C0',
		'skyblue' => '#87CEEB',
		'slateblue' => '#6A5ACD',
		'slategray' => '#708090',
		'snow' => '#FFFAFA',
		'springgreen' => '#00FF7F',
		'steelblue' => '#4682B4',
		'tan' => '#D2B48C',
		'teal' => '#008080',
		'thistle' => '#D8BFD8',
		'tomato' => '#FF6347',
		'turquoise' => '#40E0D0',
		'violet' => '#EE82EE',
		'wheat' => '#F5DEB3',
		'white' => '#FFFFFF',
		'whitesmoke' => '#F5F5F5',
		'yellow' => '#FFFF00',
		'yellowgreen' => '#9ACD32',
	);
	/////////////////////
	
	// Public Variables
	/////////////////////
	
	// Constructor
	
	/**
     * Constructor for a style
     * @param string $id The named style referenced by Excel.  This is called by
     * ExcelWriterXML object when adding a style
     */
	function ExcelWriterXML_Style($id){
		$this->id = $id;
	}
	/////////////////////
	
	/**
	 * Returns the named style for this style
	 * @return string $id The id for this style
	 */
	public function getID(){
		return $this->id;
	}
	
	/**
     * Retrieves the XML string data for a style.
     * Called by ExcelWriterXML object
     * @return string Returns the formatted XML data <style>...</style>
     */
	public function getStyleXML(){
		$name = '';
		$valign = '';
		$halign = '';
		$rotate = '';
		$shrinktofit = '';
		$verticaltext = '';
		$wraptext = '';
		
		$bold = '';
		$italic = '';
		$strikethrough = '';
		$underline = '';
		$outline = '';
		$shadow = '';
		$fontName = '';
		$fontFamily = '';
		$fontSize = '';
		
		$borders = '';
		
		$interior = '';
		$interiorColor = '';
		$interiorPattern = '';
		$interiorPatternColor = '';
		
		$numberFormat = '';
		
		if (empty($this->id)) throw new exception;
		if (!empty($this->name)){$name = 'ss:Name="'.$this->name.'"';}
		
		// Alignment
		if ($this->useAlignment){
			if (!empty($this->valign)){$valign = 'ss:Vertical="'.$this->valign.'"';}
			if (!empty($this->halign)){$halign = 'ss:Horizontal="'.$this->halign.'"';}
			if (!empty($this->rotate)){$rotate = 'ss:Rotate="'.$this->rotate.'"';}
			if (!empty($this->shinktofit)){$shrinktofit = 'ss:ShrinkToFit="1"';}
			if (!empty($this->verticaltext)){$verticaltext = 'ss:VerticalText="1"';}
			if (!empty($this->wraptext)){$wraptext = 'ss:WrapText="1"';}
		}
		
		// Font
		if ($this->useFont){
			if (!empty($this->fontColor)){$fontColor = 'ss:Color="'.$this->fontColor.'"';}
			if (!empty($this->bold)){$bold = 'ss:Bold="1"';}
			if (!empty($this->italic)){$italic = 'ss:Italic="1"';}
			if (!empty($this->strikethrough)){$strikethrough = 'ss:StrikeThrough="'.$this->strikethrough.'"';}
			if (!empty($this->underline)){$underline = 'ss:Underline="'.$this->underline.'"';}
			if (!empty($this->outline)){$outline = 'ss:Outline="1"';}
			if (!empty($this->shadow)){$shadow = 'ss:Shadow="1"';}
			if (!empty($this->fontName)){$fontName = 'ss:FontName="'.$this->fontName.'"';}
			if (!empty($this->fontFamily)){$fontFamily = 'x:Family="'.$this->fontFamily.'"';}
			if (!empty($this->fontSize)){$fontSize = 'ss:Size="'.$this->fontSize.'"';}
		}
		// Border
		if ($this->useBorder){
			$borders = '		<Borders>'."\r";
			$positions = array(
				'Top'			=> $this->borderTop,
				'Bottom'		=> $this->borderBottom,
				'Left'			=> $this->borderLeft,
				'Right'			=> $this->borderRight,
				'DiagonalLeft'	=> $this->borderDL,
				'DiagonalRight'	=> $this->borderDR,

			);
			foreach($positions as $position => $pData){
				if (empty($pData)) continue;
				$bLinestyle = isset($pData['LineStyle'])
					? 'ss:LineStyle="'.$pData['LineStyle'].'"'
					: '';
				$bColor = isset($pData['Color'])
					? 'ss:Color="'.$pData['Color'].'"'
					: '';
				$bWeight = isset($pData['Weight'])
					? 'ss:Weight="'.$pData['Weight'].'"'
					: '';
				$borders .= '<Border ss:Position="'.$position.'" '.$bLinestyle.' '.$bColor.' '.$bWeight.'/>'."\r";
			}
			$borders .= '</Borders>'."\r";
		}
		
		if ($this->useInterior){
			if (!empty($this->interiorColor)){$interiorColor = 'ss:Color="'.$this->interiorColor.'"';}
			if (!empty($this->interiorPattern)){$interiorPattern = 'ss:Pattern="'.$this->interiorPattern.'"';}
			if (!empty($this->interiorPatternColor)){$interiorPatternColor = 'ss:PatternColor="'.$this->interiorPatternColor.'"';}
			$interior = '		<Interior '.$interiorColor.' '.$interiorPattern.' '.$interiorPatternColor.'/>'."\r";
		}
		
		if (!empty($this->numberFormat)) {$numberFormat = '		<NumberFormat ss:Format="'.$this->numberFormat.'"/>'."\r";}
		else $numberFormat = '		<NumberFormat/>'."\r";
		
		$xml = '	<Style ss:ID="'.$this->id.'" '.$name.'>'."\r";
		if ($this->useAlignment) $xml .= '		<Alignment '.$valign.' '.$halign.' '.$rotate.' '.$shrinktofit.' '.$wraptext.' '.$verticaltext.'/>'."\r";
		if ($this->useBorder) $xml .= $borders;
		if ($this->useFont) $xml .= '		<Font '.$fontSize.' '.$fontColor.' '.$bold.' '.$italic.' '.$strikethrough.' '.$underline.' '.$shadow.' '.$outline.' '.$fontName.' '.$fontFamily.'/>'."\r";
		if ($this->useInterior) $xml .= $interior;
		$xml .= $numberFormat;
		$xml .= '		<Protection/>'."\r";
		$xml .= '	</Style>'."\r";
		return($xml);
	}
	
	/**
	 * Checks whether a color is valid for the spreadsheet
	 * @param string $color Named color from MS or web color in HEX format (e.g.
     * #ff00ff
     * @return mixed Either the valid color in HEX format or false if the color
     * is not valid
	 */
	public function checkColor($color){
		$pattern = "/[0-9a-f]{6}/";
		if (preg_match($pattern, strtolower($color), $matches)) {
			$color = '#'.$matches[0];
			return($color);
		}
		else if (isset($this->namedColorsIE[strtolower($color)])){
			$color = $this->namedColorsIE[strtolower($color)];
			return($color);
		}
		else{
			$this->addError(__FUNCTION__,'Supplied color was not valid "'.$color.'"');
			return(false);
		}
	}
	
	/**
	 * Adds a format error.  When the document is generated if there are any
	 * errors they will be listed on a seperate sheet.
	 * @param string $namedStyle The style in which the error occurred
	 * @param string $function The name of the function that was called
	 * @param string $message Details of the error
	 */
	private function addError($function, $message){
		$tmp = array(
			'style'		=> $this->id,
			'function'	=> $function,
			'message'	=> $message,
		);
		$this->formatErrors[] = $tmp;
	}

	/**
	 * Returns any errors found in the sheet
	 * @return mixed Array of errors if they exist, otherwise false
	 */
	public function getErrors(){
		return($this->formatErrors);
	}

	
	// Change Options
	
	/**
     * Changes the name of the named style
     * @param string $name The named style referenced by Excel.
     */
	public function name($name){$this->name = $name; }
	////////////////////////
	
	// Change Alignment
	/**
     * Changes the vertical alignment setting for the style
     * @param string $valign The value for the vertical alignment.
     * Acceptable values are "Automatic" "Top" "Bottom" "Center"
     */
	public function alignVertical($valign){
		// Automatic, Top, Bottom, Center
		if ($valign != 'Automatic'
			&& $valign != 'Top'
			&& $valign != 'Bottom'
			&& $valign != 'Center'){
			$this->addError(__FUNCTION__,'vertical alignment was not valid "'.$valign.'"');
			return;
		}
		$this->valign = $valign;
		$this->useAlignment = true;
	}
	
	/**
     * Changes the horizontal alignment setting for the style
     * @param string $halign The value for the horizontal alignment. Acceptable
     * values are "Automatic" "Left" "Center" "Right"
     */
	public function alignHorizontal($halign){
		// Automatic, Left, Center, Right
		if ($halign != 'Automatic'
			&& $halign != 'Left'
			&& $halign != 'Center'
			&& $halign != 'Right'){
			$this->addError(__FUNCTION__,'horizontal alignment was not valid "'.$halign.'"');
			$halign = 'Automatic';
		}
		$this->halign = $halign;
		$this->useAlignment = true;
	}
	
	/**
     * Changes the rotation setting for the style
     * @param mixed $rotate The value for the Rotation.  Value must be a
     * number between -90 and 90
     */
	public function alignRotate($rotate){
		// Degrees to rotate the text
		if (!is_numeric($rotate)){
			$this->addError(__FUNCTION__,'rotation was not numeric "'.$rotate.'"');
			return;
		}
		if (abs($rotate) > 90){
			$rotate = $rotate % 90;
			$this->addError(__FUNCTION__,'rotation was greater than 90, defaulted to "'.$rotate.'"');
		}
		$this->rotate = $rotate;
		$this->useAlignment = true;
	}
	
	/**
     * Changes the Shrink To Fit setting for the style
     * ShrinkToFit shrinks the text so that it fits within the cell.
     * This doesn't actually work.
     */
	public function alignShrinktofit(){
		$this->shrinktofit = 1;
		$this->useAlignment = true;
	}
	
	/**
     * Changes the Vertical Text setting for the style.
     * Text will be displayed vertically.
     */
	public function alignVerticaltext(){
		$this->verticaltext = 1;
		$this->useAlignment = true;
	}
	
	/**
     * Changes the Wrap Text setting for the style.
     */
	public function alignWraptext(){
		$this->wraptext = 1;
		$this->useAlignment = true;
	}
	/////////////////////////
	
	// Change Font
	/**
     * Changes the size of the font
     * @param string $fontSize The value for the Size. Value must be greater
     * than zero
     */
	public function fontSize($fontSize = 10){
		if (!is_numeric($fontSize)){
			$fontSize = 10;
			$this->addError(__FUNCTION__,'font size was not a number, defaulted to 10 "'.$fontSize.'"');
		}
		if ($fontSize <= 0){
			$fontSize = 10;
			$this->addError(__FUNCTION__,'font size was less than zero, defaulted to 10 "'.$fontSize.'"');
		}
		$this->fontSize = $fontSize;
		$this->useFont = true;
	}
	
	/**
     * Changes the color for the font
     * @param string $fontColor The value for the Color.
     * This can be a MS named color or a Hex web color.
     */
	public function fontColor($fontColor = 'Automatic'){
		$pattern = "/[0-9a-f]{6}/";
		$fontColor = $this->checkColor($fontColor);
		if ($fontColor === false){
			$this->addError(__FUNCTION__,'font color was not valid "'.$fontColor.'"');
			$fontColor = 'Automatic';
		}
		$this->fontColor = $fontColor;
		$this->useFont = true;
	}
	
	/**
     * Changes the font for the cell
     * @param string $fontName The value for the font name. This should be a
     * standard windows font available on most systems.
     */
	public function fontName($fontName = 'Arial'){
		$this->fontName = $fontName;
		$this->useFont = true;
	}
	
	/**
     * Changes the family for the font
     * @param string $fontFamily The value for the font family. Not really sure
     * what this does.
     * Win32-dependant font family.
     * Values can be "Automatic" "Decorative"
     * "Modern" "Roman" "Script" "Swiss"
     */
	public function fontFamily($fontFamily = 'Swiss'){
		// Win32-dependent font family.
		// Automatic, Decorative, Modern, Roman, Script, and Swiss
		if ($fontFamily != 'Automatic'
			&& $fontFamily != 'Decorative'
			&& $fontFamily != 'Modern'
			&& $fontFamily != 'Roman'
			&& $fontFamily != 'Script'
			&& $fontFamily != 'Swiss'){
			$this->addError(__FUNCTION__,'font family was not valid "'.$fontFamily.'"');
			return;
		}
		$this->fontFamily = $fontFamily;
		$this->useFont = true;
	}
	
	/**
     * Makes the font bold for the named style
     */
	public function fontBold(){
		$this->bold = 1;
		$this->useFont = true;
	}
	
	/**
     * Makes the font italic for the named style
     */
	public function fontItalic(){
		$this->italic = 1;
		$this->useFont = true;
	}
	
	/**
     * Makes the font strikethrough for the named style
     */
	public function fontStrikethrough(){
		$this->strikethrough = 1;
		$this->useFont = true;
	}
	
	/**
     * Makes the font underlined for the named style
     * @param string $uStyle The type of underlining for the style.
     * Acceptable values are "None" "Single" "Double" "SingleAccounting"
     * "DoubleAccounting"
     */
	public function fontUnderline($uStyle = 'Single'){
		// None, Single, Double, SingleAccounting, and DoubleAccounting
		if ($uStyle != 'None'
			&& $uStyle != 'Single'
			&& $uStyle != 'Double'
			&& $uStyle != 'SingleAccounting'
			&& $uStyle != 'DoubleAccounting'){
			$this->addError(__FUNCTION__,'underline type was not valid "'.$uStyle.'"');
			return;
		}
		$this->underline = $uStyle;
		$this->useFont = true;
	}
	
	/**
     * Makes the font shadowed for the named style
     */
	public function fontShadow(){
		$this->shadow = 1;
		$this->useFont = true;
	}

	/**
     * Makes the font outlines for the named style
     */
	public function fontOutline(){
		$this->outline = 1;
		$this->useFont = true;
	}
	//////////////////////////
	
	// Change Border
	
	/**
     * Sets the border for the named style.
     * This function can be called multiple times to set different sides of the
     * cell or set all sides the same at once.
     * @param string $position Sets which side of the cell should be modified.
     * Acceptable values are "All" "Left" "Top" "Right" "Bottom" "DiagonalLeft"
     * "DiagonalRight"
     * @param integer $weight Thickness of the border.  Default is 1 "Thin"
     * @param string $color Color of the border. Default is "Automatic" but any
     * 6-hexadecimal digit number in "#rrggbb" format or it can be any of the
     * Microsoft® Internet Explorer named colors
     * @param string $linestyle Type of line to use on the border.
     * Default is "Continuous".  Acceptable balues are "None" "Continuous"
     * "Dash" "Dot" "DashDot" "DashDotDot" "SlantDashDot" "Double"
     */
	public function border(
		$position = 'All'			// All, Left, Top, Right, Bottom, DiagonalLeft, DiagonalRight
		,$weight = '1'				// 0—Hairline, 1—Thin, 2—Medium, 3—Thick
		,$color = 'Automatic'		// Automatic, 6-hexadecimal digit number in "#rrggbb" format or it can be any of the Microsoft® Internet Explorer named colors
		,$linestyle = 'Continuous'	// None, Continuous, Dash, Dot, DashDot, DashDotDot, SlantDashDot, Double
		){
		
		if ($position != 'All'
			&& $position != 'Left'
			&& $position != 'Top'
			&& $position != 'Right'
			&& $position != 'Bottom'
			&& $position != 'DiagonalLeft'
			&& $position != 'DiagonalRight'){
			$this->addError(__FUNCTION__,'border position was not valid, defaulted to All "'.$position.'"');
			$position = 'All';
		}
		
		if (is_numeric($weight)){
			if (abs($weight) > 3){
				$this->addError(__FUNCTION__,'line weight greater than 3, defaulted to 3 "'.$weight.'"');
				$weight = 3;
			}
		}
		else{
			$this->addError(__FUNCTION__,'line weight not numeric, defaulted to 3 "'.$weight.'"');
			$weight = 1;
		}

		$color = $this->checkColor($color);
		if ($color === false){
			$this->addError(__FUNCTION__,'border color was not valid, defaulted to Automatic "'.$weight.'"');
			$color = 'Automatic';
		}

		if ($linestyle != 'None'
			&& $linestyle != 'Continuous'
			&& $linestyle != 'Dash'
			&& $linestyle != 'Dot'
			&& $linestyle != 'DashDot'
			&& $linestyle != 'DashDotDot'
			&& $linestyle != 'SlantDashDot'
			&& $linestyle != 'Double'){
			$linestyle = 'Continuous';
			$this->addError(__FUNCTION__,'line style was not valid, defaulted to Continuous "'.$linestyle.'"');
		}

		
		$tmp = array(
			'LineStyle'	=> $linestyle,
			'Color'		=> $color,
			'Weight'	=> $weight,
		);
		if ($position == 'Top'		|| $position == 'All') $this->borderTop = $tmp;
		if ($position == 'Bottom'	|| $position == 'All') $this->borderBottom = $tmp;
		if ($position == 'Left'		|| $position == 'All') $this->borderLeft = $tmp;
		if ($position == 'Right'	|| $position == 'All') $this->borderRight = $tmp;
		if ($position == 'DiagonalLeft'	)					$this->borderDL = $tmp;
		if ($position == 'DiagonalRight'	)				$this->borderDR = $tmp;
		
		$this->useBorder = true;
	}
	//////////////////////////
	
	// Change Interior
	/**
     * Sets the background style of a style
     * @param string $color Named color from MS or web color in HEX format (e.g.
     * #ff00ff
     * @param string $pattern Defaults to a None if not supplied.
     * @param string $patternColor Defaults to a Automatic if not supplied.
     */
	public function bgColor($color = 'Yellow',$pattern = 'Solid', $patternColor = null){
		// 6-hexadecimal digit number in "#rrggbb" format
		// Or it can be any of the Internet Explorer named colors
		$color = $this->checkColor($color);
		if ($color === false){
			$color = 'Yellow';
			$this->addError(__FUNCTION__,'cell color not valid, defaulted to Yellow "'.$color.'"');
		}
		$this->interiorColor = $color;
		if ($pattern != 'None'){
			$this->bgPattern($pattern, $patternColor);
		}
		$this->useInterior = true;
	}

	/**
     * Sets the background pattern of a style.
     * @see bgColor()
     * @param string $color Named color from MS or web color in HEX format (e.g.
     * #ff00ff
     * @param string $pattern Defaults to a solid if not supplied.
     */
	public function bgPattern($pattern = 'None', $color = null){
		// None, Solid, Gray75, Gray50, Gray25, Gray125, Gray0625,
		// HorzStripe, VertStripe, ReverseDiagStripe, DiagStripe,
		// DiagCross, ThickDiagCross, ThinHorzStripe, ThinVertStripe,
		// ThinReverseDiagStripe, ThinDiagStripe, ThinHorzCross, and ThinDiagCross
		if ($pattern != 'None'
			&& $pattern != 'Solid'
			&& $pattern != 'Gray75'
			&& $pattern != 'Gray50'
			&& $pattern != 'Gray25'
			&& $pattern != 'Gray125'
			&& $pattern != 'Gray0625'
			&& $pattern != 'HorzStripe'
			&& $pattern != 'VertStripe'
			&& $pattern != 'ReverseDiagStripe'
			&& $pattern != 'DiagStripe'
			&& $pattern != 'DiagCross'
			&& $pattern != 'ThickDiagCross'
			&& $pattern != 'ThinHorzStripe'
			&& $pattern != 'ThinVertStripe'
			&& $pattern != 'ThinReverseDiagStripe'
			&& $pattern != 'ThinDiagStripe'
			&& $pattern != 'ThinHorzCross'
			&& $pattern != 'ThinDiagCross'){
			$pattern = 'None';
			$this->addError(__FUNCTION__,'cell pattern was not valid, defaulted to Solid "'.$pattern.'"');
		}

		$this->interiorPattern = $pattern;
		if ($color != null) $this->bgPatternColor($color);
		$this->useInterior = true;
	}

	/**
     * Specifies the secondary fill color of the cell when Pattern does not equal Solid.
     * @see function bgPattern()
     * @param string $color Named color from MS or web color in HEX format (e.g.
     * #ff00ff
     * @param string $pattern Defaults to a solid if not supplied.
     */
	public function bgPatternColor($color = 'Yellow'){
		// 6-hexadecimal digit number in "#rrggbb" format
		// Or it can be any of the Internet Explorer named colors
		if ($color != 'Automatic'){
			$color = $this->checkColor($color);
			if ($color === false){
				$color = 'Automatic';
				$this->addError(__FUNCTION__,'cell pattern color was not valid, defaulted to Automatic "'.$color.'"');
			}
		}
		$this->interiorPatternColor = $color;
		$this->useInterior = true;
	}

	//////////////////////////
	
	// Number Formats

	/**
     * Sets the number format of a style
     * @param string $formatString Format string to be used by Excel for
     * displaying the number.
     */
	public function numberFormat($formatString){$this->numberFormat = $formatString;}

	/**
     * Sets a default date format for a style
     */
	public function numberFormatDate(){$this->numberFormat('mm/dd/yy');}

	/**
     * Sets a default time format for a style
     */
	public function numberFormatTime(){$this->numberFormat('hh:mm:ss');}

	/**
     * Sets a default date and time format for a style
     */
	public function numberFormatDatetime(){$this->numberFormat('mm/dd/yy\ hh:mm:ss');}
	//////////////////////////
}
?>