Exemplo n.º 1
5
/**
* Converts all data from the template table for a style into the style table
*
* @param	integer	Style ID
* @param	string	Title of style
* @param	array	Array of actions set to true/false: docss/dostylevars/doreplacements/doposteditor
* @param	string	List of parent styles
* @param	string	Indent for HTML printing
*/
function build_style($styleid, $title = '', $actions = array(), $parentlist = '', $indent = '')
{
	global $vbulletin, $_queries, $vbphrase, $_query_special_templates;
	static $phrase, $csscache;

	if (($actions['doreplacements'] OR $actions['docss'] OR $actions['dostylevars']) AND $vbulletin->options['storecssasfile'])
	{
		$actions['docss'] = true;
		$actions['doreplacements'] = true;
	}

	if ($styleid != -1)
	{
		$QUERY = array(
			'' => "dateline = " . TIMENOW
		);
		// echo the title and start the listings
		echo "$indent<li><b>$title</b> ... <span class=\"smallfont\">";
		vbflush();

		// build the templateid cache
		if (!$parentlist)
		{
			$parentlist = fetch_parentids($styleid);
		}

		$templatelist = build_template_id_cache($styleid, 1, $parentlist);
		$QUERY[] = "templatelist = '" . $vbulletin->db->escape_string($templatelist)  . "'";
		echo "($vbphrase[templates]) ";
		vbflush();

		// cache special templates
		if ($actions['docss'] OR $actions['dostylevars'] OR $actions['doreplacements'] OR $actions['doposteditor'])
		{
			// get special templates for this style
			$template_cache = array();
			$templateids = implode(',' , unserialize($templatelist));
			$templates = $vbulletin->db->query_read("
				SELECT title, template, templatetype
				FROM " . TABLE_PREFIX . "template
				WHERE templateid IN ($templateids)
					AND (templatetype <> 'template' OR title IN('" . implode("', '", $_query_special_templates) . "'))
			");
			while ($template = $vbulletin->db->fetch_array($templates))
			{
				$template_cache["$template[templatetype]"]["$template[title]"] = $template;
			}
			$vbulletin->db->free_result($templates);
		}

		// style vars
		if ($actions['dostylevars'])
		{
			// rebuild the stylevars field for this style
			$stylevars = array();
			foreach($template_cache['stylevar'] AS $template)
			{
				// set absolute paths for image directories
				/*if (substr($template['title'], 0, 7) == 'imgdir_')
				{
					if (!preg_match('#^https?://#i', $template['template']))
					{
						$template['template'] = "$template[template]";
					}
				}*/
				$stylevars["$template[title]"] = $template['template'];
			}

			$QUERY[] = "stylevars = '" . $vbulletin->db->escape_string(serialize($stylevars)) . '\'';
			echo "($vbphrase[stylevars]) ";
			vbflush();


			static $master_stylevar_cache = null;
			if ($master_stylevar_cache === null)
			{
				$master_stylevar_cache = array();
				$master_stylevars = $vbulletin->db->query_read("
				SELECT stylevardfn.stylevarid, stylevardfn.datatype, stylevar.value
				FROM " . TABLE_PREFIX . "stylevardfn AS stylevardfn
				LEFT JOIN " . TABLE_PREFIX . "stylevar AS stylevar ON (stylevardfn.stylevarid = stylevar.stylevarid AND stylevar.styleid = -1)
				");
				while ($master_stylevar = $vbulletin->db->fetch_array($master_stylevars))
				{
					$tmp = unserialize($master_stylevar['value']);
					if (!is_array($tmp))
					{
						$tmp = array('value' => $tmp);
					}

					$master_stylevar_cache[$master_stylevar['stylevarid']] = $tmp;
					$master_stylevar_cache[$master_stylevar['stylevarid']]['datatype'] = $master_stylevar['datatype'];
				}

			}

			$newstylevars = $master_stylevar_cache;

			if (substr(trim($parentlist), 0, -3) != '')
			{
				$new_stylevars = $vbulletin->db->query_read($sql = "
				SELECT stylevarid, styleid, value, INSTR(',$parentlist,', CONCAT(',', styleid, ',') ) AS ordercontrol
				FROM " . TABLE_PREFIX . "stylevar
				WHERE styleid IN (" . substr(trim($parentlist), 0, -3) . ")
				ORDER BY ordercontrol DESC
				");
				while ($new_stylevar = $vbulletin->db->fetch_array($new_stylevars))
				{
					$newstylevars[$new_stylevar['stylevarid']] = unserialize($new_stylevar['value']);
					$newstylevars[$new_stylevar['stylevarid']]['datatype'] = $master_stylevar_cache[$new_stylevar['stylevarid']]['datatype'];
				}
			}

			$QUERY[] = "newstylevars = '" . $vbulletin->db->escape_string(serialize($newstylevars)) . '\'';

		}

		// replacements
		if ($actions['doreplacements'])
		{
			// rebuild the replacements field for this style
			$replacements = array();
			if (is_array($template_cache['replacement']))
			{
				foreach($template_cache['replacement'] AS $template)
				{
					// set the key to be a case-insentitive preg find string
					$replacementkey = '#' . preg_quote($template['title'], '#') . '#si';

					$replacements["$replacementkey"] = $template['template'];
				}
				$QUERY[] = 'replacements = \'' . $vbulletin->db->escape_string(serialize($replacements)) . '\'';
			}
			else
			{
				$QUERY[] = 'replacements = \'\'';
			}
			echo "($vbphrase[replacement_variables]) ";
			vbflush();
		}



		// css -- old style css
		if ($actions['docss'])
		{
			// build a quick cache with the ~old~ contents of the css fields from the style table
			if (!is_array($csscache))
			{
				$csscache = array();
				$fetchstyles = $vbulletin->db->query_read("SELECT styleid, css FROM " . TABLE_PREFIX . "style");
				while ($fetchstyle = $vbulletin->db->fetch_array($fetchstyles))
				{
					$fetchstyle['css'] .= "\n";
					$csscache["$fetchstyle[styleid]"] = $fetchstyle['css'];
				}
			}

			// rebuild the css field for this style
			$css = array();
			foreach($template_cache['css'] AS $template)
			{
				$css["$template[title]"] = unserialize($template['template']);
			}

			// build the CSS contents
			$csscolors = array();
			$css = construct_css($css, $styleid, $title, $csscolors);

			// attempt to delete the old css file if it exists
			delete_css_file($styleid, $csscache["$styleid"]);

			$adblock_is_evil = str_replace('ad', 'be', substr(md5(microtime()), 8, 8));
			$cssfilename = 'clientscript/vbulletin_css/style-' . $adblock_is_evil . '-' . str_pad($styleid, 5, '0', STR_PAD_LEFT) . '.css';

			// if we are going to store CSS as files, run replacement variable substitution on the file to be saved
			if ($vbulletin->options['storecssasfile'])
			{
				$css = process_replacement_vars($css, array('styleid' => $styleid, 'replacements' => serialize($replacements)));
				$css = preg_replace('#(?<=[^a-z0-9-]|^)url\((\'|"|)(.*)\\1\)#iUe', "rewrite_css_file_url('\\2', '\\1')", $css);
				if (write_css_file($cssfilename, $css))
				{
					$css = "@import url(\"$cssfilename\");";
				}
			}

			$fullcsstext = "<style type=\"text/css\" id=\"vbulletin_css\">\r\n" .
				"/**\r\n* vBulletin " . $vbulletin->options['templateversion'] . " CSS\r\n* Style: '$title'; Style ID: $styleid\r\n*/\r\n" .
				"$css\r\n</style>\r\n" .
				"<link rel=\"stylesheet\" type=\"text/css\" href=\"clientscript/vbulletin_important.css?v=" . $vbulletin->options['simpleversion'] . "\" />"
			;

			$QUERY[] = "css = '" . $vbulletin->db->escape_string($fullcsstext) . "'";
			$QUERY[] = "csscolors = '" . $vbulletin->db->escape_string(serialize($csscolors)) . "'";

			echo "($vbphrase[css]) ";
			vbflush();
		}

		// post editor styles
		if ($actions['doposteditor'])
		{
			$editorstyles = array();
			foreach ($template_cache['template'] AS $template)
			{
				if (substr($template['title'], 0, 13) == 'editor_styles')
				{
					$title = 'pi' . substr($template['title'], 13);
					$item = fetch_posteditor_styles($template['template']);
					$editorstyles["$title"] = array($item['background'], $item['color'], $item['padding'], $item['border']);
				}
			}
			$QUERY[] = 'editorstyles = \'' . $vbulletin->db->escape_string(serialize($editorstyles)) . '\'';
			echo "($vbphrase[controls]) ";
			vbflush();
		}

		// do the style update query
		if (sizeof($QUERY))
		{
			$vbulletin->db->query_write("UPDATE " . TABLE_PREFIX . "style SET\n" . implode(",\n", $QUERY) . "\nWHERE styleid = $styleid");
		}

		//write out the new css -- do this *after* we update the style record
		if ($vbulletin->options['storecssasfile'])
		{
			if (!write_style_css_directory($styleid, $parentlist, 'ltr'))
			{
				echo fetch_error("rebuild_failed_to_write_css");
			}
			else if (!write_style_css_directory($styleid, $parentlist, 'rtl'))
			{
				echo fetch_error("rebuild_failed_to_write_css");
			}
		}
		else
		{
			// race condition here
			//delete_style_css_directory($styleid, 'ltr');
			//delete_style_css_directory($styleid, 'rtl');
		}

		// finish off the listings
		echo "</span><b>" . $vbphrase['done'] . "</b>.<br />&nbsp;</li>\n"; vbflush();
	}

	$childsets = $vbulletin->db->query_read("
		SELECT styleid, title, parentlist
		FROM " . TABLE_PREFIX . "style
		WHERE parentid = $styleid
	");
	if ($vbulletin->db->num_rows($childsets))
	{
		echo "$indent<ul class=\"ldi\">\n";
		while ($childset = $vbulletin->db->fetch_array($childsets))
		{
			build_style($childset['styleid'], $childset['title'], $actions, $childset['parentlist'], $indent . "\t");
		}
		echo "$indent</ul>\n";
	}
}
Exemplo n.º 2
0
/**
* Converts all data from the template table for a style into the style table
*
* @param	integer	Style ID
* @param	string	Title of style
* @param	array	Array of actions set to true/false: docss/dostylevars/doreplacements/doposteditor
* @param	string	List of parent styles
* @param	string	Indent for HTML printing
*/
function build_style($styleid, $title = '', $actions, $parentlist = '', $indent = '')
{
    global $vbulletin, $_queries, $vbphrase, $_query_special_templates;
    static $phrase, $csscache;
    if (($actions['doreplacements'] or $actions['docss']) and $vbulletin->options['storecssasfile']) {
        $actions['docss'] = true;
        $actions['doreplacements'] = true;
    }
    if ($styleid != -1) {
        $QUERY = array();
        // echo the title and start the listings
        echo "{$indent}<li><b>{$title}</b> ... <span class=\"smallfont\">";
        vbflush();
        // build the templateid cache
        $templatelist = build_template_id_cache($styleid, 1, $parentlist);
        $QUERY[] = "templatelist = '" . $vbulletin->db->escape_string($templatelist) . "'";
        echo "({$vbphrase['templates']}) ";
        vbflush();
        // cache special templates
        if ($actions['docss'] or $actions['dostylevars'] or $actions['doreplacements'] or $actions['doposteditor']) {
            // get special templates for this style
            $template_cache = array();
            $templateids = implode(',', unserialize($templatelist));
            $templates = $vbulletin->db->query_read("\n\t\t\t\tSELECT title, template, templatetype\n\t\t\t\tFROM " . TABLE_PREFIX . "template\n\t\t\t\tWHERE templateid IN ({$templateids})\n\t\t\t\t\tAND (templatetype <> 'template' OR title IN('" . implode("', '", $_query_special_templates) . "'))\n\t\t\t");
            while ($template = $vbulletin->db->fetch_array($templates)) {
                $template_cache["{$template['templatetype']}"]["{$template['title']}"] = $template;
            }
            $vbulletin->db->free_result($templates);
        }
        // style vars
        if ($actions['dostylevars']) {
            // rebuild the stylevars field for this style
            $stylevars = array();
            foreach ($template_cache['stylevar'] as $template) {
                // set absolute paths for image directories
                /*if (substr($template['title'], 0, 7) == 'imgdir_')
                		{
                			if (!preg_match('#^https?://#i', $template['template']))
                			{
                				$template['template'] = "$template[template]";
                			}
                		}*/
                $stylevars["{$template['title']}"] = $template['template'];
            }
            $QUERY[] = "stylevars = '" . $vbulletin->db->escape_string(serialize($stylevars)) . '\'';
            echo "({$vbphrase['stylevars']}) ";
            vbflush();
        }
        // replacements
        if ($actions['doreplacements']) {
            // rebuild the replacements field for this style
            $replacements = array();
            if (is_array($template_cache['replacement'])) {
                foreach ($template_cache['replacement'] as $template) {
                    // set the key to be a case-insentitive preg find string
                    $replacementkey = '#' . preg_quote($template['title'], '#') . '#si';
                    $replacements["{$replacementkey}"] = $template['template'];
                }
                $QUERY[] = 'replacements = \'' . $vbulletin->db->escape_string(serialize($replacements)) . '\'';
            } else {
                $QUERY[] = 'replacements = \'\'';
            }
            echo "({$vbphrase['replacement_variables']}) ";
            vbflush();
        }
        // css
        if ($actions['docss']) {
            // build a quick cache with the ~old~ contents of the css fields from the style table
            if (!is_array($csscache)) {
                $csscache = array();
                $fetchstyles = $vbulletin->db->query_read("SELECT styleid, css FROM " . TABLE_PREFIX . "style");
                while ($fetchstyle = $vbulletin->db->fetch_array($fetchstyles)) {
                    $fetchstyle['css'] .= "\n";
                    $csscache["{$fetchstyle['styleid']}"] = $fetchstyle['css'];
                }
            }
            // rebuild the css field for this style
            $css = array();
            foreach ($template_cache['css'] as $template) {
                $css["{$template['title']}"] = unserialize($template['template']);
            }
            // build the CSS contents
            $csscolors = array();
            $css = construct_css($css, $styleid, $title, $csscolors);
            // attempt to delete the old css file if it exists
            delete_css_file($styleid, $csscache["{$styleid}"]);
            $adblock_is_evil = str_replace('ad', 'be', substr(md5(microtime()), 8, 8));
            $cssfilename = 'clientscript/vbulletin_css/style-' . $adblock_is_evil . '-' . str_pad($styleid, 5, '0', STR_PAD_LEFT) . '.css';
            // if we are going to store CSS as files, run replacement variable substitution on the file to be saved
            if ($vbulletin->options['storecssasfile'] and write_css_file($cssfilename, process_replacement_vars($css, array('styleid' => $styleid, 'replacements' => serialize($replacements))))) {
                $css = "@import url(\"{$cssfilename}\");";
            }
            $fullcsstext = "<style type=\"text/css\" id=\"vbulletin_css\">\r\n" . "/**\r\n* vBulletin " . $vbulletin->options['templateversion'] . " CSS\r\n* Style: '{$title}'; Style ID: {$styleid}\r\n*/\r\n" . "{$css}\r\n</style>\r\n" . "<link rel=\"stylesheet\" type=\"text/css\" href=\"clientscript/vbulletin_important.css?v=" . $vbulletin->options['simpleversion'] . "\" />";
            $QUERY[] = "css = '" . $vbulletin->db->escape_string($fullcsstext) . "'";
            $QUERY[] = "csscolors = '" . $vbulletin->db->escape_string(serialize($csscolors)) . "'";
            echo "({$vbphrase['css']}) ";
            vbflush();
        }
        // post editor styles
        if ($actions['doposteditor']) {
            $editorstyles = array();
            foreach ($template_cache['template'] as $template) {
                if (substr($template['title'], 0, 13) == 'editor_styles') {
                    $title = 'pi' . substr($template['title'], 13);
                    $item = fetch_posteditor_styles($template['template']);
                    $editorstyles["{$title}"] = array($item['background'], $item['color'], $item['padding'], $item['border']);
                }
            }
            $QUERY[] = 'editorstyles = \'' . $vbulletin->db->escape_string(serialize($editorstyles)) . '\'';
            echo "({$vbphrase['controls']}) ";
            vbflush();
        }
        // do the style update query
        if (sizeof($QUERY)) {
            $vbulletin->db->query_write("UPDATE " . TABLE_PREFIX . "style SET\n" . implode(",\n", $QUERY) . "\nWHERE styleid = {$styleid}");
        }
        // finish off the listings
        echo "</span><b>" . $vbphrase['done'] . "</b>.<br />&nbsp;</li>\n";
        vbflush();
    }
    $childsets = $vbulletin->db->query_read("\n\t\tSELECT styleid, title, parentlist\n\t\tFROM " . TABLE_PREFIX . "style\n\t\tWHERE parentid = {$styleid}\n\t");
    if ($vbulletin->db->num_rows($childsets)) {
        echo "{$indent}<ul class=\"ldi\">\n";
        while ($childset = $vbulletin->db->fetch_array($childsets)) {
            build_style($childset['styleid'], $childset['title'], $actions, $childset['parentlist'], $indent . "\t");
        }
        echo "{$indent}</ul>\n";
    }
}
Exemplo n.º 3
0
 public function post_save_once($doquery = true)
 {
     parent::post_save_once($doquery);
     require_once DIR . '/includes/adminfunctions_template.php';
     //print_rebuild_style(-1, '', 0, 1, 1, 0, false);
     build_style(-1, '', array('docss' => 0, 'dostylevars' => 1, 'doreplacements' => 0, 'doposteditor' => 0), '-1,1', '', false, false);
 }
Exemplo n.º 4
0
/**
* Converts all data from the template table for a style into the style table
*
* @param	integer	Style ID
* @param	string	Title of style
* @param	array	Array of actions set to true/false: docss/dostylevars/doreplacements
* @param	string	List of parent styles
* @param	string	Indent for HTML printing
* @param	boolean	Reset the master cache
*/
function build_style($styleid, $title = '', $actions = array(), $parentlist = '', $indent = '', $resetcache = false)
{
    global $vbulletin, $_queries, $vbphrase, $_query_special_templates;
    static $phrase, $csscache;
    if (($actions['doreplacements'] or $actions['docss'] or $actions['dostylevars']) and $vbulletin->options['storecssasfile']) {
        $actions['docss'] = true;
        $actions['doreplacements'] = true;
    }
    if ($styleid != -1 and $styleid != -2) {
        $style = $vbulletin->db->query_first("\n\t\t\tSELECT *\n\t\t\tFROM " . TABLE_PREFIX . "style\n\t\t\tWHERE styleid = {$styleid}\n\t\t");
        $masterstyleid = $style['type'] == 'standard' ? -1 : -2;
        $QUERY = array('' => "dateline = " . TIMENOW);
        if (VB_AREA != 'Upgrade' and VB_AREA != 'Install') {
            // echo the title and start the listings
            echo "{$indent}<li><b>{$title}</b> ... <span class=\"smallfont\">";
            vbflush();
        }
        // build the templateid cache
        if (!$parentlist) {
            $parentlist = fetch_parentids($styleid);
        }
        $templatelist = build_template_id_cache($styleid, 1, $parentlist);
        $QUERY[] = "templatelist = '" . $vbulletin->db->escape_string($templatelist) . "'";
        if (VB_AREA != 'Upgrade' and VB_AREA != 'Install') {
            echo "({$vbphrase['templates']}) ";
            vbflush();
        }
        // cache special templates
        if ($actions['docss'] or $actions['dostylevars'] or $actions['doreplacements']) {
            // get special templates for this style
            $template_cache = array();
            if ($templateids = implode(',', unserialize($templatelist))) {
                $templates = $vbulletin->db->query_read("\n\t\t\t\t\tSELECT title, template, templatetype\n\t\t\t\t\tFROM " . TABLE_PREFIX . "template\n\t\t\t\t\tWHERE templateid IN ({$templateids})\n\t\t\t\t\t\tAND (templatetype <> 'template' OR title IN('" . implode("', '", $_query_special_templates) . "'))\n\t\t\t\t");
                while ($template = $vbulletin->db->fetch_array($templates)) {
                    $template_cache["{$template['templatetype']}"]["{$template['title']}"] = $template;
                }
                $vbulletin->db->free_result($templates);
            }
        }
        // style vars
        if ($actions['dostylevars']) {
            // rebuild the stylevars field for this style
            $stylevars = array();
            if ($template_cache['stylevar']) {
                foreach ($template_cache['stylevar'] as $template) {
                    $stylevars["{$template['title']}"] = $template['template'];
                }
                $QUERY[] = "stylevars = '" . $vbulletin->db->escape_string(serialize($stylevars)) . '\'';
            }
            if (VB_AREA != 'Upgrade' and VB_AREA != 'Install') {
                echo "({$vbphrase['stylevars']}) ";
                vbflush();
            }
            static $master_stylevar_cache = array(-1 => null, -2 => null);
            static $resetcachedone = array(-1 => false, -2 => false);
            if ($resetcache and !$resetcachedone[$masterstyleid]) {
                $resetcachedone[$masterstyleid] = true;
                $master_stylevar_cache[$masterstyleid] = null;
            }
            if ($master_stylevar_cache[$masterstyleid] === null) {
                $master_stylevar_cache[$masterstyleid] = array();
                $master_stylevars = $vbulletin->db->query_read("\n\t\t\t\tSELECT stylevardfn.stylevarid, stylevardfn.datatype, stylevar.value\n\t\t\t\tFROM " . TABLE_PREFIX . "stylevardfn AS stylevardfn\n\t\t\t\tLEFT JOIN " . TABLE_PREFIX . "stylevar AS stylevar ON (stylevardfn.stylevarid = stylevar.stylevarid AND stylevar.styleid = {$masterstyleid})\n\t\t\t\t");
                while ($master_stylevar = $vbulletin->db->fetch_array($master_stylevars)) {
                    $tmp = unserialize($master_stylevar['value']);
                    if (!is_array($tmp)) {
                        $tmp = array('value' => $tmp);
                    }
                    $master_stylevar_cache[$masterstyleid][$master_stylevar['stylevarid']] = $tmp;
                    $master_stylevar_cache[$masterstyleid][$master_stylevar['stylevarid']]['datatype'] = $master_stylevar['datatype'];
                }
            }
            $newstylevars = $master_stylevar_cache[$masterstyleid];
            if (substr(trim($parentlist), 0, -3) != '') {
                $new_stylevars = $vbulletin->db->query_read($sql = "\n\t\t\t\tSELECT\n\t\t\t\t\tstylevarid, styleid, value, INSTR(',{$parentlist},', CONCAT(',', styleid, ',') ) AS ordercontrol\n\t\t\t\tFROM " . TABLE_PREFIX . "stylevar\n\t\t\t\tWHERE\n\t\t\t\t\tstyleid IN (" . substr(trim($parentlist), 0, -3) . ")\n\t\t\t\tORDER BY\n\t\t\t\t\tordercontrol DESC\n\t\t\t\t");
                while ($new_stylevar = $vbulletin->db->fetch_array($new_stylevars)) {
                    $newstylevars[$new_stylevar['stylevarid']] = unserialize($new_stylevar['value']);
                    $newstylevars[$new_stylevar['stylevarid']]['datatype'] = $master_stylevar_cache[$masterstyleid][$new_stylevar['stylevarid']]['datatype'];
                }
            }
            if ($newstylevars) {
                $QUERY[] = "newstylevars = '" . $vbulletin->db->escape_string(serialize($newstylevars)) . '\'';
            }
        }
        // replacements
        if ($actions['doreplacements']) {
            // rebuild the replacements field for this style
            $replacements = array();
            if (is_array($template_cache['replacement'])) {
                foreach ($template_cache['replacement'] as $template) {
                    // set the key to be a case-insentitive preg find string
                    $replacementkey = '#' . preg_quote($template['title'], '#') . '#si';
                    $replacements["{$replacementkey}"] = $template['template'];
                }
                $QUERY[] = 'replacements = \'' . $vbulletin->db->escape_string(serialize($replacements)) . '\'';
            } else {
                $QUERY[] = 'replacements = \'\'';
            }
            if (VB_AREA != 'Upgrade' and VB_AREA != 'Install') {
                echo "({$vbphrase['replacement_variables']}) ";
                vbflush();
            }
        }
        // css -- old style css
        if ($actions['docss'] and $template_cache['css']) {
            // build a quick cache with the ~old~ contents of the css fields from the style table
            if (!is_array($csscache)) {
                $csscache = array();
                $fetchstyles = $vbulletin->db->query_read("SELECT styleid, css FROM " . TABLE_PREFIX . "style");
                while ($fetchstyle = $vbulletin->db->fetch_array($fetchstyles)) {
                    $fetchstyle['css'] .= "\n";
                    $csscache["{$fetchstyle['styleid']}"] = $fetchstyle['css'];
                }
            }
            // rebuild the css field for this style
            $css = array();
            foreach ($template_cache['css'] as $template) {
                $css["{$template['title']}"] = unserialize($template['template']);
            }
            // build the CSS contents
            $csscolors = array();
            $css = construct_css($css, $styleid, $title, $csscolors);
            // attempt to delete the old css file if it exists
            delete_css_file($styleid, $csscache["{$styleid}"]);
            $adblock_is_evil = str_replace('ad', 'be', substr(md5(microtime()), 8, 8));
            $cssfilename = 'clientscript/vbulletin_css/style-' . $adblock_is_evil . '-' . str_pad($styleid, 5, '0', STR_PAD_LEFT) . '.css';
            // if we are going to store CSS as files, run replacement variable substitution on the file to be saved
            if ($vbulletin->options['storecssasfile']) {
                $css = process_replacement_vars($css, array('styleid' => $styleid, 'replacements' => serialize($replacements)));
                $css = preg_replace('#(?<=[^a-z0-9-]|^)url\\((\'|"|)(.*)\\1\\)#iUe', "rewrite_css_file_url('\\2', '\\1')", $css);
                if (write_css_file($cssfilename, $css)) {
                    $css = "@import url(\"{$cssfilename}\");";
                }
            }
            $fullcsstext = "<style type=\"text/css\" id=\"vbulletin_css\">\r\n" . "/**\r\n* vBulletin " . $vbulletin->options['templateversion'] . " CSS\r\n* Style: '{$title}'; Style ID: {$styleid}\r\n*/\r\n" . "{$css}\r\n</style>\r\n" . "<link rel=\"stylesheet\" type=\"text/css\" href=\"clientscript/vbulletin_important.css?v=" . $vbulletin->options['simpleversion'] . "\" />";
            $QUERY[] = "css = '" . $vbulletin->db->escape_string($fullcsstext) . "'";
            $QUERY[] = "csscolors = '" . $vbulletin->db->escape_string(serialize($csscolors)) . "'";
            if (VB_AREA != 'Upgrade' and VB_AREA != 'Install') {
                echo "({$vbphrase['css']}) ";
                vbflush();
            }
        }
        // do the style update query
        if (sizeof($QUERY)) {
            $vbulletin->db->query_write("UPDATE " . TABLE_PREFIX . "style SET\n" . implode(",\n", $QUERY) . "\nWHERE styleid = {$styleid}");
        }
        //write out the new css -- do this *after* we update the style record
        if ($vbulletin->options['storecssasfile']) {
            if (!write_style_css_directory($styleid, $parentlist, 'ltr')) {
                if (VB_AREA != 'Upgrade' and VB_AREA != 'Install') {
                    echo fetch_error("rebuild_failed_to_write_css");
                } else {
                    return fetch_error("rebuild_failed_to_write_css");
                }
            } else {
                if (!write_style_css_directory($styleid, $parentlist, 'rtl')) {
                    if (VB_AREA != 'Upgrade' and VB_AREA != 'Install') {
                        echo fetch_error("rebuild_failed_to_write_css");
                    } else {
                        return fetch_error("rebuild_failed_to_write_css");
                    }
                }
            }
        } else {
            // race condition here
            //delete_style_css_directory($styleid, 'ltr');
            //delete_style_css_directory($styleid, 'rtl');
        }
        // finish off the listings
        if (VB_AREA != 'Upgrade' and VB_AREA != 'Install') {
            echo "</span><b>" . $vbphrase['done'] . "</b>.<br />&nbsp;</li>\n";
            vbflush();
        }
    }
    $childsets = $vbulletin->db->query_read("\n\t\tSELECT\n\t\t\tstyleid, title, parentlist\n\t\tFROM " . TABLE_PREFIX . "style\n\t\tWHERE\n\t\t\tparentid = {$styleid}\n\t");
    if ($vbulletin->db->num_rows($childsets)) {
        if (VB_AREA != 'Upgrade' and VB_AREA != 'Install') {
            echo "{$indent}<ul class=\"ldi\">\n";
        }
        while ($childset = $vbulletin->db->fetch_array($childsets)) {
            if ($error = build_style($childset['styleid'], $childset['title'], $actions, $childset['parentlist'], $indent . "\t", $resetcache)) {
                return $error;
            }
        }
        if (VB_AREA != 'Upgrade' and VB_AREA != 'Install') {
            echo "{$indent}</ul>\n";
        }
    }
}
/**
* Converts all data from the template table for a style into the style table
*
* @param	integer	Style ID
* @param	string	Title of style
* @param	array	Array of actions set to true/false: docss/dostylevars/doreplacements/doposteditor
* @param	string	List of parent styles
* @param	string	Indent for HTML printing
* @param	boolean	Reset the master cache
* @param	boolean	Whether to print status/edit information
*/
function build_style($styleid, $title = '', $actions = array(), $parentlist = '', $indent = '', $resetcache = false, $printInfo = true)
{
    require_once DIR . '/includes/adminfunctions.php';
    static $csscache = array();
    $vbphrase = vB_Api::instanceInternal('phrase')->fetch(array('templates', 'stylevars', 'replacement_variables', 'css', 'controls', 'done'));
    if (($actions['doreplacements'] or $actions['docss'] or $actions['dostylevars']) and vB::getDatastore()->getOption('storecssasfile')) {
        $actions['docss'] = true;
        $actions['doreplacements'] = true;
    }
    if ($styleid != -1) {
        if ($printInfo and (VB_AREA != 'Upgrade' and VB_AREA != 'Install')) {
            // echo the title and start the listings
            echo "{$indent}<li><b>{$title}</b> ... <span class=\"smallfont\">";
            vbflush();
        }
        // build the templateid cache
        if (!$parentlist) {
            $parentlist = vB_Library::instance('Style')->fetchTemplateParentlist($styleid);
        }
        $templatelist = vB_Library::instance('Style')->buildTemplateIdCache($styleid, 1, $parentlist);
        $styleupdate = array();
        $styleupdate['templatelist'] = $templatelist;
        if ($printInfo and (VB_AREA != 'Upgrade' and VB_AREA != 'Install')) {
            echo "({$vbphrase['templates']}) ";
            vbflush();
        }
        // cache special templates
        if ($actions['docss'] or $actions['dostylevars'] or $actions['doreplacements'] or $actions['doposteditor']) {
            // get special templates for this style
            $template_cache = array();
            $templateids = unserialize($templatelist);
            $specials = vB_Api::instanceInternal('template')->fetchSpecialTemplates();
            if ($templateids) {
                $templates = vB::getDbAssertor()->assertQuery('vBForum:fetchtemplatewithspecial', array('templateids' => $templateids, 'specialtemplates' => $specials));
                foreach ($templates as $template) {
                    $template_cache["{$template['templatetype']}"]["{$template['title']}"] = $template;
                }
            }
        }
        // style vars
        if ($actions['dostylevars']) {
            if ($template_cache['stylevar']) {
                // rebuild the stylevars field for this style
                $stylevars = array();
                foreach ($template_cache['stylevar'] as $template) {
                    // set absolute paths for image directories
                    /*if (substr($template['title'], 0, 7) == 'imgdir_')
                    		{
                    			if (!preg_match('#^https?://#i', $template['template']))
                    			{
                    				$template['template'] = "$template[template]";
                    			}
                    		}*/
                    $stylevars["{$template['title']}"] = $template['template'];
                }
            }
            // new stylevars
            static $master_stylevar_cache = null;
            static $resetcachedone = false;
            if ($resetcache and !$resetcachedone) {
                $resetcachedone = true;
                $master_stylevar_cache = null;
            }
            if ($master_stylevar_cache === null) {
                $master_stylevar_cache = array();
                $master_stylevars = vB::getDbAssertor()->assertQuery('vBForum:getDefaultStyleVars', array(vB_dB_Query::TYPE_KEY => vB_dB_Query::QUERY_STORED));
                foreach ($master_stylevars as $master_stylevar) {
                    $tmp = unserialize($master_stylevar['value']);
                    if (!is_array($tmp)) {
                        $tmp = array('value' => $tmp);
                    }
                    $master_stylevar_cache[$master_stylevar['stylevarid']] = $tmp;
                    $master_stylevar_cache[$master_stylevar['stylevarid']]['datatype'] = $master_stylevar['datatype'];
                }
            }
            $newstylevars = $master_stylevar_cache;
            if (substr(trim($parentlist), 0, -3) != '') {
                $data = array(vB_dB_Query::TYPE_KEY => vB_dB_Query::QUERY_STORED, 'stylelist' => explode(',', substr(trim($parentlist), 0, -3)), 'parentlist' => $parentlist);
                $new_stylevars = vB::getDbAssertor()->getRows('vBForum:getStylesFromList', $data);
                foreach ($new_stylevars as $new_stylevar) {
                    ob_start();
                    $newstylevars[$new_stylevar['stylevarid']] = unserialize($new_stylevar['value']);
                    if (ob_get_clean() or !is_array($newstylevars[$new_stylevar['stylevarid']])) {
                        continue;
                    }
                    $newstylevars[$new_stylevar['stylevarid']]['datatype'] = $master_stylevar_cache[$new_stylevar['stylevarid']]['datatype'];
                }
            }
            $styleupdate['newstylevars'] = serialize($newstylevars);
            if ($printInfo and VB_AREA != 'Upgrade' and VB_AREA != 'Install') {
                echo "({$vbphrase['stylevars']}) ";
                vbflush();
            }
        }
        // replacements
        if ($actions['doreplacements']) {
            // rebuild the replacements field for this style
            $replacements = array();
            if (is_array($template_cache['replacement'])) {
                foreach ($template_cache['replacement'] as $template) {
                    // set the key to be a case-insentitive preg find string
                    $replacementkey = '#' . preg_quote($template['title'], '#') . '#si';
                    $replacements["{$replacementkey}"] = $template['template'];
                }
                $styleupdate['replacements'] = serialize($replacements);
            } else {
                $styleupdate['replacements'] = "''";
            }
            if ($printInfo and (VB_AREA != 'Upgrade' and VB_AREA != 'Install')) {
                echo "({$vbphrase['replacement_variables']}) ";
                vbflush();
            }
        }
        // css -- old style css
        if ($actions['docss'] and $template_cache['css']) {
            // build a quick cache with the ~old~ contents of the css fields from the style table
            if (empty($csscache)) {
                $fetchstyles = vB::getDbAssertor()->assertQuery('vBForum:style', array(vB_dB_Query::TYPE_KEY => vB_dB_Query::QUERY_SELECT));
                foreach ($fetchstyles as $fetchstyle) {
                    $fetchstyle['css'] .= "\n";
                    $csscache["{$fetchstyle['styleid']}"] = $fetchstyle['css'];
                }
            }
            // rebuild the css field for this style
            $css = array();
            foreach ($template_cache['css'] as $template) {
                $css["{$template['title']}"] = unserialize($template['template']);
            }
            // build the CSS contents
            $csscolors = array();
            $css = construct_css($css, $styleid, $title, $csscolors);
            // attempt to delete the old css file if it exists
            delete_css_file($styleid, $csscache["{$styleid}"]);
            $adblock_is_evil = str_replace('ad', 'be', substr(md5(microtime()), 8, 8));
            $cssfilename = DIR . vB_Api::instanceInternal('style')->fetchCssLocation() . '/style-' . $adblock_is_evil . '-' . str_pad($styleid, 5, '0', STR_PAD_LEFT) . '.css';
            // if we are going to store CSS as files, run replacement variable substitution on the file to be saved
            if (vB::getDatastore()->getOption('storecssasfile')) {
                $css = process_replacement_vars($css, array('styleid' => $styleid, 'replacements' => serialize($replacements)));
                $css = preg_replace_callback('#(?<=[^a-z0-9-]|^)url\\((\'|"|)(.*)\\1\\)#iU', function ($matches) {
                    return rewrite_css_file_url($matches[2], $matches[1]);
                }, $css);
                if (write_css_file($cssfilename, $css)) {
                    $css = "@import url(\"{$cssfilename}\");";
                }
            }
            if ($printInfo and (VB_AREA != 'Upgrade' and VB_AREA != 'Install')) {
                echo "({$vbphrase['css']}) ";
                vbflush();
            }
        }
        // post editor styles
        if ($actions['doposteditor'] and $template_cache['template']) {
            $editorstyles = array();
            if (!empty($template_cache['template'])) {
                foreach ($template_cache['template'] as $template) {
                    if (substr($template['title'], 0, 13) == 'editor_styles') {
                        $title = 'pi' . substr($template['title'], 13);
                        $item = fetch_posteditor_styles($template['template']);
                        $editorstyles["{$title}"] = array($item['background'], $item['color'], $item['padding'], $item['border']);
                    }
                }
            }
            if ($printInfo and (VB_AREA != 'Upgrade' and VB_AREA != 'Install')) {
                echo "({$vbphrase['controls']}) ";
                vbflush();
            }
        }
        // do the style update query
        if (!empty($styleupdate)) {
            $styleupdate['styleid'] = $styleid;
            $styleupdate[vB_dB_Query::TYPE_KEY] = vB_dB_Query::QUERY_UPDATE;
            vB::getDbAssertor()->assertQuery('vBForum:style', $styleupdate);
        }
        //write out the new css -- do this *after* we update the style record
        if (vB::getDatastore()->getOption('storecssasfile')) {
            if (!write_style_css_directory($styleid, $parentlist, 'ltr')) {
                if ($printInfo and VB_AREA != 'Upgrade' and VB_AREA != 'Install') {
                    echo fetch_error("rebuild_failed_to_write_css");
                } else {
                    return fetch_error("rebuild_failed_to_write_css");
                }
            } else {
                if (!write_style_css_directory($styleid, $parentlist, 'rtl')) {
                    if ($printInfo and VB_AREA != 'Upgrade' and VB_AREA != 'Install') {
                        echo fetch_error("rebuild_failed_to_write_css");
                    } else {
                        return fetch_error("rebuild_failed_to_write_css");
                    }
                }
            }
        }
        // finish off the listings
        if ($printInfo and (VB_AREA != 'Upgrade' and VB_AREA != 'Install')) {
            echo "</span><b>" . $vbphrase['done'] . "</b>.<br />&nbsp;</li>\n";
            vbflush();
        }
    }
    $childsets = vB::getDbAssertor()->getRows('style', array(vB_dB_Query::TYPE_KEY => vB_dB_Query::QUERY_SELECT, vB_dB_Query::CONDITIONS_KEY => array('parentid' => $styleid)));
    if (count($childsets)) {
        if ($printInfo and (VB_AREA != 'Upgrade' and VB_AREA != 'Install')) {
            echo "{$indent}<ul class=\"ldi\">\n";
        }
        foreach ($childsets as $childset) {
            if ($error = build_style($childset['styleid'], $childset['title'], $actions, $childset['parentlist'], $indent . "\t", $resetcache, $printInfo)) {
                return $error;
            }
        }
        if ($printInfo and (VB_AREA != 'Upgrade' and VB_AREA != 'Install')) {
            echo "{$indent}</ul>\n";
        }
    }
    //We want to force a fastDS rebuild, but we can't just call rebuild. There may be dual web servers,
    // and calling rebuild only rebuilds one of them.
    $options = vB::getDatastore()->getValue('miscoptions');
    $options['tmtdate'] = vB::getRequest()->getTimeNow();
    vB::getDatastore()->build('miscoptions', serialize($options), 1);
}