/*
Images to 100%
vers. 1.8
Transform selected Images to 100% (FRSRC)
Flip - Resize - Skew - Rotate - Crop Image  (All Channels, Layers and Paths) 
∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙
An InDesign CS2-CS3 JavaScript
OS: Mac OS X, Windows XP.
∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙
Скрипт предназначен для приведения размеров изображений InDesign-документа 
к 100% масштабированию при необходимом значении эффективного разрешения, 
трансформации в соответствии со значениями углов поворота и горизонтального сдвига.

Трансформированные изображения сохраняются в папке «Images_XXXppi», 
которая создается в директории документа. 
Трансформируются все каналы, слои и пути изображений. 
Для всех слоев изображений, включая группы (Layer Sets), выполняются команды Unlink и Unlocked. 
Для трансформации эффектов, примененных к слоям, реализовано конвертирование всех 
слоев изображения, кроме Background, в Smart Objects.
При трансформации изображения в Photoshop устанавливается белый цвет (rgb: 255, 255, 255 ) 
для Background и Foreground Color.

Script Options (настройки скрипта):
(сохраняются в файле «Images100pc.txt», который создается при первом запуске)
1) выбор изображений:
• всего документа,
• текущего разворота,
• текущей страницы,
• выделенных объектов (имена изображений в выделенных объектах отображаются в выпадающем списке);
2) "Merge Visible Layers" - конвертировать "видимые слои" изображений в один слой,
• "Flatten Image" - конвертировать все слои изображения в один - Background, исключая "невидимые";
3) "Output Resolution, (pixels/inch)" - результирующее разрешение, точек/дюйм (от 36 до 2540);
4) "Step resizing factor, (%)" - коэффициент пошагового изменения разрешения, значение по умолчанию - 30
(увеличение или уменьшение разрешения изображения на 30 % за одну операцию Resize,
при значениях отношения эффективного и результирующего разрешений больше 1,30 или меньше 0,85 соответственно); 
5) "Symmetric Bleeds, (mm)" - величина симметричных вылетов результирующего изображения относительно его фрейма;
6) "Relink to transformed files" - "пересвязать" изображения к трансформированным копиям файлов,
команда Relink выполняется скриптом в InDesign, к изображениям применяется: 
• Rotation and Shear X Angle (установка значений углов вращения и горизонтального сдвига) - 0°, 
• Vertical and Horizontal Scale (горизонтальное и вертикальное масштабирование ) - 100 %, 
• Сenter Content - изображение позиционируется по центру фрейма, 
• Return Clipping Path Settings - возвращение исходных настроек  для "обтравочного пути"
(сохраняются только для Photoshop Path, для остальных: Alpha Chаnnel , User-Modified Path 
и Detect Edges устанавливается тип "None");
7) "Create a copy of the document" - создать копию документа для замещения изображений трансформированными файлами
(копия создается в директории исходного документа, название копии формируется из имени документа и индекса "_100pc.indd");
8) "Select Resample Method" (выбор алгоритма ресэмплирования изображений) - 
• при значении «Off» используется автоматический выбор Resample Method:
BICUBICSMOOTHER – увеличение разрешения изображения, 
BICUBICSHARPER – уменьшение;
• при «On» используется один из выбранных методов для ресэмплирования всех изображений:
BICUBIC, BILINEAR, NEARESTNEIGHBOR, BICUBICSMOOTHER, BICUBICSHARPER.

Файлам, с совпадающими именами (с расширением), при копировании в папку "Images_XXXppi" 
присваиваются индексы от 1 (первый дубликат имени).

Передача и выполнение скрипта в Photoshop и обратно в InDesign (Relink) 
осуществляется посредством функций BridgeTalk. 

Not Processing (не обрабатываются):
1) Missing, Modified, Embedded Links - 
отсутствующие, модифицированные и внедренные изображения;
2) Windows Metafile - WMF 
(отсутствует фильтр для открытия (растеризации) в базовой версии Photoshop Extended);
3) CompuServe GIF - файлы 
(формат не позволяет сохранять физическое разрешение - Native Resolution отличное от 72 точек/дюйм);

Установленные программы Adobe Photoshop и InDesign должны быть одной версии Creative Suite (CS).
∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙
© 2008 Дмитрий Лапаев (d.lapaev@univest-prepress.com, d.lapaev@gmail.com).
*/

