/// <summary>
        ///     Открыть в Архиве документоа форму поиска похожих документов
        /// </summary>
        /// <param name="context">Текущий HTTPContext</param>
        /// <param name="id">Код документа</param>
        /// <param name="typeId">Код типа документа</param>
        /// <param name="date">Дата документа</param>
        /// <param name="number">Номер документа</param>
        /// <param name="personIds">Коды лиц документа</param>
        /// <param name="usePersonIds">Условие похожести</param>
        /// <returns>Возвращает сгенерированную http-ссылку</returns>
        public static string CheckSimilarDocument(HttpContext context, string id, string typeId, string date,
                                                  string number, string personIds, string usePersonIds)
        {
            var callbackUrl = context.Request.Url.Scheme + "://" +
                              context.Request.Url.Authority +
                              context.Request.ApplicationPath.TrimEnd('/') + "/dialogResult.ashx";

            var sb = new StringBuilder();

            if (usePersonIds.Length == 0)
            {
                usePersonIds = "0";
            }
            sb.AppendFormat(" var paramCheck = \"KescoRun:Docview\";");
            sb.AppendFormat(" paramCheck += \"{0}<CHECKSIMILAR\";", ValueSeparator);
            sb.AppendFormat(" paramCheck += \"{0}control{1}'\" + escape(idp) + \"'\";", ValueSeparator, EscapeEqual);
            sb.AppendFormat(" paramCheck += \"{0}callbackKey{1}'\" + escape(idp) + \"'\";", ValueSeparator,
                            EscapeEqual);
            sb.AppendFormat(" paramCheck += \"{0}callbackUrl{1}'\" + escape('{2}') + \"'\";", ValueSeparator,
                            EscapeEqual, HttpUtility.JavaScriptStringEncode(callbackUrl));
            sb.AppendFormat(" paramCheck += \"{0}id{1}'{2}'\";", ValueSeparator, EscapeEqual,
                            string.IsNullOrEmpty(id) ? "0" : id);
            sb.AppendFormat(" paramCheck += \"{0}type{1}'{2}'\";", ValueSeparator, EscapeEqual, typeId);
            sb.AppendFormat(" paramCheck += \"{0}date{1}'{2}'\";", ValueSeparator, EscapeEqual, date);
            sb.AppendFormat(" paramCheck += \"{0}number{1}'\" + escape('{2}') + \"'\";", ValueSeparator, EscapeEqual,
                            number);
            sb.AppendFormat(" paramCheck += \"{0}personids{1}'\" + escape('{2}') + \"'\";", ValueSeparator, EscapeEqual,
                            personIds);
            sb.AppendFormat(" paramCheck += \"{0}usepersonids{1}'\" + escape('{2}') + \"'\";", ValueSeparator,
                            EscapeEqual, usePersonIds);
            sb.AppendFormat(" paramCheck += \"/>\";");

            sb.Append(WebExtention.DynamicLink("paramCheck"));
            return(sb.ToString());
        }
        /// <summary>
        ///     Открыть в Архиве документов форму отправки сообщения по документу
        /// </summary>
        /// <param name="id">Код документа</param>
        /// <param name="empids">Список сотрудников через ",", которым должно быть отправлено сообщение</param>
        /// <param name="message">Текст сообщения</param>
        /// <param name="openDocument">Вместе с формой отправки открыть и сам документ</param>
        /// <returns>Возвращает сгенерированную http-ссылку</returns>
        public static string SendMessageDocument(string id, string empids, string message, bool openDocument = true)
        {
            var sb = new StringBuilder();

            sb.AppendFormat(" var paramSend = \"KescoRun:Docview\";");
            sb.AppendFormat(" paramSend += \"{0}<SENDMESSAGE\";", ValueSeparator);
            sb.AppendFormat(" paramSend += \"{0}id{1}'\" + escape('{2}') + \"'\";", ValueSeparator, EscapeEqual, id);
            sb.AppendFormat(" paramSend += \"{0}opendoc{1}'{2}'\";", ValueSeparator, EscapeEqual, openDocument ? 1 : 0);
            sb.AppendFormat(" paramSend += \"{0}empids{1}'\" + escape('{2}') + \"'\";", ValueSeparator, EscapeEqual,
                            empids);
            if (!string.IsNullOrEmpty(message))
            {
                message =
                    message
                    .Replace("&", EscapeXmlAmp)
                    .Replace(" ", EscapeXmlSpace)
                    .Replace("\"", EscapeXmlQuot)
                    .Replace("'", EscapeXmlApos)
                    .Replace("<", EscapeXmlLt)
                    .Replace(">", EscapeXmlGt);

                sb.AppendFormat(" paramSend += \"{0}message{1}'\" + escape('{2}') + \"'\";", ValueSeparator,
                                EscapeEqual, HttpUtility.JavaScriptStringEncode(message));
            }

            sb.AppendFormat(" paramSend += \"{0}checkall{1}'1'\";", ValueSeparator, EscapeEqual);
            sb.AppendFormat(" paramSend += \"/>\";");

            sb.Append(WebExtention.DynamicLink("paramSend"));

            return(sb.ToString());
        }
        /// <summary>
        ///     Получить ClientName для функционировании web-звонилки
        /// </summary>
        /// <param name="context">Текущий HTTPContext</param>
        /// <param name="idp">Идентификатор страницы</param>
        /// <returns>Возвращает сгенерированную http-ссылку</returns>
        public static string GetClientName(HttpContext context, string idp)
        {
            var callbackUrl = string.Format("{0}://{1}{2}/dialogResult.ashx?callbackKey={3}",
                                            context.Request.Url.Scheme,
                                            context.Request.Url.Authority,
                                            context.Request.ApplicationPath.TrimEnd('/'),
                                            idp);

            return(WebExtention.DynamicLink(string.Format("KescoRun:GetClientName {0}", callbackUrl), false));
        }
        /// <summary>
        ///     Открыть в Архиве документов форму поиска
        /// </summary>
        /// <param name="context">Текущий HTTPContext</param>
        /// <param name="htmlId">Идентификатор контрола, в который необходимо подствить значение</param>
        /// <param name="paramTypes">Ограничение по типам документов</param>
        /// <param name="paramPersons">Ограничение по кодам лиц</param>
        /// <param name="paramSearch">Строка поиска</param>
        /// <returns>Возвращает сгенерированную http-ссылку</returns>
        public static string SearchDocument(HttpContext context, string htmlId, string paramTypes, string paramPersons,
                                            string paramSearch)
        {
            var callbackUrl = context.Request.Url.Scheme + "://" +
                              context.Request.Url.Authority +
                              context.Request.ApplicationPath.TrimEnd('/') + "/dialogResult.ashx";

            var sb = new StringBuilder();

            sb.AppendFormat(" var paramSearch = \"KescoRun:Docview\";");
            sb.AppendFormat(" paramSearch += \"{0}<SEARCH\";", ValueSeparator);
            sb.AppendFormat(" paramSearch += \"{0}control{1}'\" + escape('{2}') + \"'\";", ValueSeparator, EscapeEqual,
                            HttpUtility.JavaScriptStringEncode(htmlId));
            sb.AppendFormat(" paramSearch += \"{0}callbackKey{1}'\" + escape(idp) + \"'\";", ValueSeparator,
                            EscapeEqual);
            sb.AppendFormat(" paramSearch += \"{0}callbackUrl{1}'\" + escape('{2}')+ \"'\";", ValueSeparator,
                            EscapeEqual, HttpUtility.JavaScriptStringEncode(callbackUrl));
            sb.AppendFormat(" paramSearch += \"{0}tray{1}'1'\";", ValueSeparator, EscapeEqual);

            if (!string.IsNullOrEmpty(paramTypes))
            {
                sb.AppendFormat(" paramSearch += \"{0}types{1}'\" + escape('{2}') + \"'\";", ValueSeparator,
                                EscapeEqual, HttpUtility.JavaScriptStringEncode(paramTypes));
            }
            if (!string.IsNullOrEmpty(paramPersons))
            {
                sb.AppendFormat(" paramSearch += \"{0}persons{1}'\" + escape('{2}') + \"'\";", ValueSeparator,
                                EscapeEqual, HttpUtility.JavaScriptStringEncode(paramPersons));
            }
            if (!string.IsNullOrEmpty(paramSearch))
            {
                paramSearch =
                    paramSearch
                    .Replace("&", EscapeXmlAmp)
                    .Replace(" ", EscapeXmlSpace)
                    .Replace("\"", EscapeXmlQuot)
                    .Replace("'", EscapeXmlApos)
                    .Replace("<", EscapeXmlLt)
                    .Replace(">", EscapeXmlGt);

                sb.AppendFormat(" paramSearch += \"{0}search{1}'\" + escape('{2}') + \"'\";",
                                ValueSeparator,
                                EscapeEqual,
                                HttpUtility.JavaScriptStringEncode(paramSearch));
            }

            sb.AppendFormat(" paramSearch += \"/>\";");
            sb.Append(WebExtention.DynamicLink("paramSearch"));
            return(sb.ToString());
        }
        /// <summary>
        ///     Открытие документа в Архиве документов по коду документа
        /// </summary>
        /// <param name="id">КодДокумента</param>
        /// <param name="openImage">
        ///     true-если необходимо открыть документ на основном изображении, при его наличии; false-открыть
        ///     документа на электронной форме
        /// </param>
        /// <param name="replicate">
        ///     true-реплицировать изображения, если оно отсутствует в локальном архиве; false - не
        ///     реплицировать
        /// </param>
        /// <returns>Возвращает сгенерированную http-ссылку</returns>
        public static string OpenDocument(string id, bool openImage = true, bool replicate = false)
        {
            if (string.IsNullOrEmpty(id))
            {
                throw new LogicalException("Ошибка вызова метода OpenDocument", "Не указан код документа",
                                           Assembly.GetExecutingAssembly().GetName());
            }

            return
                (WebExtention.DynamicLink(
                     string.Format(
                         "KescoRun:Docview{0}<OPENDOC{0}id{1}'{2}'{0}newwindow{1}'1'{0}imageid{1}'{3}'{0}replicate{1}'{4}'/>",
                         ValueSeparator,
                         EscapeEqual,
                         id,
                         openImage ? -2 : 0,
                         replicate ? "true" : "false"), false));
        }