<?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, $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');}

	//////////////////////////

}

?>