with (app) 
{
	// файл настроек скрипта
	var myJScriptName = "Images to 100 percent (FRSRC)";
	var myJScriptVer = " 1.8";
	const iniFileName = "Images100pc.txt";
	var mn = "\u00A9\ \u0044\u006D\u0069\u0074\u0072\u0069\u0079\ \u004C\u0061\u0070\u0061\u0065\u0076";
	var MyStrIniFile = "";
	var imgs100ini = new File (app.activeScript.path + "/" + iniFileName);
	if (!imgs100ini.exists) 
		{	// cоздание файла инициализации 
			MyStrIniFile += "const mn = \"" + mn + "\";\n";
			MyStrIniFile += "const myJScrName = \"" + myJScriptName + myJScriptVer + "\";\n";	
			MyStrIniFile += "var inpCurrDocIdx = 0;\n";	
			MyStrIniFile += "var inpEffectiveRes = \"300\";\n";	
			MyStrIniFile += "var inpCoefficntStep = \"30\";\n";
			MyStrIniFile += "var inpSymmBleed = \"0\";\n";	
			MyStrIniFile += "var selMergeVisible = false;\n";
			MyStrIniFile += "var selFlattenImage = false;\n";	
			MyStrIniFile += "var selRelinkImages = true;\n";	
			MyStrIniFile += "var selCreateCopy = false;\n";	
			MyStrIniFile += "var selIndxRsmpMth = 0;\n";	
			MyStrIniFile += "var selAutoRsmpMth = true;\n";	
			imgs100ini.open("w");
			if (imgs100ini.write(MyStrIniFile) == true) 
				{
					alert (iniFileName + " successfully created!\n(Script Options)");
					imgs100ini.close();
					eval ("//@include \'" + iniFileName + "\';");
				} else {alert("Unable to write the ini-file!", "", true); exit();}
		} else {eval ("//@include \'" + iniFileName + "\';");}	
		
	// открытые документы
	if (app.documents.length == 0) 
	{alert (myJScrName + "\nPlease open a document and try again.", "", false); exit();}
	
	// активный документ
	var myDoc = activeDocument;
	// количество связанных файлов изображений
	var adLinksLn = myDoc.links.length;	
	if(adLinksLn == 0) 
	{alert(myJScrName + "\nNot found Links in " + myDoc.name + " !", "", false); exit();}	
	
	// выделенные объекты
	var mySelectedImages = Images_inSelection (myDoc.selection);
	var mySelectedImagesNames = new Array();
	for (var sIc = 0; sIc < mySelectedImages.length; sIc++)
		{
			try {mySelectedImagesNames.push(mySelectedImages[sIc].itemLink.name);} 
			catch (error) {mySelectedImagesNames.push("Image without Link");}
		}
	
	// диалог настроек	
	var myDialogSett = myIniScrDialog ();
	if (myDialogSett == false) {exit();}
	// инициализируем переменные
	var outEffectiveRes = myDialogSett[0];
	var outResampleMethod = "";
	switch (myDialogSett[1]) 
		{
			case 0: outResampleMethod = "BICUBIC"; break;
			case 1: outResampleMethod = "BICUBICSMOOTHER"; break;
			case 2: outResampleMethod = "BICUBICSHARPER"; break;
			case 3: outResampleMethod = "NEARESTNEIGHBOR"; break;
			case 4: outResampleMethod = "BILINEAR"; break;			
		}
	var outAutoChoiceResM = myDialogSett[2];
	var outOneStepRes = myDialogSett[3]/100;	
	var outImageBleed = myDialogSett[4];
	var relinkToTransfIm = myDialogSett[6];
	var createCopyDoc = myDialogSett[7];
	var flatten_Image = myDialogSett[8];
	var merge_VisibleLayers = myDialogSett[9];	
	// записываем настройки в файл
	MyStrIniFile = "";
	MyStrIniFile += "const mn = \"" + mn + "\";\n";
	MyStrIniFile += "const myJScrName = \"" + myJScriptName + myJScriptVer + "\";\n";	
	MyStrIniFile += "var inpCurrDocIdx = " + myDialogSett[5] + ";\n";
	MyStrIniFile += "var inpEffectiveRes = \"" + outEffectiveRes + "\";\n";	
	MyStrIniFile += "var inpCoefficntStep = \"" + myDialogSett[3] + "\";\n";
	MyStrIniFile += "var inpSymmBleed = \"" + outImageBleed + "\";\n";	
	MyStrIniFile += "var selMergeVisible = " + merge_VisibleLayers + ";\n";
	MyStrIniFile += "var selFlattenImage = " + flatten_Image + ";\n";
	MyStrIniFile += "var selRelinkImages = " + relinkToTransfIm + ";\n";	
	MyStrIniFile += "var selCreateCopy = " + createCopyDoc + ";\n";	
	MyStrIniFile += "var selIndxRsmpMth = " + myDialogSett[1] + ";\n";	
	MyStrIniFile += "var selAutoRsmpMth = " + outAutoChoiceResM + ";\n";	
	imgs100ini.open("w");
	if (imgs100ini.write(MyStrIniFile)) {imgs100ini.close();}
	else {alert("Unable to write the ini-file!", "", true); exit();}
	try 
		{	// путь документа
			var myActDocFilePath = myDoc.filePath;
			// создаем копию документа
			if (relinkToTransfIm == true & createCopyDoc == true)
				{	
					var myDocCopyFile = File(myActDocFilePath + "/" + GetFileNameWExt(myDoc.name) + "_100pc.indd");
					myDoc = myDoc.save(myDocCopyFile, false);
				}
		} 
	catch (error)
		{
			alert (myJScrName + "\nPlease Save " + myDoc.name + " and try again.", "", false); 
			exit();
		}	
	var myGr_Images = new Array();
	switch (myDialogSett[5]) 
		{
			case 0: myGr_Images = myDoc.allGraphics; break;
			case 1: myGr_Images = activeWindow.activeSpread.allGraphics ; break;
			case 2: myGr_Images = activeWindow.activePage.allGraphics; break;
			case 3: myGr_Images = Images_inSelection (myDoc.selection); break;
		}
	
	// Формируем массив растровых изображений:
	/* 1) отсеиваем изображения с необновленными и отсутствующими связями, 
	внедренные изображения предлагается сохранить в папку "/Embedded Images" */
	myGr_Images = getRLinks_Images (myGr_Images);
	if (myGr_Images == null) {exit();}

	/* 2) выбираем растровые изображения: */
	myGr_Images = getRastrImages (myGr_Images);
	if (myGr_Images.length == 0) 
	{alert (myJScrName + "\nNot found Images!", "", false); exit();}

	// создаем папку для трансформированных копий файлов
	var outFolderName = "Images_" + outEffectiveRes + "ppi";	
	var myResImagesFolder = new Folder (myActDocFilePath + "/" + outFolderName);
	if (!myResImagesFolder.exists) myResImagesFolder.create ();
	
	// считать координаты для разворота
	var oldRulerOrigin = myDoc.viewPreferences.rulerOrigin;
	myDoc.viewPreferences.rulerOrigin = RulerOrigin.spreadOrigin;
	// единицы измерения - мм
	var oldActDocH_Measures = myDoc.viewPreferences.horizontalMeasurementUnits;
	var oldActDocV_Measures = myDoc.viewPreferences.verticalMeasurementUnits;
	myDoc.viewPreferences.horizontalMeasurementUnits = MeasurementUnits.millimeters;
	myDoc.viewPreferences.verticalMeasurementUnits = MeasurementUnits.millimeters;
	
	// формируем массив параметров для трансформации изображений
	var myArrParmsTransImages = copyTransformImages (myGr_Images, outEffectiveRes, myResImagesFolder.fullName);
	
	/* скрипт для Adobe Photoshop в виде текстовой переменной (script for Adobe Photoshop) : ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙ */
	{var myScriptString = "";
	myScriptString += "const imBleed = " + outImageBleed + ";";
	myScriptString += "const stPrResize = " + outOneStepRes + ";";
	myScriptString += "const r_effRes = " + outEffectiveRes + ";";
	myScriptString += "var myImagesTransParms = new Array();";
	myScriptString += "var myImagesTransParms = " + myArrParmsTransImages.toSource () + ";";
	// Ruler Units - mm
	myScriptString += "var phtOldRulerUnits = app.preferences.rulerUnits;";
	myScriptString += "var phtOldInterpolation = app.preferences.interpolation;";
	myScriptString += "app.preferences.interpolation = ResampleMethod." + outResampleMethod + ";";
	// Photoshop Dialogs (show only errors)
	myScriptString += "app.displayDialogs = DialogModes.ERROR;";
	// Photoshop Foreground & Background Color - white (rgb: 255, 255, 255)
	myScriptString += "var phtOld_FColor = app.foregroundColor;";
	myScriptString += "var phtOld_BColor = app.backgroundColor;";
	myScriptString += "app.foregroundColor.rgb.red = 255;";
	myScriptString += "app.foregroundColor.rgb.green = 255;";
	myScriptString += "app.foregroundColor.rgb.blue = 255;";
	myScriptString += "app.backgroundColor.rgb.red = 255;";
	myScriptString += "app.backgroundColor.rgb.green = 255;";
	myScriptString += "app.backgroundColor.rgb.blue = 255;";
	/* Resample Methods: BICUBIC, BILINEAR, NEARESTNEIGHBOR, BICUBICSMOOTHER, BICUBICSHARPER */		
	myScriptString += "var myResampleMethod = ResampleMethod." + outResampleMethod + ";";
	// массив параметров текущего изображения
	myScriptString += "var myTransParms = new Array();";
	/*	
		myTransParms[0] - полный путь связанного файла,
		myTransParms[1] - минимальный коэффициент отношения исходных эффективных разрешений и результирующего,
		myTransParms[2] - коэффициент вертикального масштабирования,
		myTransParms[3] - коэффициент горизонтального масштабирования,
		myTransParms[4] - угол вращения изображения (Rotation Angle),
		myTransParms[5] - угол горизонтального сдвига изображения (Shear X Angle),
		myTransParms[6] - массив разниц геометрических координат фрейма и его изображения,
		myTransParms[7] - трансформированный файл,
		myTransParms[8] - the unique ID of the Link.
	*/
	myScriptString += "var myOpFile;";
	myScriptString += "var k_EffRes = 1;";
	myScriptString += "var k_verSc = 0;";
	myScriptString += "var k_horSc = 0;";
	myScriptString += "var imRotationAngle = 0;";
	myScriptString += "var imShearAngle = 0;";
	myScriptString += "var cr_ImBnds = new Array();";
	myScriptString += "var myFileForCopy;";
	myScriptString += "var myLinkID;";
	myScriptString += "var r_effRNPr;";
	// цикл обработки изображений
	myScriptString += "for (var imCnt = 0; imCnt < myImagesTransParms.length; imCnt ++){"
	// инициализируем переменные
	myScriptString += "var myTransParms = myImagesTransParms[imCnt];";
	myScriptString += "myOpFile = myTransParms[0];";
	myScriptString += "k_EffRes = myTransParms[1];";
	myScriptString += "k_verSc = myTransParms[2];";
	myScriptString += "k_horSc = myTransParms[3];";
	myScriptString += "imRotationAngle = myTransParms[4];";
	myScriptString += "imShearAngle = myTransParms[5] ;";
	myScriptString += "cr_ImBnds = myTransParms[6];";
	myScriptString += "myFileForCopy = myTransParms[7];";
	myScriptString += "myLinkID = myTransParms[8];";
	myScriptString += "r_effRNPr = r_effRes * Math.max (k_verSc, k_horSc);";}
	// выбор метода ресэмплирования
	if (outAutoChoiceResM)
		{
			myScriptString += "if (k_EffRes < 1) myResampleMethod = ResampleMethod.BICUBICSMOOTHER;";
			myScriptString += "else myResampleMethod = ResampleMethod.BICUBICSHARPER;";
		}
	myScriptString += "try {";
	myScriptString += "var Re_smplFile = myFileForCopy;";
	myScriptString += "try {myOpFile.copy (Re_smplFile);}";
	myScriptString += "catch (error) {alert (error, \"\", true);}";
	myScriptString += "try {var myOpenDoc = app.open (Re_smplFile);}";
	myScriptString += "catch (error) {alert (error + \'. \' + File.decode(Re_smplFile), \"\", true);}";
	// Merge Layers
	if (merge_VisibleLayers & flatten_Image) 
	{myScriptString += "myOpenDoc.flatten();";}
	else if (merge_VisibleLayers) {
		myScriptString += "for (var vlc = 0; vlc < myOpenDoc.layers.length; vlc++){";
		myScriptString += "if (myOpenDoc.layers[vlc].visible){";
		myScriptString += "app.activeDocument.activeLayer = myOpenDoc.layers[vlc]; try{myOpenDoc.mergeVisibleLayers();} catch (e){} break;}}";}
	// unlink & unlock layers
	myScriptString += "unLLTrnff_Sets (myOpenDoc);";
	// convert All Layers to Smart Objects (excl. Background Layer)
	myScriptString += "layersToSmartObj (myOpenDoc);";
	// Flip Canvas
	myScriptString += "if (k_verSc < 0) {myOpenDoc.flipCanvas (Direction.VERTICAL); k_verSc = - k_verSc;}"; 		
	// Image Resize
	myScriptString += "app.preferences.rulerUnits = Units.PERCENT;";
	myScriptString += "var inpReslt = myOpenDoc.resolution;";	
			//  reduction of resolution	 
	myScriptString += "var stepKf = 1 + stPrResize;";	
	myScriptString += "while (stepKf < k_EffRes) {";
	myScriptString += "myOpenDoc.resizeImage (myOpenDoc.width, myOpenDoc.height, inpReslt / stepKf, myResampleMethod);";
	myScriptString += "stepKf += stPrResize;}";
			// enlargement of resolution
	myScriptString += "stepKf = 1 - stPrResize/2;";		
	myScriptString += "while (stepKf > k_EffRes) {";
	myScriptString += "myOpenDoc.resizeImage (myOpenDoc.width, myOpenDoc.height, inpReslt / stepKf, myResampleMethod);";
	myScriptString += "stepKf -= stPrResize/2;}";
			// final resolution
	myScriptString += "myOpenDoc.resizeImage (myOpenDoc.width, myOpenDoc.height, inpReslt / k_EffRes, myResampleMethod);";
	myScriptString += "app.preferences.rulerUnits = Units.PIXELS;";
	myScriptString += "myOpenDoc.resizeImage (myOpenDoc.width, myOpenDoc.height, r_effRes, myResampleMethod);";
			// resize Width or Height (reduction)
	if (outAutoChoiceResM == true) {myScriptString += "myResampleMethod = ResampleMethod.BICUBICSHARPER;";}
	myScriptString += "WidthOrHeightRsmpl (myOpenDoc, k_horSc, k_verSc, stPrResize, myResampleMethod);";			
	// Skew
	myScriptString += "app.preferences.rulerUnits = Units.MM;";
	if (outAutoChoiceResM == true) {myScriptString += "app.preferences.interpolation = ResampleMethod.BICUBICSHARPER;";}
	myScriptString += "if( Math.abs (imShearAngle) > 0.01 ) myShearXAngle ( imShearAngle );";
	// Rotate Canvas	
	myScriptString += "if( Math.abs (imRotationAngle) > 0.01 ) app.activeDocument.rotateCanvas ( imRotationAngle );";
	// Crop Image
	myScriptString += "var Crbounds = new Array (cr_ImBnds[1] - imBleed, cr_ImBnds[0] - imBleed, myOpenDoc.width + cr_ImBnds[3] + imBleed, myOpenDoc.height + cr_ImBnds[2] + imBleed);";
	myScriptString += "myOpenDoc.crop ( Crbounds );";
	myScriptString += "var kompK_RotW = - imBleed + ( myOpenDoc.width - cr_ImBnds[4] )/2;";
	myScriptString += "var kompK_RotH = - imBleed + ( myOpenDoc.height - cr_ImBnds[5] )/2;";
	myScriptString += "Crbounds = [kompK_RotW, kompK_RotH, myOpenDoc.width - kompK_RotW, myOpenDoc.height - kompK_RotH];";
	myScriptString += "myOpenDoc.crop ( Crbounds );";
	// сохраняем и закрываем файл
	myScriptString += "myOpenDoc.save ();";
	myScriptString += "myOpenDoc.close (SaveOptions.DONOTSAVECHANGES);";

	// замещение файлов - формируем скрипт для InDesign ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙ */
	if(relinkToTransfIm) 
		{
			myScriptString += "var myInDScrStr = \"var myLink = app.activeDocument.links.itemByID(\" + myLinkID + \");\";"; 	
			myScriptString += "myInDScrStr += \"myLink.show();\";";	
			myScriptString += "myInDScrStr += \"var selImage = myLink.parent;\";"; 
			myScriptString += "myInDScrStr += \"if (selImage.clippingPath.clippingType != ClippingPathType.none)\";"; 
			myScriptString += "myInDScrStr += \"{var rClippPathSett = memClippPathSett (selImage.clippingPath);\";";
			myScriptString += "myInDScrStr += \"selImage.clippingPath.clippingType = ClippingPathType.none;}\";";	
			myScriptString += "myInDScrStr += \"try {myLink.relink(\" + myFileForCopy.toSource() + \");}\";";
			myScriptString += "myInDScrStr += \"catch (e) {alert (e); exit();}\";";
			myScriptString += "myInDScrStr += \"try {var myUpdLink = myLink.update();}\";";
			myScriptString += "myInDScrStr += \"catch (e) {alert (e); exit();}\";";
			myScriptString += "myInDScrStr += \"var myImageUpD = myUpdLink.parent;\";";	
								// углы - 0°, масштаб - 100 %, по центру фрейма
			myScriptString += "myInDScrStr += \"myImageUpD.rotationAngle = 0;\";";
			myScriptString += "myInDScrStr += \"myImageUpD.shearAngle = 0;\";";
			myScriptString += "myInDScrStr += \"myImageUpD.verticalScale = 100;\";";
			myScriptString += "myInDScrStr += \"myImageUpD.horizontalScale = 100;\";";
			myScriptString += "myInDScrStr += \"myImageUpD.fit (FitOptions.centerContent);\";";	
			myScriptString += "myInDScrStr += \"app.select(myImageUpD);\";";	
								// возвращаем избражению параметры для генерации пути
			myScriptString += "myInDScrStr += \"if (rClippPathSett[0] == ClippingPathType.photoshopPath)\";";	
			myScriptString += "myInDScrStr += \"{set_ClippPath (myImageUpD.clippingPath, rClippPathSett);}\";";	
			myScriptString += "myInDScrStr += \"exit();\";";

			// Функция назначения параметров "обтравочного пути" изображения. 
			myScriptString += "myInDScrStr += \"function set_ClippPath (myImageClppPSett, myClippPath){\";";
			myScriptString += "myInDScrStr += \"try {myImageClppPSett.clippingType = myClippPath[0];} catch (e) {}\";";
			myScriptString += "myInDScrStr += \"try {myImageClppPSett.appliedPathName = myClippPath[1];} catch (e) {}\";";	
			myScriptString += "myInDScrStr += \"try {myImageClppPSett.threshold = myClippPath[2];} catch (e) {}\";";
			myScriptString += "myInDScrStr += \"try {myImageClppPSett.tolerance = myClippPath[3];} catch (e) {}\";"; 
			myScriptString += "myInDScrStr += \"try {myImageClppPSett.insetFrame = myClippPath [4];} catch (e) {}\";";
			myScriptString += "myInDScrStr += \"try {myImageClppPSett.useHighResolutionImage = myClippPath[5];} catch (e) {}\";";
			myScriptString += "myInDScrStr += \"try {myImageClppPSett.includeInsideEdges = myClippPath[6];} catch (e) {}\";";
			myScriptString += "myInDScrStr += \"try {myImageClppPSett.restrictToFrame = myClippPath[7];} catch (e) {}\";";
			myScriptString += "myInDScrStr += \"try {myImageClppPSett.invertPath = myClippPath[8];} catch (e) {}}\";";
			// Функция сохранения установок "обтравочного пути" изображения. 
			myScriptString += "myInDScrStr += \"function memClippPathSett (myiMClippPathSett){\";";
			myScriptString += "myInDScrStr += \"var myImCPSArr = new Array();\";";
			myScriptString += "myInDScrStr += \"myImCPSArr.push(myiMClippPathSett.clippingType);\";";
			myScriptString += "myInDScrStr += \"myImCPSArr.push(myiMClippPathSett.appliedPathName);\";";
			myScriptString += "myInDScrStr += \"myImCPSArr.push(myiMClippPathSett.threshold);\";";
			myScriptString += "myInDScrStr += \"myImCPSArr.push(myiMClippPathSett.tolerance);\";";
			myScriptString += "myInDScrStr += \"myImCPSArr.push(myiMClippPathSett.insetFrame);\";";
			myScriptString += "myInDScrStr += \"myImCPSArr.push(myiMClippPathSett.useHighResolutionImage);\";";
			myScriptString += "myInDScrStr += \"myImCPSArr.push(myiMClippPathSett.includeInsideEdges);\";";
			myScriptString += "myInDScrStr += \"myImCPSArr.push(myiMClippPathSett.restrictToFrame);\";";
			myScriptString += "myInDScrStr += \"myImCPSArr.push(myiMClippPathSett.invertPath);\";";
			myScriptString += "myInDScrStr += \"return myImCPSArr;}\";";
			
			myScriptString += "BridgeTalk.bringToFront ( \"indesign\" );";
			myScriptString += "var myBTobj = new BridgeTalk;";
			myScriptString += "myBTobj.target = \"indesign\" ;";
			myScriptString += "myBTobj.body = myInDScrStr;";
			myScriptString += "myBTobj.send();"; 
		}
	myScriptString += "} catch (error) {alert (error, \"\", true);}";
	// завершение цикла обработки изображений
	myScriptString += "}"; 
	myScriptString += "app.preferences.rulerUnits = phtOldRulerUnits;";
	myScriptString += "app.preferences.interpolation = phtOldInterpolation;";
	// return Foreground and Background Colors 
	myScriptString += "app.foregroundColor = phtOld_FColor;";
	myScriptString += "app.backgroundColor =  phtOld_BColor;";
	// cообщение о завершении обработки изображений
	myScriptString += "var myFinalAlert = \"alert (\'Transform Images is completed!\');\";";
	myScriptString += "BridgeTalk.bringToFront ( \"indesign\" );";
	myScriptString += "var myBTobj = new BridgeTalk;";
	myScriptString += "myBTobj.target = \"indesign\" ;";
	myScriptString += "myBTobj.body = myFinalAlert;";
	myScriptString += "myBTobj.send();"; 
	myScriptString += "exit();";
	
	// ФУНКЦИИ:	∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙ */
	/* функция конвертирования слоев документа, исключая  Background, в Smart Objects */
	myScriptString += "function layersToSmartObj (myL_Document){";
	myScriptString += "var myLyr_Visible;";
	myScriptString += "for (var lc = 0; lc < myL_Document.artLayers.length; lc++){";
	myScriptString += "if (!myL_Document.artLayers[lc].isBackgroundLayer){";
	myScriptString += "myLyr_Visible = myL_Document.artLayers[lc].visible;";
	myScriptString += "app.activeDocument.activeLayer = myL_Document.artLayers[lc];";
	myScriptString += "var newPL = stringIDToTypeID (\"newPlacedLayer\");";
	myScriptString += "executeAction( newPL, undefined, DialogModes.NO ); app.activeDocument.activeLayer.visible = myLyr_Visible;}}";
	myScriptString += "for (var lsetC = 0; lsetC < myL_Document.layerSets.length; lsetC++){";
	myScriptString += "layersToSmartObj (myL_Document.layerSets [lsetC]);}}"; // рекурсивный вызов
	
	/* функция выполняет unlink и unlock для всех слоев документа, включая группы - layerSets */
	myScriptString += "function unLLTrnff_Sets (myDoc_layers){";
	myScriptString += "for (var alC = 0; alC < myDoc_layers.artLayers.length; alC++){";
	myScriptString += "unLock_unLinkAL (myDoc_layers.artLayers [alC]);}";
	myScriptString += "for (var imLs = 0; imLs < myDoc_layers.layerSets.length; imLs++){";
	myScriptString += "unLock_unLinkAL (myDoc_layers.layerSets [imLs]);";
	myScriptString += "unLLTrnff_Sets (myDoc_layers.layerSets [imLs]);}}"; // рекурсивный вызов
	
	/* функция выполняет unlink, unlock для слоя a_layer*/
	myScriptString += "function unLock_unLinkAL (a_layer){";
	myScriptString += "var myLrsVisible = new Array();";
	myScriptString += "var myL_Visible = a_layer.visible;";
	myScriptString += "var myUnlinkLayer;";
	myScriptString += "for (var i = 0; i < a_layer.linkedLayers.length; i ++)  {myLrsVisible.push (a_layer.linkedLayers[i].visible);}"; 
	myScriptString += "for (i = 0; i < a_layer.linkedLayers.length; i ++)  {myUnlinkLayer = a_layer.linkedLayers[i]; myUnlinkLayer.unlink(); myUnlinkLayer.visible = myLrsVisible[i];}"; 
	myScriptString += "try {if (a_layer.allLocked) a_layer.allLocked = false;} catch (e){}";
	myScriptString += "try {if (a_layer.positionLocked) a_layer.positionLocked = false;} catch (e){}";
	myScriptString += "try {if (a_layer.pixelsLocked) a_layer.pixelsLocked = false;} catch (e){}";
	myScriptString += "try {if (a_layer.transparentPixelsLocked) a_layer.transparentPixelsLocked = false;} catch (e){}";
	myScriptString += "try {a_layer.visible = myL_Visible;} catch (e){}}";
	
	/* функция выполняет горизонтальный сдвиг объектов изображения: 
	сдвигаются все слои, пути, дополнительные каналы,
	угол - myAngle (град.) */
	myScriptString += "function myShearXAngle ( myAngle ){";
	myScriptString += "var myDocH = app.activeDocument.height;";
	myScriptString += "var myDocW = app.activeDocument.width;";
	myScriptString += "var myCanvasOffset = myDocH*Math.tan( Math.abs (myAngle) * Math.PI/180 );";
	myScriptString += "app.activeDocument.resizeCanvas (myDocW + myCanvasOffset, myDocH, AnchorPosition.MIDDLECENTER);";
	myScriptString += "myDocH = app.activeDocument.height;";
	myScriptString += "myDocW = app.activeDocument.width;";
	myScriptString += "var myLayerVisible = true;";
	myScriptString += "var myLayerOverD = 0;";
	// слои документа (Art Layers)
	myScriptString += "for (var imObC = 0; imObC < app.activeDocument.layers.length; imObC++)";
	myScriptString += "{myLayerVisible = app.activeDocument.layers[imObC].visible;";
	myScriptString += "app.activeDocument.activeLayer = app.activeDocument.layers[imObC];";
	myScriptString += "try{app.activeDocument.activeLayer.visible = true;} catch(e){}";
	myScriptString += "if (app.activeDocument.activeLayer.kind == LayerKind.TEXT | app.activeDocument.activeLayer.kind == LayerKind.SMARTOBJECT)";
	myScriptString += "{app.activeDocument.activeLayer.rasterize(RasterizeType.ENTIRELAYER);}";
	myScriptString += "app.activeDocument.selection.selectAll();";
	myScriptString += "myLayerOverD = 2 * deltaBnds_LayerSelect();";
	myScriptString += "if (myLayerOverD > 0) {app.activeDocument.resizeCanvas (myDocW + myLayerOverD, myDocH + myLayerOverD, AnchorPosition.MIDDLECENTER);";
	myScriptString += "app.activeDocument.selection.selectAll();}";
	myScriptString += "objSkewXAngle ( myAngle, \"Lyr \" );";	
	myScriptString += "try{app.activeDocument.activeLayer.visible = myLayerVisible;} catch(e){}}";
	myScriptString += "app.activeDocument.selection.deselect();";
	// пути (Path Items)
	myScriptString += "for (imObC = 0; imObC < app.activeDocument.pathItems.length; imObC++)";
	myScriptString += "{app.activeDocument.pathItems[imObC].select(); objSkewXAngle ( myAngle, \"Path\" );}";
	myScriptString += "app.activeDocument.selection.deselect();";
	// дополнительные каналы
	myScriptString += "var myImActChannels = new Array();";
	myScriptString += "for (imObC = 0; imObC < app.activeDocument.channels.length; imObC++){"
	myScriptString += "if(app.activeDocument.channels[imObC].kind != ChannelType.COMPONENT) {myImActChannels.push(app.activeDocument.channels[imObC]);}}";
	myScriptString += "if(myImActChannels.length > 0) {app.activeDocument.activeChannels = myImActChannels; objSkewXAngle ( myAngle, \"Lyr \");}}";
	
	/* функция вычисления максимальной разницы геометрических координат текущего слоя и документа */
	myScriptString += "function deltaBnds_LayerSelect(){";
	myScriptString += "var myExpVal = 0;";
	myScriptString += "var myLayerBounds = app.activeDocument.activeLayer.bounds;";
	myScriptString += "var mySelBounds = app.activeDocument.selection.bounds;";
	myScriptString += "var myBndsX0_Y0min = Math.min (myLayerBounds[0], myLayerBounds[1]);";
	myScriptString += "var myBndsX1_Y1min = Math.min (mySelBounds[2] - myLayerBounds[2], mySelBounds[3] - myLayerBounds[3]);";
	myScriptString += "var myBndsMin = Math.min(myBndsX0_Y0min, myBndsX1_Y1min);";
	myScriptString += "if(myBndsMin < 0) myExpVal = Math.abs (Math.floor (myBndsMin));";
	myScriptString += "return myExpVal;}";
	
	/* функция выполняет горизонтальный сдвиг теущего обьекта изображения: угол - skewAngle (град.) */
	myScriptString += "function objSkewXAngle ( skewAngle, objType ){";
	myScriptString += "var Tr_Name = charIDToTypeID( \"Trnf\" );";
	myScriptString += "var nt_Descriptor = new ActionDescriptor();";
	myScriptString += "var id15 = charIDToTypeID( \"null\" );";
	myScriptString += "var newActRef = new ActionReference();";
	myScriptString += "var id16 = charIDToTypeID( objType );";
	myScriptString += "var id17 = charIDToTypeID( \"Ordn\" );";
	myScriptString += "var id18 = charIDToTypeID( \"Trgt\" );";
	myScriptString += "newActRef.putEnumerated( id16, id17, id18 );";
	myScriptString += "nt_Descriptor.putReference( id15, newActRef );";
	myScriptString += "var id19 = charIDToTypeID( \"FTcs\" );";
	myScriptString += "var id20 = charIDToTypeID( \"QCSt\" );";
	myScriptString += "var id21 = charIDToTypeID( \"Qcsa\" );";
	myScriptString += "nt_Descriptor.putEnumerated( id19, id20, id21 );";
	myScriptString += "var id22 = charIDToTypeID( \"Ofst\" );";
	myScriptString += "var nt_Descriptor2 = new ActionDescriptor();";
	myScriptString += "var id23 = charIDToTypeID( \"Hrzn\" );";
	myScriptString += "var id24 = charIDToTypeID( \"#Rlt\" );";
	myScriptString += "nt_Descriptor2.putUnitDouble( id23, id24, 0.000000 );";
	myScriptString += "var id25 = charIDToTypeID( \"Vrtc\" );";
	myScriptString += "var id26 = charIDToTypeID( \"#Rlt\" );";
	myScriptString += "nt_Descriptor2.putUnitDouble( id25, id26, 0.000000 );";
	myScriptString += "var id27 = charIDToTypeID( \"Ofst\" );";
	myScriptString += "nt_Descriptor.putObject( id22, id27, nt_Descriptor2 );";
	myScriptString += "var id28 = charIDToTypeID( \"Skew\" );";
	myScriptString += "var nt_Descriptor3 = new ActionDescriptor();";
	myScriptString += "var id29 = charIDToTypeID( \"Hrzn\" );";
	myScriptString += "var id30 = charIDToTypeID( \"#Ang\" );";
	myScriptString += "nt_Descriptor3.putUnitDouble( id29, id30, skewAngle );";
	myScriptString += "var id31 = charIDToTypeID( \"Vrtc\" ); ";
	myScriptString += "var id32 = charIDToTypeID( \"#Ang\" );";
	myScriptString += "nt_Descriptor3.putUnitDouble( id31, id32, 0.000000 );";
	myScriptString += "var id33 = charIDToTypeID( \"Pnt \" );";
	myScriptString += "nt_Descriptor.putObject( id28, id33, nt_Descriptor3 );";
	myScriptString += "try {executeAction( Tr_Name, nt_Descriptor, DialogModes.NO );} catch(e){}}";
	
	/* функция выполняет пошаговое уменьшение высоты или ширины изображения. */
	myScriptString += "function WidthOrHeightRsmpl (Act_Image, khorSc, kverSc, steProc, RsmpMeth)";
	myScriptString += "{"
	myScriptString += "var horScaleW = Act_Image.width;";
	myScriptString += "var vertScaleH = Act_Image.height;";	
	myScriptString += "var stKf = 1 + steProc;";	
	myScriptString += "if( khorSc > kverSc ){"; 	
	myScriptString += "while (khorSc/kverSc > stKf ) {";
	myScriptString += "Act_Image.resizeImage (horScaleW, vertScaleH / stKf, r_effRes, RsmpMeth);";
	myScriptString += "stKf += steProc;} Act_Image.resizeImage (horScaleW, kverSc*vertScaleH/khorSc, r_effRes, RsmpMeth);}";
	myScriptString += "else{"; 	
	myScriptString += "while (kverSc/khorSc > stKf ) {";
	myScriptString += "Act_Image.resizeImage (horScaleW / stKf, vertScaleH, r_effRes, RsmpMeth);";
	myScriptString += "stKf += steProc;} Act_Image.resizeImage (khorSc*horScaleW/kverSc, vertScaleH, r_effRes, RsmpMeth);}";
	myScriptString += "}"

	/* создаем и выполняем объект BridgeTalk: */
	if (runAppBT("photoshop")) 
		{
			var myBTobj = new BridgeTalk;
			myBTobj.target = "photoshop";
			myBTobj.body = myScriptString;
			myBTobj.send();
		} 
	else {alert ("Photoshop is not running!");}
	// возвращаем исходные единицы измерения документа
	app.activeDocument.viewPreferences.rulerOrigin = oldRulerOrigin;
	app.activeDocument.viewPreferences.horizontalMeasurementUnits = oldActDocH_Measures;
	app.activeDocument.viewPreferences.verticalMeasurementUnits = oldActDocV_Measures;
exit();
}

