2 Replies Latest reply on Jul 17, 2009 6:16 AM by Kasyan Servetsky

    Update required to this script

    martinn12005

      Hi,

       

      This is a script to relink images by changing the names of the files in a folder etc.

       

      I am using Indesign CS4 and I would appreciate a update of this script to CS4 (previously worked in CS3) it still works in CS4 but not 100%.

       

      Could you also incorparate one little thing?

      I have a page with multiple link on it. Everytime it updates the links, it asks me to approve every single link updated. I would like the script to have a feature "update all" without having to click "yes" (for approve) a million time when I know the links are all good.

       

      Here is a copy of the script. ( I notice some is in what seems to be Russian, mainly the top half of the script is in Russian)

       

      /***************************************************************************************** ******************************
      Change Links
      version 3.5
      Relink the images of the document to files with identical names in choosen folder.

      An InDesign CS2-CS3 JavaScript
      OS: Mac OS X, Windows XP
      You use this script at your own fear and risk.
      © 2009 Dmitriy Lapayev (d.lapaev@gmail.com)
      ****************************************************************************************** ******************************
      The script is intended to replace the images of the document on files with identical names
      from selected folder.
      Main tasks:
      1) Replace the missing files of the non-standard "Package Publication",
      including interconnection transfers projects like: "Windows" to "MAC OS X" or from "MAC OS X" to "Windows";
      2) The substitution of the preliminary document images on the processed files
      with unchanged proportions of the height and width
      (without the “Crop Image” and changes “Canvas Size”).

      In parentheses elements of the dialog indicates the number of found objects of this type.
      When launched, need select a folder, which contains the files that are intended to replace in the document.

      Realized:
      • choice of language when you first start: Russian or English
      (full support of the Russian language is available only for OS Windows)
      • extraction of embedded image files of the document;
      • check the attribute «nonprinting»;
      • search for types of document images;
      • search for files extensions in the selected folder;
      • Unlock Position for groups and objects to the replacement of files;
      • save the settings and selected folder path in the ini-file
      (created when you first run the script).

      Relink images:
      1) stored the geometric coordinates of images (Geometric Bounds), if not choosed
      settings: Center Content, Scale 100% or Angles 0 °;
      preservation of Geometric Bounds (top left and bottom right points) of the original image
      is intended to replace the links to images with unchanged proportions of the height and width
      (without «crop» - Crop Image and resizing - Canvas Size);
      2) ignored:
      • files with duplicate names (with the extension) -
      when you change the type of files «identical», without an extension -
      with the replacement for the selected type, complete with different full file names;
      • outside pages images (PB);
      • images posted from the clipboard (without link).
      ****************************************************************************************** ******************************
      Скрипт предназначен для замещения связанных файлов документа
      на файлы с аналогичными именами в выбранной папке.
      Базовые задачи:
      1) восстановление потерянных связей с файлами
      нестандартных «сборок проектов» (Package Publication) при переносе, включая межсистемный;
      2) замещение предварительных изображений в документе на обработанные.

      В круглых скобках элементов диалога настроек скрипта указывается количество найденных
      объектов данного типа.
      При запуске скрипта выбирается папка, которая содержит файлы, предназначенные
      для замещения в документе.

      Настройки скрипта:
      1) выбор изображений документа по состоянию связи с файлом;
      2) диапазон страниц замещения изображений, задается именами страниц и секциями документа
      (выбор секции обладает большим приоритетом);
      3) «Режим пошаговой замены» - Step Mode:
      • установка Center Content - размещать изображение по центру фрейма (контейнера);
      • установка Scale 100% - вертикальному и горизонтальному масштабированию изображения
      присваивается значение 100%;
      • установка Angles 0° – углам вращения и горизонтального сдвига присваивается значение 0°;
      • установка Check Rotate 90° - проверка вращение изображения (±90°),
      при обнаружении несоответствия отношения вертикального и горизонтального масштабов
      исходного и обработанного изображений;
      • установка Clipping Path to None – отключать «обтравочный» путь;
      • установка Check Transparency - проверка параметров прозрачности изображений и фреймов
      (Blending Settings: Opacity < 100%, Blending Mode - не «Normal»);
      4) Including Non-printing Objects - включая объекты с атрибутом «не печатать»
      при замещении связей с файлами;
      5) «Choice of File Extensions:» - выбор типов связанных файлов документа
      для замены в заданном диапазоне страниц;
      6) «File Names:» - установки для сопоставления имен исходных и найденных в выбранной папке файлов,
      если имена файлов не совпадают («неидентичные» - «Non-identical»):
      • «The End of File Name:» - выбор окончания имени файла, содержащего более одного символа «точка»;
      • «Choice of File Extensions:» - выбор расширения файлов в указанной папке;
      7) «Show Relink Report» - формирование и отображение отчета замещения связей с файлами.

      Реализовано:
      • выбор языка интерфейса скрипта при первом запуске: русский или английский
      (полная поддержка русского языка доступна только на ОС «Windows»)
      • извлечение внедренных файлов изображений документа;
      • проверка атрибута «не печатать»;
      • поиск типов связанных файлов документа;
      • поиск расширений файлов в выбранной папке;
      • Unlock Position для групп и объектов при замещении файлов;
      • сохранение настроек и пути к выбранной папке в файле инициализации
      (создается при первом запуске скрипта).

      При замещении изображений:
      1) сохраняются геометрические координаты изображений – Geometric Bounds, если не установлено
      в настройках: Center Content, Scale 100% или Angles 0°;
      сохранение Geometric Bounds (верхняя левая и нижняя правая точки) исходного изображения
      предназначено для замещения на связи с файлами при неизменных пропорциях высоты
      и ширины изображений, т.е. без «кадрирования» - Crop Image и изменения размера - Canvas Size;
      2) игнорируются:
      • файлы с дублирующимися именами с расширением - при замене на тип файлов «идентичный»,
      без расширения - при замене на выбранный тип, при отличающихся полных именах файлов;
      • изображения, находящиеся вне страниц документа (PB);
      • изображения, помещенные из буфера обмена (отсутствует связь с файлом).

      © 2009 Дмитрий Лапаев (d.lapaev@gmail.com)
      ****************************************************************************************** ******************************/

      with (app) {
      const myScrVer = "3.5";
      const myScrName = "Change Links";
      // максимальная величина допуска отношений горизонтального и вертикального масштабов изображений
      const myVGScDop = 0.01;
      // copyright
      var mn = "\u00A9\ \u0044\u006D\u0069\u0074\u0072\u0069\u0079\ \u004C\u0061\u0070\u0061\u0079\u0065\u0076";
      // User Interaction Level
      scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;
      // создание файла инициализации
      const IniFName = "ChLinks_ini.txt";
      var MyStrIniF = "";
      var lgclIniF = new File (activeScript.path + "/" + IniFName);
      if (!lgclIniF.exists) {
        // Выбор языка интерфейса
        var s_Locale = "";
        var myLanguageSelectDialog = dialogs.add({name: "Select Language (" + $.locale + ")", canCancel: false})
        with (myLanguageSelectDialog.dialogColumns.add().borderPanels.add()) {
         var languagesNames = new Array ("Русский", "English");
         var languagesSelect = dropdowns.add({stringList:languagesNames, selectedIndex: 0, minWidth: 160});
        }
        myLanguageSelectDialog.show();
        switch (languagesSelect.selectedIndex) {
         case 0: s_Locale = "ru"; break;
         case 1: s_Locale = "ua"; break;
         case 2: s_Locale = "en"; break;
        }
        myLanguageSelectDialog.destroy();
        MyStrIniF += "var inScriptName = \"" + myScrName + " " + myScrVer + "\";\n";
        MyStrIniF += "var inpVLinkStM = 0;\n";
        MyStrIniF += "var inpDefPath = \"\";\n";
        MyStrIniF += "var inStepMode = true;\n";
        MyStrIniF += "var inShowReport = true;\n";
        MyStrIniF += "var inClippPathNone = false;\n";
        MyStrIniF += "var inCenterCont = false;\n";
        MyStrIniF += "var inScale100 = false;\n";
        MyStrIniF += "var inAngles0 = false;\n";
        MyStrIniF += "var inCheckRotImage = false;\n";
        MyStrIniF += "var inpOrdDotN = true;\n";
        MyStrIniF += "var inpNotIdcl = true;\n";
        MyStrIniF += "var inpInSec = false;\n";
        MyStrIniF += "var inCheckTransp = false;\n";
        MyStrIniF += "var inNonprintIm = true;\n";
        MyStrIniF += "var sel_Language = \"" + s_Locale + "\";\n";
        MyStrIniF += "const mn = \"" + mn + "\";";
        lgclIniF.open("w");
        if (lgclIniF.write(MyStrIniF)) {
         alert (IniFName + " successfully created!\n(Default Script Options)", myScrName + " " + myScrVer, false);
         lgclIniF.close();
         eval ("//@include \'" + IniFName + "\';");
        }
        else {alert("Unable to write the ini-file!"); exit();}
      }
      else {eval ("//@include \'" + IniFName + "\';"); cr();}
      // тип файловой системы (ОС)
      var WonFS = File.fs;
      if (WonFS == "Macintosh") {WonFS = "Mac OS X";}
      // язык интерфейса
      $.localize = true;
      $.locale = sel_Language;
      const copyRight = localize ({ru: "\u00A9\ Дмитрий Лапаев", en: mn});
      const local_Folder = localize ({ru: "Папка: ", en: "Folder: "});
      const local_inFolder = localize ({ru: "папке: ", en: "a Folder: "});
      const local_In = localize ({ru: " в ", en: " in "});
      const local_To = localize ({ru: " на ", en: " to "});
      const local_FNames = localize ({ru: "имена файлов", en: "names"});
      const local_Report = localize ({ru: "Отчет замещения файлов", en: "Relink Report"});
      const local_Relink = localize ({ru: "Заменить", en: "Relink"});
      const local_Found= localize ({ru: "Найдено", en: "Found"});
      const local_inSections = localize ({ru: "cекциях", en: "sections"});
      const local_Total = localize ({ru: "Всего: ", en: "Total: "});
      const local_Links= localize ({ru: "связей с файлами", en: "Links"});
      const local_Files = localize ({ru: "-файлы", en: "-files"});
      const local_LinkStatus = localize ({ru: "состояние связей -", en: "link status -"});
      const local_OfSectionsN = localize ({ru: " cекции №", en: " of section #"});
      const local_OfDocument = localize ({ru: " документа", en: " of document"});
      const local_Conditions = localize ({ru: "Условия замещения:", en: "Conditions:"});
      const local_ApplyChanges = localize ({ru: "Сохранить изменения?", en: "Apply Changes?"});
      const local_ContinueRelink = localize ({ru: "Продолжить замещение файлов?", en: "Continue Relink Files?"});
      const local_RepInf_1 = localize ({ru: "успешно заменено", en: "Successfully relink"});
      const local_RepInf_2 = localize ({ru: "отсутствуют в папке", en: "Links to not existing files"});
      const local_RepInf_3 = localize ({ru: "игнорировано из-за дубликата имени", en: "Ignored links with duplicates of names"});
      const local_RepInf_4 = localize ({ru: "отменено пользователем", en: "Canceled by user"});
      const local_RepInf_5 = localize ({ru: "объекты \"не для печати\"", en: "Оbjects with attribute \"Nonprinting\""});
      // надписи диалогов
      const RotateLabel = localize ({ru: "Вращать", en: "Rotate"});
      const ChoiceFileFormatsLabel = localize ({ru: "Выбор форматов файлов:", en: "Choice of File Formats:"});
      const FileNameLabel = localize ({ru: "Имена файлов:", en: "File Names:"});
      const PageRangeLabel = localize ({ru: "Диапазон страниц:", en: "Range of Pages:"});
      const EndPageNameLabel = localize ({ru: "Окончание имени:", en: "The End of File Name:"});
      const ChoiceExtLabel = localize ({ru: "Выбор типа файлов:", en: "Choice of File Extensions:"});

      var nameNCE =  "identical";
      if (WonFS == "Windows") {nameNCE =  localize ({ru: "идентичные", en: nameNCE});}
      var nameNon =  "Non-";
      if (WonFS == "Windows") {nameNon =  localize ({ru: "не", en: nameNon});}
      var selShowPeport = "Show Relink Report";
      if (WonFS == "Windows") {selShowPeport = localize ({ru: "Отобразить отчет", en: selShowPeport});}
      var selSections = "Sections:";
      if (WonFS == "Windows") {selSections = localize ({ru: "Cекции документа:", en: selSections});}
      var selFDot = "First Dot";
      if (WonFS == "Windows") {selFDot = localize ({ru: "первая точка", en: selFDot});}
      var selLastDot = "Last Dot";
      if (WonFS == "Windows") {selLastDot = localize ({ru: "последняя точка", en: selLastDot});}
      var selStepMode = "Step Mode";
      if (WonFS == "Windows") {selStepMode = localize ({ru: "Режим пошаговой замены", en: selStepMode});}
      var selFitCenter = "Center Content";
      if (WonFS == "Windows") {selFitCenter = localize ({ru: "по центру фрейма", en: selFitCenter});}
      var selVHScale100 = "Scale 100%";
      if (WonFS == "Windows") {selVHScale100 = localize ({ru: "масштаб 100%", en: selVHScale100});}
      var selAngles0 = "Angles 0°";
      if (WonFS == "Windows") {selAngles0 = localize ({ru: "углы 0°", en: selAngles0});}
      var selСhRotate90 = "Check Rotate 90°";
      if (WonFS == "Windows") {selСhRotate90 = localize ({ru: "проверять вращение на 90°", en: selСhRotate90});}
      var selClippingPathNone = "Clipping Path to None";
      if (WonFS == "Windows") {selClippingPathNone = localize ({ru: "отключать обтравочный путь", en: selClippingPathNone});}
      var selChTransparency = "Check Transparency";
      if (WonFS == "Windows") {selChTransparency = localize ({ru: "проверять прозрачность", en: selChTransparency});}
      var selNonprintingImages = "Including Non-printing Objects";
      if (WonFS == "Windows") {selNonprintingImages = localize ({ru: "Включая объекты не для печати", en: selNonprintingImages});}
      var selRotate90CW = "90° CW";
      if (WonFS == "Windows") {selRotate90CW = localize ({ru: "90° по часовой стрелке", en: selRotate90CW});}
      var selRotate90CCW = "90° CCW";
      if (WonFS == "Windows") {selRotate90CCW = localize ({ru: "90° против", en: selRotate90CCW});}
      // массив выбора состояний связей
      var inpVLinkStArr = new Array();
      if (WonFS == "Windows") {
        inpVLinkStArr = [[localize ({ru: "отсутствующие", en: "Missing"}), false], [localize ({ru: "нормальные", en: "Normal"}), false], [localize ({ru: "модифицированные", en: "Modified"}), false], [localize ({ru: "все связи", en: "All Links"}), false]];
      }
      else {
        inpVLinkStArr = [["Missing", false], ["Normal", false], ["Modified", false], ["All Links", false]];
      }
      inpVLinkStArr[inpVLinkStM][1] = true;
      // сообщения скрипта
      var alertWithoutLink = localize ({ru: "Объект без связи с файлом!\n(импортирован из буфера обмена)\nПродолжить работу?", en: "Object without link!\n(imported from clipboard)\nContinue?"});
      var alertAfterRotateSAngle = localize ({ru: "Угол горизонтального сдвига изображения равен", en: "The skewing angle applied to the Image is"});
      var alertAfterRotateSA0 = localize ({ru: "После поворота изображения это значение будет некорректным!\nУстановить 0°?", en: "After rotate this value is incorrect!\nSet Shear Angle to 0°?"});
      var alertNonprinting = localize ({ru: "Найден объект:", en: "Non-printing Object:"});
      var alertNonprintToOff = localize ({ru: "Отключить атрибут \"не для печати\"?", en: "Set attribute \"Nonprinting\" to Off?"});
      var alertEmbedded = localize ({ru: "внедренных изображений", en: "embedded files"});
      var alertUnembed = localize ({ru: "Сохранить внедренные изображения?", en: "Unembed this files?"});
      var alertAlreadyExist = localize ({ru: "уже существует в указанной папке.\nПерезаписать этот файл?", en: "already exist in the folder.\nDo you want to overwrite the file with the embedded data?"});
      var alertСreateNewFolder = localize ({ru: "Выберите папку для сохранения файлов", en: "Select the Folder where files will be created"});
      var alertNotMatchLinks = localize ({ru: "Не найдено соответствующих связей с файлами!", en: "No matching Links!"});
      var alertlEmptyFolder = localize ({ru: "пустая\nили содержит недопустимые символы в имени!\n(только для Mac OS X)", en: "is empty\nor contains illegal characters in its name!\n(Mac OS X)"});
      var alertNotFoundImages = localize ({ru: "Не найдено файлов в папке:", en: "Сannot Find Files in a Folder:"});
      var selFolderWithImages = localize ({ru: "Выберите папку с файлами для замещения в документе", en: "Select a Folder with files for Relink"});
      var andTryAgain =  localize ({ru: "и выполните скрипт повторно.", en: "and try again."});
      var noSaveDocumentAlert =  localize ({ru: "Пожалуйста сохраните документ ", en: "Please Save "});
      var noLinks = localize ({ru: "В открытом документе нет связанных файлов!", en: "No Links in Document!"});
      var noOpenDocsAlert = localize ({ru: "Отсутствуют открытые документы!\nПожалуйста откройте документ", en: "No Documents are Open!\nPlease Open a Document"}) + " " + andTryAgain;
      $.locale = null;

      // проверка открытых документов
      if (documents.length == 0) {alert (noOpenDocsAlert, inScriptName, false); exit();}
      var myDoc = activeDocument;
      try {activeDocument.filePath}
      catch (error) {alert (noSaveDocumentAlert + myDoc.name + " " + andTryAgain, inScriptName, false); exit();}
      if (myDoc.links.length == 0) {alert (noLinks, inScriptName, false); exit();}
      // версия InDesign
      try {const InDver = version.substr (0, 5);}
      catch (error) {alert (inScriptName + "\nis not compatible with this version of InDesign!", "", true); exit();}
      // количество страниц в документе
      var myDocPgsLength = myDoc.pages.length;
      // выбор папки с изображениями
      var myNIdir = Folder.selectDialog (selFolderWithImages, inpDefPath);
      if (myNIdir != null) {var MyNewDir = myNIdir; }
      else {exit();}
      // определяем расширения файлов выбранной папки, исключаем системные
      var MyFiles = MyNewDir.getFiles("*");
      if (MyFiles.length == 0) {
        alert(local_Folder + "\'" + Folder.decode(MyNewDir.name) + "\' " + alertlEmptyFolder, inScriptName, false);
        exit();
      }
      // типы расширений файлов в выбранной папки
      var NewImagesExtType = new Array();
      NewImagesExtType =  ExtenSysCheck (MyFiles);
      if (NewImagesExtType.length == 0) {
        alert (alertNotFoundImages + " \'" + Folder.decode(MyNewDir.name) + "\'!", inScriptName, false);
        exit();
      }
      // заполняем массив типов изображений документа
      var DocSelType = new Array();
      var TypeFileMyDoc = GetFileTypeInDoc (myDoc);
      for (var objCounter = 0; objCounter < TypeFileMyDoc.length; objCounter++) {
        DocSelType.push ([true, TypeFileMyDoc[objCounter][0]]);
      }
      // считаем связи с файлами по состояниям
      var myLinksCounters = myDocLinksCounters(myDoc);
      var ArrStatusL = new Array();
      for (objCounter = 0; objCounter < 4; objCounter++) {
        ArrStatusL.push("(" + myLinksCounters[objCounter] + ") ");
      }
      // имена первой и последней страниц документа
      var DocNumberPageStart = myDoc.pages[0].name;
      var DocNumberPageEnd = myDoc.pages[myDocPgsLength-1].name;
      // массив параметров секций
      var ASecPar = SecRangeOfPages (myDoc);
      // Диалог
      var myDialog = dialogs.add({name: inScriptName + " (InDesign " + InDver + " on " + WonFS + ")  " + copyRight});
      var myCheckArray = new Array();
      with (myDialog.dialogColumns.add().dialogRows.add()) { 
        with (borderPanels.add().dialogColumns.add()) {
         // панель выбора изображений документа по типу состояния связи с файлом
         with (dialogRows.add()) {
          staticTexts.add({staticLabel: local_Relink + ":"});
          var myDocLinksSatus = radiobuttonGroups.add();
          for (var StC = 0; StC < inpVLinkStArr.length; StC++) {
           myDocLinksSatus.radiobuttonControls.add({staticLabel: ArrStatusL[StC] + inpVLinkStArr[StC][0], checkedState: inpVLinkStArr[StC][1]});
          }
         }
         // панель выбора диапазона страниц
         with (borderPanels.add().dialogColumns.add()) {
          dialogRows.add().staticTexts.add({staticLabel: PageRangeLabel});
          // задаем имена первой и последней страниц документа
          with(dialogRows.add()) {
           var PageRangeStart = dialogColumns.add().textEditboxes.add({editContents:DocNumberPageStart, minWidth: 90});
           var PageRangeEnd = dialogColumns.add().textEditboxes.add({editContents:DocNumberPageEnd, minWidth: 90});
          }
          var myReportTotalPages  = local_Total + myDocPgsLength;
          if (ASecPar.length > 1) {myReportTotalPages += local_In + ASecPar.length + " " + local_inSections;}
          dialogRows.add().staticTexts.add({staticLabel: myReportTotalPages});
          // секции документа
          var SecNSelect = 0;
          if (ASecPar.length > 1) {
           var MySelNumbSection = dialogRows.add().enablingGroups.add({staticLabel: selSections, checkedState: inpInSec});
           var SecNList = new Array();
           var nSecPx = "";
           var mySecRange;
           with (MySelNumbSection) {
            for (objCounter = 0; objCounter < ASecPar.length ; objCounter++) {
             if (ASecPar[objCounter][1]  == true) {nSecPx = ASecPar[objCounter][2];}
             else {nSecPx = "";}
             mySecRange = nSecPx + ASecPar[objCounter][3] + "-" + nSecPx + (ASecPar[objCounter][3]+ASecPar[objCounter][4]-1);
             SecNList.push((objCounter+1) + "\| " + mySecRange);
            }
            SecNSelect = dropdowns.add({stringList: SecNList, selectedIndex: 0, minWidth: 165});
           }
          }
         }
         // пошаговый режим
         var MyStepByStepMode = dialogRows.add().enablingGroups.add({staticLabel: selStepMode, checkedState: inStepMode});
         with (MyStepByStepMode.dialogColumns.add()) {
          var myCenterContent = checkboxControls.add({staticLabel: selFitCenter, checkedState: inCenterCont, minWidth: 191});
          with (dialogRows.add()) {
           var myScale100 = checkboxControls.add({staticLabel: selVHScale100, checkedState: inScale100});
           var myAngles0 = checkboxControls.add({staticLabel: selAngles0, checkedState: inAngles0});
          }
          var myPossRotateIm = checkboxControls.add({staticLabel: selСhRotate90, checkedState: inCheckRotImage});
          var myClippPathNone = checkboxControls.add({staticLabel: selClippingPathNone, checkedState: inClippPathNone});
          var myChTransparency = checkboxControls.add({staticLabel: selChTransparency, checkedState: inCheckTransp});
         }
         var myNonprintImagesRelink = checkboxControls.add({staticLabel: selNonprintingImages, checkedState: inNonprintIm});
        }
        // панель выбора типов файлов документа для замены
        with (borderPanels.add().dialogColumns.add()) {
         with(borderPanels.add().dialogColumns.add()) {
          dialogRows.add().staticTexts.add({staticLabel: ChoiceFileFormatsLabel});
          for (objCounter = 0; objCounter < TypeFileMyDoc.length; objCounter++)
          myCheckArray[objCounter] = checkboxControls.add ({staticLabel: Str_inskbk(TypeFileMyDoc[objCounter][0]) + " (" + TypeFileMyDoc[objCounter][1] + ")", checkedState: true, minWidth: 180});
         }
         dialogRows.add().staticTexts.add({staticLabel: FileNameLabel});
         var MyTypeNFname = dialogRows.add().enablingGroups.add({staticLabel: nameNon + nameNCE, checkedState: inpNotIdcl});
         with (MyTypeNFname.dialogColumns.add()) {
          // панель выбора окончания имени файла (для имен связанных файлов с несколькими точками в имени)
          with(borderPanels.add().dialogColumns.add()) {
           dialogRows.add().staticTexts.add({staticLabel: EndPageNameLabel});
           var myDotFLord = dialogRows.add().radiobuttonGroups.add();
           myDotFLord.radiobuttonControls.add({staticLabel: selFDot, checkedState: inpOrdDotN, minWidth: 155});
           myDotFLord.radiobuttonControls.add({staticLabel: selLastDot, checkedState: !inpOrdDotN});
          }
          // панель выбора расширений файлов, найденных в папке
          with(borderPanels.add().dialogColumns.add()) {
           dialogRows.add().staticTexts.add({staticLabel: ChoiceExtLabel});
           var MyTypesForChange = new Array();
           for (objCounter = 0; objCounter < NewImagesExtType.length; objCounter++)
           MyTypesForChange.push("." + NewImagesExtType[objCounter]);
           var myNewImagesExtSelect = dropdowns.add({stringList:MyTypesForChange, selectedIndex: 0, minWidth: 155});
           dialogRows.add().staticTexts.add({staticLabel: local_Found + local_In + local_inFolder + NewImagesExtType.length}); 
          }
         }
         var myShowReportRelink = checkboxControls.add({staticLabel: selShowPeport, checkedState: inShowReport});
        }    

      // отображаем диалог
      var myResult = myDialog.show();
      if (!myResult) {myDialog.destroy(); exit();}
      // переменные выбранных установок
      var myIndexButLinksSt = myDocLinksSatus.selectedButton;
      var myButFirstDotName = false;
      if (myDotFLord.selectedButton == 0) {myButFirstDotName = true;}
      var selSectPR = inpInSec;
      try {selSectPR = MySelNumbSection.checkedState;}
      catch (e){}
      var selChTransp = myChTransparency.checkedState;
      var selScale_100 = myScale100.checkedState;
      var selAngles_0 = myAngles0.checkedState;
      var selCenterCont = myCenterContent.checkedState;
      var selChRotate = myPossRotateIm.checkedState;
      var selClipPathNone = myClippPathNone.checkedState;
      var selStepMode = MyStepByStepMode.checkedState;
      var MyNDirAbsURI = MyNewDir.absoluteURI;
      // записываем выбранные установки в файл инициализации
      MyStrIniF = "var inScriptName = \"" + myScrName + " " + myScrVer + "\";\n";
      MyStrIniF += "var inpVLinkStM = " + myIndexButLinksSt + ";\n";
      // MyStrIniF += "var inpDefPath = \"" + MyNDirAbsURI.substr(0, MyNDirAbsURI.lastIndexOf("/")) + "\";\n";
      MyStrIniF += "var inpDefPath = \"" + MyNDirAbsURI + "\";\n";
      MyStrIniF += "var inStepMode = " + selStepMode + ";\n";
      MyStrIniF += "var inShowReport = " + myShowReportRelink.checkedState + ";\n";
      MyStrIniF += "var inClippPathNone = " + selClipPathNone + ";\n";
      MyStrIniF += "var inCenterCont = " + selCenterCont + ";\n";
      MyStrIniF += "var inScale100 = " + selScale_100 + ";\n";
      MyStrIniF += "var inAngles0 = " + selAngles_0 + ";\n";
      MyStrIniF += "var inCheckRotImage = " + selChRotate + ";\n";
      MyStrIniF += "var inpOrdDotN = " + myButFirstDotName + ";\n";
      MyStrIniF += "var inpNotIdcl = " + MyTypeNFname.checkedState + ";\n";
      MyStrIniF += "var inpInSec = " + selSectPR + ";\n";
      MyStrIniF += "var inCheckTransp = " + selChTransp + ";\n";
      MyStrIniF += "var inNonprintIm = " + myNonprintImagesRelink.checkedState + ";\n";
      MyStrIniF += "var sel_Language = \"" + sel_Language + "\";\n";
      MyStrIniF += "const mn = \"" + mn + "\";";
      lgclIniF.open("w");
      if (lgclIniF.write(MyStrIniF)) {lgclIniF.close();}
      else {alert ("Error writing to the ini-file!", inScriptName, true);}
      // переменные диапазона страниц для поиска изображений
      var PRSedcont = PageRangeStart.editContents;
      var PREedcont = PageRangeEnd.editContents;
      var mySelSecStartAbs = 0;
      var mySelSecEndsAbs = myDocPgsLength;
      if (ASecPar.length > 1 && selSectPR == true) {
        SecNSelect = SecNSelect.selectedIndex;
        mySelSecStartAbs = ASecPar[SecNSelect][0];
        mySelSecEndsAbs = mySelSecStartAbs + ASecPar[SecNSelect][4];
      }
      // присваиваем выбранный тип для замещения
      var mySelectedExt ;
      var ResIndexSelectExt = myNewImagesExtSelect.selectedIndex ;
      if (MyTypeNFname.checkedState == false) {mySelectedExt = nameNCE;}
      else {mySelectedExt = NewImagesExtType[ResIndexSelectExt];}
      var mySTdocStr = new Array();
      // выбранные для замещения типы документа
      for (objCounter = 0; objCounter < DocSelType.length; objCounter++) {
        DocSelType[objCounter][0] = myCheckArray[objCounter].checkedState;
        if (DocSelType[objCounter][0] == true) mySTdocStr.push(Str_inskbk(DocSelType[objCounter][1]));
      }
      // формируем массив изображений документа по установленным условиям
      var MyGraphicsPages = new Array();
      // выборка всех изображений из заданного диапазона страниц
      MyGraphicsPages = RangePagesGraphics (myDoc, PRSedcont, PREedcont, selSectPR, mySelSecStartAbs, mySelSecEndsAbs);
      PRSedcont = MyGraphicsPages[1]
      PREedcont = MyGraphicsPages[2];
      // массив имен файлов изображений с атрибутом "не печатать"
      var myImagesWithANonpr = new Array();
      // удаляем (при выборе в диалоге) изображения с атрибутом "не печатать"
      MyGraphicsPages = myPrint_ObjArray (MyGraphicsPages[0], MyStepByStepMode.checkedState, myNonprintImagesRelink.checkedState, myImagesWithANonpr)
      // выбираем по статусу состояния связи с файлом изображения
      MyGraphicsPages = selMissNormModAll_Links (MyGraphicsPages, myIndexButLinksSt);
      // выборка по обозначенным типам изображений
      MyGraphicsPages = getTypeRastrImages (MyGraphicsPages, DocSelType);
      // удаляем файлы с дублирующимися именами при разных путях
      MyGraphicsPages =  FindDuplicatesNames (MyGraphicsPages, mySelectedExt, myButFirstDotName);
      if (MyGraphicsPages.length == 0) {
        alert (alertNotMatchLinks, inScriptName, false);
        myDialog.destroy();
        exit();
      }
      // переподстановка выбранных файлов:
      var beRotate = false;
      var ResRelinkErr = SelectedFiles_Relink (MyGraphicsPages, MyNDirAbsURI, mySelectedExt);
      // отчет
      ResRelinkErr.push(myImagesWithANonpr);
      if (myShowReportRelink.checkedState) {ReportErrorsRelink (ResRelinkErr, inpVLinkStArr[myIndexButLinksSt][0], PRSedcont, PREedcont, SecNSelect, selSectPR, mySTdocStr);}
      myDialog.destroy();
      exit();
      }

      /* ФУНКЦИИ•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••• •••••••••••••••••••••••••••••••••••••••••••••••*/
      /* Функция возвращает массив счетчиков изображений документа по состоянию связи с файлом.
      Внедренные файлы предлагается извлечь в выбранную папку. */
      function myDocLinksCounters (inDDoc) {
      var aDocLinksL = inDDoc.links.length;
      var ArrLinksCount = new Array(0, 0, 0, aDocLinksL);
      var myEmbeddedLinks = new Array();
      for (var linkCounter = 0; linkCounter < aDocLinksL; linkCounter++) {
        if (inDDoc.links[linkCounter].status == LinkStatus.linkMissing) ArrLinksCount[0]++;
        if (inDDoc.links[linkCounter].status == LinkStatus.normal) ArrLinksCount[1]++;
        if (inDDoc.links[linkCounter].status == LinkStatus.linkOutOfDate) ArrLinksCount[2]++;
        if (inDDoc.links[linkCounter].status == LinkStatus.linkEmbedded) myEmbeddedLinks.push(inDDoc.links[linkCounter]);
      }
      // для внедренных изображений
      if (myEmbeddedLinks.length > 0) {
        if (confirm (local_Found + " " + alertEmbedded + ": " + myEmbeddedLinks.length + "\n" + alertUnembed, "", inScriptName)) {
         // выбор папки
         var myUnmDir = Folder.selectDialog (alertСreateNewFolder, inDDoc.filePath);
         if (myUnmDir != null) {
          var MyNewUnembedDir = myUnmDir.absoluteURI; 
          for (linkCounter = 0; linkCounter < myEmbeddedLinks.length; linkCounter++){
           // если файл с таким же именем существует
           if (File(MyNewUnembedDir + "/" + myEmbeddedLinks[linkCounter].name).exists) {
            if (confirm (myEmbeddedLinks[linkCounter].name + " " + alertAlreadyExist, "", inScriptName)) {
             myEmbeddedLinks[linkCounter].unembed(Folder(MyNewUnembedDir));
             ArrLinksCount[1]++;
            }
           }
           else {
            myEmbeddedLinks[linkCounter].unembed(Folder(MyNewUnembedDir));
            ArrLinksCount[1]++;
           }
          }
         }
        }
      }
      return ArrLinksCount;
      }

      /* Функция удаляет из массива myObjArray изображения с атрибутом "не печатать"
      при myNonPrImSeld = false. При пошаговом режиме предлагается снять атрибут "не печатать"
      с изображений массива myObjArray.
      Формируется массив изображений с атрибутом "не печатать" myArrayNonprintingIm для отчета. */
      function myPrint_ObjArray(myObjArray, myStepModeTrue, myNonPrImSeld, myArrayNonprintingIm) {
      var myPrintObjArray= new Array();
      var myObjPr;
      for (var myCobj = 0; myCobj < myObjArray.length; myCobj++) {
        myObjPr = myObjArray[myCobj];
        if (myNonprint_ParentRe(myObjPr)) { 
         if(myStepModeTrue) {
          myObjPr.itemLink.show();
          if (confirm(alertNonprinting + " " + myObjPr.itemLink.name + "\n" + alertNonprintToOff)) {
           myNonpFalse_ParentRe (myObjPr);
           myPrintObjArray.push(myObjPr);
          }
          else {
           myArrayNonprintingIm.push(myObjPr.itemLink.name);
          }
         }
         else {myArrayNonprintingIm.push(myObjPr.itemLink.name);}
         if (myNonPrImSeld == true) {myPrintObjArray.push(myObjPr);}
        }
      else myPrintObjArray.push(myObjPr);
      }
      return myPrintObjArray;
      }

      /* Функция возвращает массив изображений, выбранных
      по состоянию связи c файлом из массива myImagesArray, */
      function selMissNormModAll_Links(myImagesArray, LinksStatusIndex, atrNonPrint) {
      if (LinksStatusIndex == 3) {return myImagesArray;}
      var myStatusImages = new Array();
      var myStatusLink;
      for (var myCounter = 0; myCounter < myImagesArray.length; myCounter++) {
        myStatusLink = myImagesArray[myCounter].itemLink.status;
        // отсутствующие
        if (myStatusLink == LinkStatus.linkMissing && LinksStatusIndex == 0)
         {myStatusImages.push(myImagesArray[myCounter]);}
        // нормальные
        if (myStatusLink == LinkStatus.normal && LinksStatusIndex == 1)
         {myStatusImages.push(myImagesArray[myCounter]);}
        // модифицированные
        if (myStatusLink == LinkStatus.linkOutOfDate && LinksStatusIndex == 2)
         {myStatusImages.push(myImagesArray[myCounter]);}
      }
      return myStatusImages;
      }

      /* Функция замещения связей с файлами. Возвращает массив с результатами замещения. */
      function SelectedFiles_Relink (MySeldGraphics, MyRFolder, myExten) {
      var myLink;
      var myNewLinkName = "";
      var myFileName = "";
      var myFileNameNoExt = "";
      var myRelinkFileName = "";
      var RelinkToFilesName = "";
      var myBlendingSettings = "";
      var myUpdLink;
      var RelinkYes = true;
      var ReportAlerts = new Array();
      var mySeccessRelinks = new Array();
      var DuplicatsCancelObj = new Array();
      var NoFileExistErrorLinks = new Array();
      var CancelByURelink = new Array();
      var OldGeomBounds;
      var myCountUndo;
      var myImageRotAng;
      var myImageShAngl;
      var myPossAngleW;
      var myNewFImage;
      var myPrSc;
      var myNewPrSc;
      var myIsImagePar = new Array();
      // считать координаты для разворота
      app.activeDocument.viewPreferences.rulerOrigin = RulerOrigin.spreadOrigin;
      // установка центральной точки (для поворота изображения)
      app.activeWindow.transformReferencePoint = AnchorPoint.centerAnchor;
      for (var i = 0; i < MySeldGraphics.length; i++) {
        myLink = MySeldGraphics[i][0].itemLink;
        myFileName = myLink.name;
        myFileNameNoExt = FileNameWtExt(myFileName, myButFirstDotName); 
        if (MySeldGraphics[i][1] == true) {   
         if (myExten == nameNCE) {myRelinkFileName = myFileName;}
         else {myRelinkFileName = myFileNameNoExt + "." + myExten;}
         // полное имя файла
         myNewLinkName = MyRFolder + "/" + myRelinkFileName;
         // переменная, описывающая операцию замещения файлов
         RelinkToFilesName = myFileName + local_To + myRelinkFileName;
         // если файл найден
         if (File (myNewLinkName).exists) {
          // запоминаем геометрические координаты предварительного изображения
          OldGeomBounds = MySeldGraphics[i][0].geometricBounds;
          // для пошагового режима
          if (selStepMode) {
           myLink.show();
           // blending settings
           if (selChTransp) {myBlendingSettings = OBJ_Effects(MySeldGraphics[i][0], InDver.substr(0,1));}
           RelinkYes = confirm (local_Relink + " " + RelinkToFilesName + "?\n\n" + myBlendingSettings);
           if (RelinkYes) {
            // запоминаем параметры предварительного изображения
            myIsImagePar = [MySeldGraphics[i][0].horizontalScale, MySeldGraphics[i][0].verticalScale, MySeldGraphics[i][0].shearAngle, MySeldGraphics[i][0].rotationAngle, OldGeomBounds];
            // отношение горизонтального и вертикального масштабов
            myPrSc = ScaleProp_HV(MySeldGraphics[i][0]);
           }
          }
          if (RelinkYes) {
           myLink.relink (File(myNewLinkName));
           myUpdLink = myLink.update();
           myNewFImage = myUpdLink.parent;
           myNewFImage.geometricBounds = OldGeomBounds;
           myCountUndo = 3;
           // для пошагового режима
           if (selStepMode == true) {
            // отключаем путь
            if (selClipPathNone == true) {
             if (myUpdLink.parent.clippingPath.clippingType != ClippingPathType.none) {
              myUpdLink.parent.clippingPath.clippingType = ClippingPathType.none;
              myCountUndo++;
             }
            }
            myUpdLink.show();
            // проверка вращения изображения на 90°
            if (selChRotate == true) {
             beRotate = false;
             // анализ вероятности поворота изображения (±90°)
             myNewPrSc = ScaleProp_HV(myNewFImage);
             if (Math.abs (myNewPrSc - myPrSc ) > myVGScDop) {
              // поворот изображения
              if (InDver.substr(0, 1) < 5) {myCountUndo = myRotateDialogCS2 (myNewFImage, myIsImagePar, myCountUndo);}
              else {myCountUndo = myRotateUIDialog (myNewFImage, myIsImagePar, myCountUndo);}
             }
            }
            // изображение - по центру фрейма
            if (selCenterCont) {
             myNewFImage.fit (FitOptions.centerContent);
             myCountUndo++;
            }
            // углы - 0 градусов
            if (selAngles_0) {
             myCountUndo = image_ZeroAngle (myNewFImage, myCountUndo, beRotate);
            }
            else {myCountUndo = anglesRounding (myNewFImage, myCountUndo);}
            // масштаб - 100 %
            if (selScale_100) {
             myCountUndo = image_VH_Scale_100 (myNewFImage, myCountUndo);
            }
            else {myCountUndo = Scale_VH (myNewFImage, myPrSc, myCountUndo);}
            // применить изменения изображения
            if (confirm (local_ApplyChanges, "", inScriptName) == false) {
             myResUndo (myCountUndo);
             CancelByURelink.push(RelinkToFilesName);
             if (confirm (local_ContinueRelink, "", inScriptName) == false) break;
            }
           else mySeccessRelinks.push(RelinkToFilesName);
           }
          else mySeccessRelinks.push(RelinkToFilesName);
          }
         else CancelByURelink.push(RelinkToFilesName);
         }
        else NoFileExistErrorLinks.push(myRelinkFileName);
        }
      else {if (myExten != nameNCE) {DuplicatsCancelObj.push(myFileNameNoExt);} else {DuplicatsCancelObj.push(myFileName);}}
      } // завершение цикла
      ReportAlerts.push(mySeccessRelinks);
      ReportAlerts.push(NoFileExistErrorLinks);
      ReportAlerts.push(DuplicatsCancelObj);
      ReportAlerts.push(CancelByURelink);
      ReportAlerts.push(MySeldGraphics.length);
      ReportAlerts.push(myExten);
      ReportAlerts.push(MyRFolder);
      return ReportAlerts;
      }

      /* Функция формирует отчет по замещению фйлов изображений документа. */
      function ReportErrorsRelink (ArrErrorsLinks, myFoundSt, DnStPage, DnEndPage, DnNSec, SelSecY, TypeDocSel) {
      // массив сообщений отчета замены связей
      var StLabelsArr = new Array(local_RepInf_1, local_RepInf_2, local_RepInf_3, local_RepInf_4, local_RepInf_5);
      var myReportRelnk = app.dialogs.add({name: local_Report, canCancel: false});
      var myFragmD = myReportRelnk.dialogColumns.add().borderPanels.add().dialogColumns.add();
      with (myFragmD) {
        var myEndRT;
        var myBegRT;
        if (ArrErrorsLinks[5]  == nameNCE) {myEndRT = local_To + ArrErrorsLinks[5] + " " + local_FNames;}
        else {myEndRT = local_To + ArrErrorsLinks[5] + local_Files;} 
        if (myFoundSt != inpVLinkStArr[3][0]) {myBegRT = "1) " + local_LinkStatus + " \"" + myFoundSt + "\"";}
        else {myBegRT = "1) " + myFoundSt;}
        // формируем отчет
        with (dialogRows.add()) {
         dialogColumns.add().staticTexts.add({staticLabel: local_Conditions});
         with (dialogColumns.add()) {
          dialogRows.add().staticTexts.add({staticLabel: myBegRT});
          dialogRows.add().staticTexts.add({staticLabel: "2) " + myStrSymbolsReplace(TypeDocSel, ",", ", ") + myEndRT});
         }
        }
        dialogRows.add().staticTexts.add({staticLabel: local_Found + " " + local_Links + ": " + ArrErrorsLinks[4]});
        for (var myBordersCount = 0; myBordersCount <  StLabelsArr.length; myBordersCount++)
        if (myBordersCount < 4) {
         BorderTextsDropdowns (myFragmD, StLabelsArr[myBordersCount], ArrErrorsLinks[myBordersCount], 230);
        }
        else {
         var mySecSelInfo;
         if (SelSecY) {mySecSelInfo =  local_OfSectionsN + (DnNSec+1);}
         else {mySecSelInfo = local_OfDocument;}
         dialogRows.add().staticTexts.add({staticLabel: PageRangeLabel + " " + DnStPage + " - " + DnEndPage + mySecSelInfo});
         BorderTextsDropdowns (myFragmD, StLabelsArr[myBordersCount], ArrErrorsLinks[7], 230);
        } 
        dialogRows.add().staticTexts.add({staticLabel: local_Folder + Folder.decode (Folder(ArrErrorsLinks[6]).name)});
      }
      myReportRelnk.show();
      myReportRelnk.destroy();
      }

      /* Функция формирует панель диалога с текстовой информацией
      и "выпадающим списком" неповторяющихся объектов массива myArray. */
      function BorderTextsDropdowns (myDialogArh, StrTextLabel, myArray, DdownsMinimW) {
      if (myArray.length > 0) {
      with (myDialogArh.borderPanels.add()) {
        staticTexts.add({staticLabel: StrTextLabel + ": " + myArray.length, minWidth: DdownsMinimW});
        try {dropdowns.add({stringList: myArray, selectedIndex: 0, minWidth: 320});}
        catch (e) {alert (e);}
        }
      }
      }

      /* Функция возвращает массив графических объектов заданного диапазона страниц  документа.*/
      function RangePagesGraphics (mySegDoc, StartEC, EndgEC, SNSel, SecStart, SecEnd) {
      var NPageStart = -1;
      var CurrtPage;
      var myGaphicsCounter;
      var MyGraphicsP = new Array();
      var MyGraphicsPFinal = new Array();
      var myLinkType;
      // для диапазона страниц документа
      for (var myPageCounter = SecStart; myPageCounter <  SecEnd; myPageCounter++) {
        CurrtPage = mySegDoc.pages[myPageCounter];
        if (StartEC == CurrtPage.name) {NPageStart = CurrtPage.name;}
        if (NPageStart != -1) {
         // дополняем массив графическими объектами страницы
         for (myGaphicsCounter = 0; myGaphicsCounter <  CurrtPage.allGraphics.length; myGaphicsCounter++) {
          if (CurrtPage.allGraphics[myGaphicsCounter].itemLink != null) {MyGraphicsP.push(CurrtPage.allGraphics[myGaphicsCounter]);}
          }
         }   
        // если имя текущей и финальной в диапазоне совпадают, то выходим из цикла
        if (EndgEC == CurrtPage.name)  break;
        }
      EndgEC = CurrtPage.name;
      /* если не найдена первая страница в диапазоне,
      то считаем, что диапазон внутри секции задан неправильно,
      заполняем массив графическими объектами выбранной секции */
      if(SNSel == true & NPageStart == -1) {
        NPageStart = mySegDoc.pages[SecStart].name;
        for(myPageCounter = SecStart; myPageCounter <  SecEnd; myPageCounter++) {
         CurrtPage = mySegDoc.pages[myPageCounter];
         // дополняем массив графическими объектами страницы
         for(myGaphicsCounter = 0; myGaphicsCounter <  CurrtPage.allGraphics.length; myGaphicsCounter++) {
          if (CurrtPage.allGraphics[myGaphicsCounter].itemLink != null) {MyGraphicsP.push(CurrtPage.allGraphics[myGaphicsCounter]);}
          }
         }
        EndgEC = CurrtPage.name;
        }
      MyGraphicsPFinal.push(MyGraphicsP);
      MyGraphicsPFinal.push(NPageStart);
      MyGraphicsPFinal.push(EndgEC);
      return MyGraphicsPFinal;
      }

      /* Функция возвращает массив параметров секций документа.
      ArrFSecPageNumbers [section number][0] - порядковый номер первой страницы секции,
      ArrFSecPageNumbers [section number][1] - "true" - включать префикс секции при нумерации,
      ArrFSecPageNumbers [section number][2] - префикс секции,
      ArrFSecPageNumbers [section number][3] - номер первой страницы секции,
      ArrFSecPageNumbers [section number][4] - количество страниц в секции.*/
      function SecRangeOfPages (myDocument) {
      var mySecEnd = 0;
      var ArrFSecPageNumbers = new Array();
      var SectionOfPage = myDocument.pages[0].appliedSection;
      var SecPrefixName = SectionOfPage.sectionPrefix;
      var SecPnumStart =  SectionOfPage.pageNumberStart;
      var SecIncludePrfx = SectionOfPage.includeSectionPrefix;
      ArrFSecPageNumbers.push([0, SecIncludePrfx, SecPrefixName, SecPnumStart, 0]);
      for (var myPageCounter = 0; myPageCounter <  myDocument.pages.length; myPageCounter++) {
        CurrentSection = myDocument.pages[myPageCounter].appliedSection;
        if (SectionOfPage != CurrentSection) {
         SecPrefixName = CurrentSection.sectionPrefix;
         SecPnumStart =  CurrentSection.pageNumberStart;
         SecIncludePrfx = CurrentSection.includeSectionPrefix;
         ArrFSecPageNumbers[ArrFSecPageNumbers.length-1][4] = mySecEnd;
         mySecEnd = 0;
         ArrFSecPageNumbers.push([myPageCounter, SecIncludePrfx, SecPrefixName, SecPnumStart, mySecEnd]);
         SectionOfPage = CurrentSection;
         }
        mySecEnd++;
        }
      ArrFSecPageNumbers[ArrFSecPageNumbers.length-1][4] = mySecEnd;
      return ArrFSecPageNumbers;
      }

      /* Функция удаления папок и системных файлов из массива объектов выбранной папки.
      Возвращает массив типов файлов (расширений). */
      function ExtenSysCheck (ArrayFilesExt) {
      var GrFilesExtArr = new Array();
      var CurrFile;
      for (var myCr = 0; myCr < ArrayFilesExt.length; myCr++) {
        CurrFile = ArrayFilesExt[myCr];
        // не папка, не системный файл
        if (typeof CurrFile.open != "undefined" && !MacOsXSysFile(CurrFile))
        GrFilesExtArr.push(FileNExt(CurrFile));
        }
      GrFilesExtArr = getUniqObjArray(GrFilesExtArr);
      return GrFilesExtArr;
      }

      /* Функция определения "системного файла" по расширению,
      если имя файла начинается с точки, то определяем его как системный файл (для Mac OS X). */
      function MacOsXSysFile(FileNamePath) {
      var myFileNamePath = String(FileNamePath);
      var EndFullPath = myFileNamePath.lastIndexOf("/");
      var myFileFirstT = myFileNamePath.substr(EndFullPath+1, 1);
      if (myFileFirstT == ".") {return true;}
      var ExtCurrFile = FileNExt (myFileNamePath);
      if(ExtCurrFile.length > 2 && ExtCurrFile.length < 5) {
        var SysExtArr = new Array ("DAT","VOL","APP","INI","SYS","COM","BAT","BAK", "ATM","TMP","DLL","REG","OLD","LOG","CFG","JSX","OTF","PFB","PFM","TTF","FON","LNK","EXE" );
        for (var extCr = 0; extCr < SysExtArr.length; extCr++) {
         if (ExtCurrFile == SysExtArr[extCr] || ExtCurrFile == SysExtArr[extCr].toLowerCase()) return true;}
        }
      else return true;
      return false;
      }

      /* Функция проверки дубликатов имен файлов
      (с расширением - при замене на идентичный тип или без расширения).
      Возвращает массив графических объектов с "разрешением замены" - ArrayGraphObjReLinksSt.
      Игнорируются файлы с дублирующимися именами:
      с расширением - при замене на тип файлов "идентичный",
      без расширения - при замене на выбранный тип, при отличающихся полных именах файлов. */
      function FindDuplicatesNames (ArrayGraphObj, myextSel, DotFirst) {
      var NameNoExt = "";
      var NameNoExtArr = new Array();
      var ArrayGraphObjReLinksSt = new Array();
      var IndFD = new Array();
      // заполняем массив имен файлов
      for (var myCr = 0; myCr < ArrayGraphObj.length; myCr++) {
        if (myextSel != nameNCE) {NameNoExt = FileNameWtExt (ArrayGraphObj[myCr].itemLink.name, DotFirst);}
        else {NameNoExt = ArrayGraphObj[myCr].itemLink.name;}
        NameNoExtArr.push (NameNoExt);
        }
      for (myCr = 0; myCr < ArrayGraphObj.length; myCr++) {
        var PathExtArr = new Array();
        IndFD = checkDoubled (NameNoExtArr, NameNoExtArr[myCr]);
        if (IndFD.length > 1){
          for (var myDuplidx = 0; myDuplidx < IndFD.length; myDuplidx++) {PathExtArr.push(ArrayGraphObj[IndFD[myDuplidx]].itemLink.filePath);}   
          if (getUniqObjArray(PathExtArr).length == 1) {ArrayGraphObjReLinksSt.push([ArrayGraphObj[myCr], true]);}
          else {ArrayGraphObjReLinksSt.push([ArrayGraphObj[myCr], false]);}
         }
        else {ArrayGraphObjReLinksSt.push([ArrayGraphObj[myCr], true]);}
        }
      return ArrayGraphObjReLinksSt;
      }

      /* Функция определения расширения файла, возвращает часть строки от крайней правой точки. */
      function FileNExt (FileNamePath) {
      var myFileNamePath = String (FileNamePath);
      var myFileNEnd = myFileNamePath.lastIndexOf (".");
      if (myFileNEnd != -1) {myFileNamePath = myFileNamePath.substr(myFileNEnd+1);}
      return myFileNamePath;
      }

      /* Функция удаляет расширение файла,
      возвращает строку от начала myFileName до первого (при myDotOrd = true)
      или последнего символа точки (myDotOrd = false). */
      function FileNameWtExt (myFileName, myDotOrd) {
      var myFileNamePath = String (myFileName);
      var myFileNEnd = myFileNamePath.lastIndexOf (".");
      if (myFileNEnd != -1) {
        myFileNamePath = myFileName.substr (0, myFileNEnd);
        if (myDotOrd) {
         // рекурсивный вызов функции
         myFileNamePath = FileNameWtExt (myFileNamePath, true);
         }
        }
      return myFileNamePath;
      }

      /* Функция получения массива типов графических файлов, которые используются в документе (ActDoc).
      Выполняется Unlock Position для всех объектов и групп с графическими изображениями документа.
      Определяется количество изображений, которые были вставлены в документ из буфера обмена (Null Link). */
      function GetFileTypeInDoc (ActDoc) {
      var myObject;
      var myImageType;
      var myDocTypeArr = new Array();
      var myDocUniqTypeArr;
      var myResultDocTypeAndCounters = new Array();
      for (var myCr = 0; myCr < ActDoc.allGraphics.length; myCr++) {
        myObject = ActDoc.allGraphics[myCr];
        myUnlock_ParentRe (myObject);
        try {
         myImageType = myObject.itemLink.linkType;
         myDocTypeArr.push(myImageType);
        }
        catch (e) {
         mySelection_ParentRe(myObject, myObject);
         if (!confirm(alertWithoutLink, "", inScriptName)) {exit();}
        }
      }
      myDocUniqTypeArr = getUniqObjArray(myDocTypeArr);
      for (myCr = 0; myCr < myDocUniqTypeArr.length; myCr++) {
        myResultDocTypeAndCounters.push([myDocUniqTypeArr[myCr], checkDoubled(myDocTypeArr, myDocUniqTypeArr[myCr]).length]);
      }
      return myResultDocTypeAndCounters;
      }

      /* Функция осуществляет переход в активном окне на разворот
      с объектом myGraphObj и выделяет mySelectObj, если обект не является содержимым текстового блока. */
      function mySelection_ParentRe (myGraphObj, mySelectObj) {
      app.activeDocument.select (mySelectObj);
      app.activeWindow.zoom (2053206906);
      if (myGraphObj.parent.constructor.name != "Story") {
        try {app.activeWindow.activeSpread = myGraphObj.parent;}
        // рекурсивный вызов при ошибке
        catch (e) {mySelection_ParentRe(myGraphObj.parent, mySelectObj);}
      }
      }

      // Функция выполняет UnLock Positon изображения myGraphObj
      function myUnlock_ParentRe (myGraphObj) {
      try {myGraphObj.parent.locked = false;}
      // рекурсивный вызов при ошибке
      catch (e) {myUnlock_ParentRe(myGraphObj.parent);}
      }

      /* Функция выполняет поиск "истинности" атрибута Nonprinting для изображения и групп, включающих текущий объект. */
      function myNonprint_ParentRe (myGraphNObj) {
      try {
        var mNonPrRes = myGraphNObj.nonprinting;
        // условие рекурсивного вызова функции
        if (mNonPrRes == false) {
         mNonPrRes = myNonprint_ParentRe (myGraphNObj.parent);
         if (mNonPrRes) {return true;}
        }
        else {return true;}

      catch (e) {return false;}
      }

      /* Функция отменяет "истинность" атрибута Nonprinting
      для изображения, его контейнера и групп, включающих текущий объект. */
      function myNonpFalse_ParentRe (myGraphFObj) {
      try {
        myGraphFObj.nonprinting = false;
        myNonpFalse_ParentRe(myGraphFObj.parent);
      }
      catch (e) {}
      }

      /* Функция поиска дубликата myObject в массиве myArray. Возвращает массив индексов найденных дубликатов в массиве. */
      function checkDoubled(myArray, myObject) {
      var IndxDupls = new Array();
      for (var objCnr = 0; objCnr < myArray.length; objCnr++) {
        if (myObject == myArray[objCnr]) {IndxDupls.push(objCnr);}
      }
      return IndxDupls;
      }

      /* Функция возвращает массив myResultArr из неповторяющихся объектов массива myArray. */
      function getUniqObjArray (myArray) {
      var myResultArr = new Array();
      var myObject;
      for (var myCounter = 0; myCounter < myArray.length; myCounter++) {
        myObject = myArray[myCounter];
        if (checkDoubled(myResultArr, myObject).length == 0) {myResultArr.push(myObject);}
      }
      return myResultArr;
      }
      function cr() {if (mn != "\u00A9\ \u0044\u006D\u0069\u0074\u0072\u0069\u0079\ \u004C\u0061\u0070\u0061\u0079\u0065\u0076") exit();}

      /* Функция получения графических объектов выбранных типов (ArrTypeFind) из массива (myRastrImageArray). */
      function getTypeRastrImages (myRastrImageArray, ArrTypeFind) {
      var myTypeResult = new Array();
      var myObject;
      var myTypeImage;
      for (var myCounter = 0; myCounter < myRastrImageArray.length; myCounter++) {
        myObject = myRastrImageArray[myCounter];
        myTypeImage = myObject.itemLink.linkType;
        for (var TypeCr = 0; TypeCr < ArrTypeFind.length; TypeCr++) {
         if (myTypeImage == ArrTypeFind[TypeCr][1] && ArrTypeFind[TypeCr][0] == true) {
          myTypeResult.push(myObject);
         }
        }
      }
      return myTypeResult;
      }

      /* Функция поворота изображения myRImage на 90° по часовой стрелке или против,
      в диалоге выбирается направление вращения. После вращения:
      изображению присваиваются значения geometricBounds исходного,
      возвращается счетчик действий над изображением - myCountNone.
      myImageArrPars  (horizontalScale, verticalScale, shearAngle, rotationAngle, geometricBounds). */
      function myRotateUIDialog (myRImage, myImageArrPars, myCountNone) {
      // Прогнозирование возможного поворота изображения при обработке
      var myPossAngleW = true;
      if (myImageArrPars[3] >= 90) myPossAngleW = false;
      // Создаем диалог
      var myR_Dialog = new Window ('dialog', myRImage.itemLink.name);
      with(myR_Dialog) {
        orientation = 'column';
        var myRotatePanel = add ('panel', undefined, RotateLabel + ":");
        with(myRotatePanel) {
         orientation = 'row';
         margins = [15, 15, 15, 15];
         spacing = 10;
         myR_Dialog.myRotateCCWRadioButton = add ('radiobutton', undefined, selRotate90CCW);
         myR_Dialog.myRotateCWRadioButton = add ('radiobutton', undefined, selRotate90CW);
         if (myPossAngleW == true) {myR_Dialog.myRotateCCWRadioButton.value = true;}
         else {myR_Dialog.myRotateCWRadioButton.value = true;}
        }
        with(add('group')) {
         orientation = 'row';
         spacing = 15;
         myR_Dialog.myOKButton = add ('button', [0,0,80,25], "OK", {name:'ok'});
         myR_Dialog.myCloseButton = add ('button', [0,0,80,25], "Cancel", {name:'cancel'});
         myR_Dialog.myCloseButton.onClick = function () {myR_Dialog.close()};
        }
      }
      var myReturn = myR_Dialog.show();
      if (myReturn) {
        // вращение изображения
        if (myR_Dialog.myRotateCWRadioButton.value ==  true) {myRImage.rotationAngle = myImageArrPars[3] - 90;}
        else {myRImage.rotationAngle = myImageArrPars[3] + 90;}
        beRotate = true;
        // перестановка вертикального и горизонтального масштабов
        myRImage.horizontalScale = myImageArrPars[1];
        myRImage.verticalScale = myImageArrPars[0];
        myRImage.shearAngle = myImageArrPars[2];
        myCountNone += 4;
        // shear angle
        if (Math.abs (myImageArrPars[2]) >= 0.1) {
         if (confirm (alertAfterRotateSAngle + " " + String(myImageArrPars[2]).substr(0, 3) + "°.\n" + alertAfterRotateSA0)) {
          myRImage.shearAngle = 0;
          myCountNone ++;
         }
        }
        // присваиваем координаты исходного изображения
        myRImage.geometricBounds = myImageArrPars[4];
        myCountNone ++;
      }
      myR_Dialog.close();
      return myCountNone;
      }

      function myRotateDialogCS2 (myRImage, myImageArrPars, myCountNone) {
      // Прогнозирование возможного поворота изображения при обработке
      var myPossAngleW = true;
      if (myImageArrPars[3] >= 90) myPossAngleW = false;
      // Создаем диалог
      var myR_Dialog = app.dialogs.add({name: myRImage.itemLink.name});
      with (myR_Dialog.dialogColumns.add().borderPanels.add()) { 
        staticTexts.add({staticLabel: RotateLabel + ":"});
        var myRotateRadioButton = radiobuttonGroups.add();  
        myRotateRadioButton.radiobuttonControls.add({staticLabel: selRotate90CW, checkedState: !myPossAngleW, minWidth:50});
        myRotateRadioButton.radiobuttonControls.add({staticLabel: selRotate90CCW, checkedState: myPossAngleW});
      }
      var myReturn = myR_Dialog.show();
      if (myReturn) {
        // вращение изображения
        if (myRotateRadioButton.selectedButton == 0) {myRImage.rotationAngle = myImageArrPars[3] - 90;}
        else {myRImage.rotationAngle = myImageArrPars[3] + 90;}
        beRotate = true;
        // перестановка вертикального и горизонтального масштабов
        myRImage.horizontalScale = myImageArrPars[1];
        myRImage.verticalScale = myImageArrPars[0];
        myRImage.shearAngle = myImageArrPars[2];
        myCountNone += 4;
        // shear angle
        if (Math.abs (myImageArrPars[2]) >= 0.1) {
         if (confirm(alertAfterRotateSAngle + " " + String(myImageArrPars[2]).substr(0, 3) + "°.\n" + alertAfterRotateSA0)) {
          myRImage.shearAngle = 0;
          myCountNone ++;
         }
        }
        // присваиваем координаты исходного изображения
        myRImage.geometricBounds = myImageArrPars[4];
        myCountNone ++;
      }
      myR_Dialog.destroy();
      return myCountNone;
      }

      /* Функция получения отношения горизонтального и вертикального масштабов изображения. */
      function ScaleProp_HV(myImage) {
      var myImageHorzSc = myImage.horizontalScale;
      var myImageVertSc = myImage.verticalScale;
      // Отношение горизонтального и вертикального масштабов
      var myOtnAbsSc = myImageHorzSc / myImageVertSc;
      return myOtnAbsSc;
      }

      /* Функция восстановления пропорций горизонтального и вертикального масштабов изображения при изначально равных значениях. */
      function Scale_VH (SclImage, OtnshBasHVsc, CountUndo) {
      var SclImageHorzSc = SclImage.horizontalScale;
      var SclImageVertSc = SclImage.verticalScale;
      if (OtnshBasHVsc > 0.9999 && OtnshBasHVsc < 1.0001) {
        if (SclImageHorzSc >= SclImageVertSc) {SclImage.verticalScale = SclImageHorzSc;}
        else {SclImage.horizontalScale = SclImageVertSc;}
        CountUndo++;
      }
      return CountUndo;
      }

      /* Функция округления до 0° углов изображения (вращения и горизонтального сдвига), значения которых меньше одной десятой. */
      function anglesRounding (SclImage, CountUndo) {
      var SclImageShearAngle = SclImage.shearAngle;
      var SclImageRotationAngle = SclImage.rotationAngle;
      if (Math.abs (SclImageShearAngle) < 0.1 && SclImageShearAngle != 0) {
        SclImage.shearAngle = 0;
        CountUndo++;
      }
      if (Math.abs (SclImageRotationAngle) < 0.1 && SclImageRotationAngle != 0) {
        SclImage.rotationAngle = 0;
        CountUndo++;
      }
      return CountUndo;
      }

      /* Функция анализа  установок прозрачности.
      Анализируется непрозрачность (Opacity) и режимы наложения (Blending Mode).
      Возвращает текстовую информацию установок прозрачности изображения и его контейнера
      при условиях: Opacity < 100% или Blending Mode - не "Normal". */
      function OBJ_Effects (TranspCh_obj, myInDesignversion) {
      var TranspSetStr = "";
      if (myInDesignversion != 4)
        try {
          var eff_obj = TranspCh_obj.transparencySettings.blendingSettings;
          var ImageBMode = eff_obj.blendMode;
         }  catch(e) {return TranspSetStr;}
      else
        try  {
          var eff_obj = TranspCh_obj;
          var ImageBMode = eff_obj.blendMode;
         }  catch(e) {return TranspSetStr;}
      var ImageOpac = eff_obj.opacity;
      var IBl = eff_obj.isolateBlending;
      var KG = eff_obj.knockoutGroup;
      if (IBl == true) IBl = "Yes"; else IBl = "No";
      if (KG == true) KG = "Yes"; else KG = "No";
      // Заполняем массив значений Blending Mode
      var MBlendMods = new Array([1852797549, "Normal"], [2020625762, "Multiply"], [2020625763, "Screen"], [2020625764, "Overlay"],
      [2020625765, "Soft Light"], [2020625766, "Hard Light"], [2020625767, "Color Dodge"], [2020625768, "Color Burn"], [2020625769, "Darken"],
      [2020625770, "Lighten"], [2020625771, "Difference"], [2020625772 , "Exclusion"], [2020625773, "Hue"], [1380545377, "Saturation"],
      [1668246642, "Color"], [2020625776, "Luminosity"]);
      // проверка Opacity и Blending Mode
      if (ImageBMode != 1852797549 | ImageOpac != 100) {
         for (var bm = 0; bm < MBlendMods.length; bm++)
         if (ImageBMode == MBlendMods[bm][0]) var bmText = MBlendMods[bm][1]; 
         TranspSetStr += TranspCh_obj.constructor.name + ":\n● Opacity: " + ImageOpac + "%\n● Blending Mode: \"" + bmText +
         "\"\n● Isolate Blending: " + IBl + "\n● Knockout Group: " + KG + "\n";
        }
      // рекурсивный вызов
      TranspSetStr += OBJ_Effects (TranspCh_obj.parent, myInDesignversion);
      return TranspSetStr;
      }

      /* Функция выбирает в строке myStringSkbk текст в круглых скобках */
      function Str_inskbk (myStringSkbk) {
      var myInSkbkString = String(myStringSkbk);
      var myStrBeg = myInSkbkString.lastIndexOf("(");
      if (myStrBeg != -1) {
        myInSkbkString = myInSkbkString.substr (myStrBeg+1);
        var myStrEnd = myInSkbkString.lastIndexOf(")");
        if (myStrEnd != -1) {myInSkbkString = myInSkbkString.substr(0, myStrEnd);}
        }
      return myInSkbkString;
      }

      /* Функция заменяет символ oldSymb на  newSymbs  в строке или массиве myArrString */
      function myStrSymbolsReplace(myStringArray, oldSymb, newSymbols) {
      var myArrString = String (myStringArray);
      var MyNewString = "";
      for (var strC=0; strC < myArrString.length; strC++)
      if (myArrString[strC] == oldSymb) {MyNewString += newSymbols;}
      else {MyNewString += myArrString[strC];}
      return MyNewString;
      }

      /* Функция установки углов (вращения и горизонтального сдвига) изображения в 0°. */
      function image_ZeroAngle (myImageUpD, cntUndo, wR) {    
      if (myImageUpD.rotationAngle != 0 && !wR) {myImageUpD.rotationAngle = 0; cntUndo++;}
      if (myImageUpD.shearAngle != 0) {myImageUpD.shearAngle = 0; cntUndo++;}
      return cntUndo;
      }

      /* Функция установки вертикального и горизонтального масштабов изображения в100 %. */
      function image_VH_Scale_100 (myImageUpD, cntUndo) {    
      if (myImageUpD.verticalScale != 100) {myImageUpD.verticalScale = 100; cntUndo++;}
      if (myImageUpD.horizontalScale != 100) {myImageUpD.horizontalScale = 100; cntUndo++;}
      return cntUndo;
      }

      /* Функция отмены действий в документе (undo), отменяется количество действий равное счетчику CPtoN. */
      function myResUndo (CPtoN) {
      for (var cUndo = 0; cUndo < CPtoN; cUndo++)
      app.activeDocument.undo();
      }

      // 09.02.2008 - 19.06.2008, 28.07.2008