/// <summary>
    /// This method encapsulates both client- and server- side CSS processing.
    /// </summary>
    /// <param name="input">Stylesheet code in dynamic language syntax</param>
    /// <param name="language">CSS dynamic language</param>
    /// <param name="output">Plain CSS output</param>
    /// <param name="hiddenField">Hidden field that holds the result of client-side compilation</param>
    public static string ProcessCss(string input, string language, out string output, HiddenField hiddenField)
    {
        string          errorMessage = String.Empty;
        CssPreprocessor prep         = CssStylesheetInfoProvider.GetCssPreprocessor(language);

        EnsureClientSideCompiledCss(hiddenField);

        if (String.IsNullOrEmpty(CssPreprocessor.CurrentCompiledValue) || ((prep != null) && !prep.UsesClientSideCompilation))
        {
            // Parse the style sheet code server-side
            errorMessage = CssStylesheetInfoProvider.TryParseCss(input, language, out output);
            if (String.IsNullOrEmpty(errorMessage))
            {
                // Store last result
                CssPreprocessor.CurrentCompiledValue = output;
            }
        }
        else
        {
            // Use client-side parsed code
            output = CssPreprocessor.CurrentCompiledValue;

            // Check if client-side process result contains special sequence indicating that parser produced no output (this may not be an error)
            if (output.EqualsCSafe(BLANKOUTPUT))
            {
                output = String.Empty;
            }
            else
            {
                if ((prep != null) && (prep.GetErrorDescription != null))
                {
                    // Handle error
                    errorMessage = prep.GetErrorDescription(output);
                    if (!String.IsNullOrEmpty(errorMessage))
                    {
                        output = String.Empty;
                    }
                }
            }
        }

        return(errorMessage);
    }