//ФУНКЦИИ:	****************************************************************************************************
/* Функция отображения диалога настроек.
Возвращает массив настроек mySelSettings. */
function myIniScrDialog ()
{
	var mySelSettings = new Array();
	var myDialog = app.dialogs.add({name: myJScrName + "  " + mn});
	with(myDialog.dialogColumns.add())
		{ 	
			with(borderPanels.add().dialogColumns.add())
				{	
					// текущая страница и разворот
					var myActObj = myCurrPageNSpreadR();
					var selDocItem = new Array (["Document: " + app.activeDocument.name, false], ["Spread: " + myActObj[1], false], ["Page: " + myActObj[0], false], ["Selection:", false],);
					selDocItem[inpCurrDocIdx][1] = true;
					var mySelectItem= dialogRows.add().radiobuttonGroups.add();
					for (var aIc = 0; aIc < selDocItem.length; aIc++) 
					mySelectItem.radiobuttonControls.add({staticLabel:selDocItem[aIc][0], checkedState:selDocItem[aIc][1], minWidth: 255});
					dropdowns.add({stringList: mySelectedImagesNames, selectedIndex: 0, minWidth:270});
					with (borderPanels.add().dialogColumns.add())
						{
							var myImageMergeVL = enablingGroups.add({staticLabel:"Merge Visible Layers", checkedState: selMergeVisible});
							var myImageFlatten = myImageMergeVL.checkboxControls.add({staticLabel:"Flatten Image", checkedState: selFlattenImage, minWidth: 225});
							with (borderPanels.add())
								{
									with (dialogColumns.add())
										{			
											staticTexts.add({staticLabel:"Output Resolution:"});								
											staticTexts.add({staticLabel:"Step resizing factor:", minWidth: 130});	
											staticTexts.add({staticLabel:"Symmetric Bleeds:"});
										}
									with (dialogColumns.add())
										{
											var selEffres = integerEditboxes.add({editContents: inpEffectiveRes, minimumValue: 36, maximumValue: 2540, minWidth: 50});
											var stepCoeff = integerComboboxes.add({stringList: ["10", "15", "25", "30", "40", "50", "75", "100", "150", "200"], editContents: inpCoefficntStep, minWidth:50});
											var imSymBleed= integerComboboxes.add({stringList: ["0", "1", "2", "3", "4", "5", "10"], editContents: inpSymmBleed, minWidth: 50});
										}
									with (dialogColumns.add())
										{			
											staticTexts.add({staticLabel:"ppi"});								
											staticTexts.add({staticLabel:"%", minWidth: 30});	
											staticTexts.add({staticLabel:"mm"});
										}
								}
						}
					var myRelinkToTransfIm =  enablingGroups.add({staticLabel:"Relink to transformed files", checkedState: selRelinkImages});
					var myCreateCopyDoc = myRelinkToTransfIm.checkboxControls.add({staticLabel:"Create a copy of the document", checkedState: selCreateCopy, minWidth: 250});
				}
				var myRsmpMethAuto =  enablingGroups.add({staticLabel:"Select Resample Method:", checkedState: !selAutoRsmpMth});
				var selRsmplMethod = new Array ("Bicubic (best for smooth gradients)", "Bicubic Smoother (best for enlargement)", "Bicubic Sharper (best for reduction)", "Nearest Neighbor (preserve hard edges)", "Bilinear");
				var myRsmpMethSel = myRsmpMethAuto.dropdowns.add({stringList: selRsmplMethod, selectedIndex: selIndxRsmpMth, minWidth:275});	
			
		}
	if (myDialog.show())
		{
			mySelSettings[0] = selEffres.editValue;
			mySelSettings[1] = myRsmpMethSel.selectedIndex;
			mySelSettings[2] = !myRsmpMethAuto.checkedState;
			mySelSettings[3] = stepCoeff.editValue;
			mySelSettings[4] = imSymBleed.editValue;
			mySelSettings[5] = mySelectItem.selectedButton;
			mySelSettings[6] = myRelinkToTransfIm.checkedState;
			mySelSettings[7] = myCreateCopyDoc.checkedState;
			mySelSettings[8] = myImageFlatten.checkedState;
			mySelSettings[9] = myImageMergeVL.checkedState;
			myDialog.destroy();
			return mySelSettings;
		}
	else 
		{
			myDialog.destroy();
			return false;
		}
}

/* Функция запуска приложения (функции BridgeTalk). */
function runAppBT (AdobeAppRun) 
{
	try {
		if (BridgeTalk.isRunning(AdobeAppRun)) {BridgeTalk.bringToFront (AdobeAppRun);}
		else {BridgeTalk.launch (AdobeAppRun); BridgeTalk.bringToFront (AdobeAppRun);}
		return true;} 
	catch (e) {return false;}
}

/* Функция отсеивания графических объектов с необновленными и отсутствующими связями 
с файлами изображений из массива myImageArray. Внедренные изображения предлагается сохранить 
в папку "/Embedded Images". */
function getRLinks_Images (myImageArray)
{
	var myResult = new Array();
	var myEmbImages = new Array();
	var myGrObject;
	var myImConstrName = "";
	
	for (var myImCr = 0; myImCr < myImageArray.length; myImCr++)
		{
			myGrObject = myImageArray[myImCr];
			myImConstrName = myGrObject.constructor.name;
			try { 
					if (myGrObject.itemLink.status == LinkStatus.normal) 
					{myResult.push(myGrObject);}
					else if (myGrObject.itemLink.status == LinkStatus.linkEmbedded) 
					{myEmbImages.push(myGrObject);}} 
			catch (error) 
				{
					app.activeDocument.select (myGrObject);
					if (!confirm ("Selected object: "+ myImConstrName + " without Link!\nContinue?")) return null;}}
	// для внедренных изображений
	if (myEmbImages.length > 0) {	
		if (confirm("Unembed Files?")) {
			// папка для сохранения внедренных изображений
			var myEmbdImagesFolder = new Folder(app.activeDocument.filePath + "/Embedded Images");
			if (!myEmbdImagesFolder.exists) {myEmbdImagesFolder.create ();}
			var mySaveFiles;
			for (var embCn = 0; embCn < myEmbImages.length; embCn++){
				mySaveFiles = new File(myEmbdImagesFolder.fullName + "/" + myEmbImages[embCn].itemLink.name);						
				if (!mySaveFiles.exists) {myEmbImages[embCn].itemLink.unembed (myEmbdImagesFolder); myResult.push (myEmbImages[embCn]);}	
				else {myEmbImages[embCn].itemLink.show();
					if (confirm (myEmbImages[embCn].itemLink.name + " - file already exist in the folder!\nDo you want to overwrite the file with the embedded data?"))
					{myEmbImages[embCn].itemLink.unembed (myEmbdImagesFolder); myResult.push (myEmbImages[embCn]);}}}}}
return myResult;
}

/* Функция возвращает массив растровых изображений из  массива  myGrObjArray*/
function getRastrImages (myGrObjArray) 
{
	var myRastrImages = new Array();
	var typeLink_Gr = "";
	var ImColorSpace = "";
	for (var imgCn = 0; imgCn < myGrObjArray.length; imgCn++) {
			typeLink_Gr = myGrObjArray[imgCn].itemLink.linkType;
			if (typeLink_Gr != "CompuServe GIF") {
				try {ImColorSpace =  myGrObjArray[imgCn].space; myRastrImages.push(myGrObjArray[imgCn]);}
				catch (e) {
					try {if (findWord_inStr (myGrObjArray[imgCn].itemLink.linkXmp.creator, "Photoshop")) {myRastrImages.push (myGrObjArray[imgCn]);}}
					catch (e) {} }}}
return myRastrImages;
}

/* Функция возвращает истинность при обнаружении слова myWord в строке myT_String. */	
function findWord_inStr(myT_String, myWord)
{
	myT_String = String(myT_String);
	var myWrdLength = myWord.length;
	for (var chCnt = 0; chCnt < myT_String.length; chCnt++)
	{if (myT_String[chCnt] == myWord[0] & myT_String.substr(chCnt, myWrdLength) == myWord) 
		{return true;}}
return false;
}

/* Функция возвращает массив параметров изображений, необходимых для трансформации копий файлов. */
function copyTransformImages (myImagesArray, finalResolution, transfImagesFolder) 
{
	var myImagesParms = new Array();
	var myLinksNames = new Array();
	var myCurrImage;
	var myImageLink_name = "";
	var myDuplNameIdx = 0;
	var myTransR_File;	
	// для всех изображений массива myImagesArray
	for (var imCn = 0; imCn < myImagesArray.length; imCn++)
		{
			myCurrImage = myImagesArray[imCn];
			myImageLink_name = myCurrImage.itemLink.name;
			myDuplNameIdx = checkDoubled (myLinksNames, myImageLink_name).length;
			if (myDuplNameIdx == 0) {myTransR_File = new File(transfImagesFolder + "/" + myImageLink_name);}
			else {myTransR_File = new File(transfImagesFolder + "/" + GetFileNameWExt (myImageLink_name) + "_" + myDuplNameIdx + "." + fileName_Ext(myImageLink_name));}
			myLinksNames.push(myImageLink_name);
			myImagesParms.push(currImageTransfPar (myCurrImage, finalResolution, myTransR_File));
		}
return myImagesParms;
}

/* Функция поиска дубликата 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;
}

/* Функция возвращает расширение файла. */
function fileName_Ext (file_Name) 
{
	var myFileExten = String(file_Name).split (".");
	if (myFileExten.length > 1) {myFileExten = myFileExten[myFileExten.length -1];}
	else {myFileExten = "";}
return myFileExten;
}

/* Функция удаляет расширение файла. */
function GetFileNameWExt (myFileName) 
{
	var myString_name = String (myFileName);
	var myFileEndDot = myString_name.lastIndexOf (".");
	if (myFileEndDot != -1) 
	{myString_name = myString_name.substr (0, myFileEndDot);}
return myString_name;
}

/* Функция возвращает массив параметров изображения 
(используется для трансформации копии связанного файла). 
myImParms[0] - полный путь связанного файла,
myImParms[1] - минимальный коэффициент отношения исходных эффективных разрешений и результирующего,
myImParms[2] - коэффициент вертикального масштабирования,
myImParms[3] - коэффициент горизонтального масштабирования,
myImParms[4] - угол вращения изображения (Rotation Angle),
myImParms[5] - угол горизонтального сдвига изображения (Shear X Angle),
myImParms[6] - массив разниц геометрических координат фрейма и его изображения,
myImParms[7] - трансформированный файл,
myImParms[8] - the unique ID of the Link. */
function currImageTransfPar (myTransfImage, outputRes, outputPath)
{
	var myImParms = new Array ();
	// 1.Коэффициенты:
	// 1.1) коэффициенты отношения исходного эффективного разрешения и результирующего
	var kEffectToBaseRes = 1; 
	try 
		{  var kEffectToBaseRes0 = myTransfImage.effectivePpi[0] / outputRes; // horizontal
			var kEffectToBaseRes1 = myTransfImage.effectivePpi[1] / outputRes; // vertical
			// выбираем меньший коэффициент (для изображений, масштабированных не пропорционально)
			kEffectToBaseRes = Math.min(kEffectToBaseRes0, kEffectToBaseRes1);
		} 
	catch (e) {}
	// 1.2) коэффициенты горизонтального и вертикального масштабирования
	var KabsHorSc = myTransfImage.horizontalScale / 100;
	var KabsVerSc = myTransfImage.verticalScale / 100;
	
	// 2. Углы вращения и горизонтального сдвига изображения (обратные значения)
	var imgRotAngle = - myTransfImage.rotationAngle;
	var imgShrAngle = - myTransfImage.shearAngle;
	
	// Заполняем массив
	myImParms.push(File(myTransfImage.itemLink.filePath));
	myImParms.push(kEffectToBaseRes);
	myImParms.push(KabsVerSc);
	myImParms.push(KabsHorSc);
	myImParms.push(imgRotAngle);
	myImParms.push(imgShrAngle);
	myImParms.push(FrImg_cropBounds (myTransfImage));
	myImParms.push(outputPath);
	myImParms.push(myTransfImage.itemLink.id);
return myImParms;
}

/* Функция возвращает массив разниц геометрических координат фрейма и его изображения. */
function FrImg_cropBounds (myCrImage) 
{
	var Frm_GB = myCrImage.parent.geometricBounds;
	var Img_GB = myCrImage.geometricBounds;
	var offs_GB = new Array();
	for (var gk = 0; gk < Frm_GB.length; gk++) offs_GB.push( Frm_GB[gk] - Img_GB[gk] );
	// ширина фрейма
	offs_GB.push( Frm_GB[3] - Frm_GB[1] );
	// высота фрейма
	offs_GB.push( Frm_GB[2] - Frm_GB[0] );
return offs_GB;
}

/* Функция формирует имя текущей страницы и диапазон страниц текущего разворота. */
function myCurrPageNSpreadR()
{
	var myCurrPageSecR = new Array(0);
	with (app.activeWindow)
		{		// текущая страница в окне документа
				myCurrPageSecR.push(activePage.name);
				// текущий разворот
				var myCurrSecRange = activeSpread.pages[0].name;
				if (activeSpread.pages.length > 1) myCurrSecRange += "-" + activeSpread.pages[1].name;
				// дополняем массив диапазоном страниц активного разворота
				myCurrPageSecR.push(myCurrSecRange);
			}
return myCurrPageSecR;
}

/* Функция возвращает массив изображений из массива выделенных объектов 
(включая группы). */
function Images_inSelection (myInDnSelection)
{	
	var myArrImages = new Array ();
	var objInSelection;
	var objConstrName;
	// для всех объектов массива
	for (var mySObjCn = 0; mySObjCn < myInDnSelection.length; mySObjCn++)
		{	// объект 
			objInSelection = myInDnSelection[mySObjCn];
			// конструктор объекта
			objConstrName = objInSelection.constructor.name;
			if (objConstrName == "Image" | objConstrName == "EPS" | objConstrName == "PDF"  | objConstrName == "PICT" | objConstrName == "WMF") 
				{
					myArrImages.push(objInSelection);
				}
			else 
				{
					for (var myCnt = 0; myCnt < objInSelection.allGraphics.length; myCnt++)
					{myArrImages.push(objInSelection.allGraphics[myCnt]);}					
				}
		}
return myArrImages;
}

// 29 апреля 2008 года