/*
Images PrePress Check
Version 2.16
∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙
An InDesign CS2-CS3 JavaScript
OS: Mac OS X, Windows XP.
∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙
Скрипт предназначен для анализа и копирования 
отобранных по определенным свойствам изображений  
InDesign-документа в отдельную папку.

Анализируются: 
тип, цветовое пространство, эффективное разрешение изображений (Ppi),
наличие встроенного профиля, состояние связи с файлом, установки прозрачности - Blending Settings,
атрибут "Nonprinting" и тип пути - Clipping Path Type.

Настройки скрипта:
• допустимый диапазон значений эффективного разрешения, минимальное и максимальное;
• проверять изображения с цветовым пространcтвом Grayscale;
• определение  Blending Settings, проверка параметров прозрачности  
(отображается при Opacity < 100% или Blending Mode не соответствует "Normal");
• определение  типа Clipping Path 
(отображается, если тип не соответствует "None");
• проверка наличия Pantones (сolor mode: Lab) в векторных изображениях документа;
• отображать углы вращения и сдвига изображений 
(при значениях отличных от 0°);
• Unlock Position для групп и объектов с графическими изображениями;
• формирование отчета с параметрами изображений документа
и сохранение его в PDF файл.

Реализовано:
● запись выбранных настроек в файл инициализации;
● проверка атрибута "Nonprinting" изображений;
● копирование изображений: цветовых моделей RGB, Lab, Grayscale,
с эффективным разрешением за пределами заданного диапазона, 
со встроенным профилем и векторных файлов
в отдельную папку (команда: Copy Link(s) To ...);
● возможность открытия изображений программой "Adobe Photoshop".

Не обрабатываются следующие свойства:  
	1) эффективное разрешение для Photoshop EPS - color space Lab, Duotone;
	2) наличие встроенного профиля для
	● растровых EPS (Photoshop EPS),
	● изображений, у которых в Image Color Settings принудительно установлено "Use Document Default";
	3) наличие встроенного профиля и цветовое пространство для:
	● векторных EPS,  AI (Illustrator по 8 версию включительно),
	● PDF, AI (Illustrator от 9 версии и выше);
	4) модифицированные и отсутствующие связи с файлами изображений.
	
Установленные программы Adobe Photoshop, Acrobat и InDesign должны быть одной версии Creative Suite (CS).
∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙
You have no right to distribute the modified script from author's name.
You have no right to have profit from sale of a script.
You use this script at your own fear and risk.

© 2008 Дмитрий Лапаев (d.lapaev@univest-prepress.com, d.lapaev@gmail.com).
*/
with (app)
{
	try {var myActDocument = activeDocument;} 
	catch (e) {alert("No Documents are Open! \nPlease Open a Document and try again."); exit();}
	try {var myActDocFilePath = activeDocument.filePath}
	catch (e) {alert("Please Save " + myActDocument.name + " and try again."); exit();}
	if (myActDocument.allGraphics.length == 0) {alert("No Graphics in Document!"); exit();}
	// файл инициализации скрипта
	var mn = "\u00A9\ \u0044\u006D\u0069\u0074\u0072\u0069\u0079\ \u004C\u0061\u0070\u0061\u0065\u0076";
	const IniFName = "limppchk_inix.txt";
	var MyStrIniF = "";
	var L_imppchk = new File (activeScript.path + "/" + IniFName);
	if (!L_imppchk.exists) 
		{	
			MyStrIniF += "const myScrName = \"Images PrePress Check 2.16\";\n";
			MyStrIniF += "var iniNpEFFres = \"200\";\n";
			MyStrIniF += "var iniVpEFFres = \"500\";\n";	
			MyStrIniF += "var iniGrayscaleCheck = true;\n";
			MyStrIniF += "var iniPantLabCheck = true;\n";
			MyStrIniF += "var iniBlendSettgsCheck = true;\n";
			MyStrIniF += "var iniClippPathCheck = true;\n";
			MyStrIniF += "var iniShowAngles = true;\n";	
			MyStrIniF += "var iniImagesUnlockPos = true;\n";
			MyStrIniF += "var iniSaveReport = true;\n";
			MyStrIniF += "const mn = \"" + mn + "\";";
			L_imppchk.open("w");
			if (L_imppchk.write(MyStrIniF) == true) 
				{
					alert (IniFName + " successfully created!");
					L_imppchk.close();
					eval ("//@include \'" + IniFName + "\';");
				}
			else 
				{
					alert("Unable to write the ini-file!");	
					exit();
				}
		} else {eval ("//@include \'" + IniFName + "\';");cr();}
	// количество связей с графическими файлами
	var LinksL = myActDocument.links.length;
	// версия InDesign
	try {const InDver = version.substr(0,1);}
	catch (e) {alert(myScrName + "\nis not compatible with this version of InDesign!"); exit();}
	// тип файловой системы (ОС)
	var WonFS = File.fs;
	if (WonFS == "Macintosh") WonFS = "Mac OS X";
	// Настройки 
	var EffResDialog = dialogs.add({name:"Preferences"});	
	with (EffResDialog.dialogColumns.add()) 
		{
			with (borderPanels.add().dialogColumns.add())
				{
					// панель выбора диапазона эффективного разрешения	
					dialogRows.add().staticTexts.add({staticLabel:"Effective Resolution, Ppi:"});	
					with (borderPanels.add().dialogColumns.add().dialogRows.add())
						{
							with (dialogColumns.add()) 
								{
									dialogRows.add().staticTexts.add({staticLabel:"minimum"});	
									var NPeffRes = integerEditboxes.add({editContents:iniNpEFFres, minWidth:93});
								}
							with (dialogColumns.add()) 
								{
									dialogRows.add().staticTexts.add({staticLabel:"maximum"});	
									var VPeffRes = integerEditboxes.add({editContents:iniVpEFFres, minWidth:92});
								}	
						}
				}
			// панель дополнительных настроек
			with (borderPanels.add().dialogColumns.add())
				{		
					var CheckGrayscaleColor = checkboxControls.add({staticLabel:"Check Grayscale Color Space", checkedState:iniGrayscaleCheck});
					var CheckTranspSettings	= checkboxControls.add({staticLabel:"Check Blending Settings", checkedState:iniBlendSettgsCheck});
					var CheckClippingPath = checkboxControls.add({staticLabel: "Check Clipping Path Type", checkedState:iniClippPathCheck});
					var CheckPantonesBColor = checkboxControls.add({staticLabel:"Check Pantones (Lab)", checkedState:iniPantLabCheck});
					var showRotShearAngle = checkboxControls.add({staticLabel:"Show Rotation and Shear Angle", checkedState:iniShowAngles, minWidth:220});
				}
			var unlockImagesAndGroups= checkboxControls.add({staticLabel:"Unlock Position", checkedState:iniImagesUnlockPos});
			var myReportSave= checkboxControls.add({staticLabel:"Save Report to PDF", checkedState:iniSaveReport});
		}
	/* отображаем диалог */
	if (EffResDialog.show() == false)
		{
			EffResDialog.destroy();		
			exit();
		}
	// записываем настройки в файл
	MyStrIniF = "";
	MyStrIniF += "const myScrName = \"Images PrePress Check 2.16\";\n";
	MyStrIniF += "var iniNpEFFres = \"" + NPeffRes.editValue + "\";\n";
	MyStrIniF += "var iniVpEFFres = \"" + VPeffRes.editValue + "\";\n";
	MyStrIniF += "var iniGrayscaleCheck = " + CheckGrayscaleColor.checkedState + ";\n";
	MyStrIniF += "var iniPantLabCheck = " + CheckPantonesBColor.checkedState + ";\n";
	MyStrIniF += "var iniBlendSettgsCheck = " + CheckTranspSettings.checkedState + ";\n";
	MyStrIniF += "var iniClippPathCheck = " + CheckClippingPath.checkedState + ";\n";
	MyStrIniF += "var iniShowAngles = " + showRotShearAngle.checkedState + ";\n";
	MyStrIniF += "var iniImagesUnlockPos = " + unlockImagesAndGroups.checkedState + ";\n";
	MyStrIniF += "var iniSaveReport = " + myReportSave.checkedState + ";\n";
	MyStrIniF += "const mn = \"" + mn + "\";";
	L_imppchk.hidden = false;
	L_imppchk.open("w");
	if (L_imppchk.write(MyStrIniF) == true) {L_imppchk.hidden = true; L_imppchk.close();}
	else alert("Error writing to the ini-file!");	
	var myIshActPage = activeWindow.activePage;
	// Pantones в векторных изображениях
	var PantonesNames = new Array();
	if (CheckPantonesBColor.checkedState == true) PantonesNames = CheckPantonesBC (myActDocument);
	// массив графических объектов документа:
	var myDocGraphics = selNormAndEmbed_Links(myActDocument.allGraphics, unlockImagesAndGroups.checkedState) ;
	// массив, содержащий внедренные и изображения с "нормальными" связями
	var myNormalAndEmbed = myDocGraphics[0];
	// для массива внедренных и изображений с "нормальными" связями
	var myCondSepImages = ImPrePressCheck (myNormalAndEmbed, NPeffRes.editValue,  VPeffRes.editValue, CheckTranspSettings.checkedState, CheckClippingPath.checkedState, CheckGrayscaleColor.checkedState, showRotShearAngle.checkedState, EffResDialog);
	// для изображений без связи с файлом (вставлены через буфер обмена)
	if (myDocGraphics[1].length > 0)
		{
			for (embc = 0; embc < myDocGraphics[1].length; embc++) 
			{select(myDocGraphics[1][embc]); if (!confirm ("Image without link!\nContinue?")) {EffResDialog.destroy(); exit();}}
			ImPrePressCheck (myDocGraphics[1], NPeffRes.editValue,  VPeffRes.editValue, CheckTranspSettings.checkedState, CheckClippingPath.checkedState, CheckGrayscaleColor.checkedState, showRotShearAngle.checkedState, EffResDialog);
		}
	// Формируем диалог "Report"	
	var ReportCopyDialog = dialogs.add({name:myScrName + " (InDesign" + InDver + " on " + WonFS + ") " + mn});	
	with (ReportCopyDialog.dialogColumns.add()) 
		{	/* 
			myDocGraphics[2][1] - внедренные,
			myDocGraphics[2][2] - с отсутствующими связями,
			myDocGraphics[2][3] - модифицированные.
			*/
			if (LinksL > 0) dialogRows.add().staticTexts.add({staticLabel: "Total Links: " + LinksL});
			if (myDocGraphics[2][2] > 0) dialogRows.add().staticTexts.add({staticLabel:"● " + myDocGraphics[2][2]  + " Missing"});
			if (myDocGraphics[2][3] > 0) dialogRows.add().staticTexts.add({staticLabel:"● " + myDocGraphics[2][3]  + " Modified"});
			if (myDocGraphics[2][1] > 0) dialogRows.add().staticTexts.add({staticLabel:"● " + myDocGraphics[2][1]  + " Embedded"});
			if (myDocGraphics[0].length > 0) dialogRows.add().staticTexts.add({staticLabel:"● " + myDocGraphics[0].length + " Normal"});
			/* Создаем панель выбора файлов для копирования 
			myCondSepImages [0] - с цветовым пространством - RGB;
			myCondSepImages [1] - с цветовым пространством - Lab;
			myCondSepImages [2] - с эффективным разрешением меньше порогового;
			myCondSepImages [3] - с эффективным разрешением больше порогового;
			myCondSepImages [4] - со встроенным профилем; 
			myCondSepImages [5] - с цветовым пространством -  Grayscale;
			myCondSepImages [6] - связи с векторными файлами;
			*/		
			if (myDocGraphics[0].length > 0) 
				{
					dialogRows.add().staticTexts.add({staticLabel:"Select Links for Copy:"});
					var CheckStateCopyLinks = new Array();
					// массив значений выбора типов файлов  для копирования 
					for (var Crerr = 0; Crerr < myCondSepImages.length; Crerr ++)
					if (Crerr < 3) CheckStateCopyLinks.push(true); else CheckStateCopyLinks.push(false);
					// массив имен файлов
					var IndErrInfRep;
					with (borderPanels.add().dialogColumns.add().dialogRows.add())
						{
							with (dialogColumns.add())
								{	
									var myCondParText = new Array("RGB color space", "Lab color space", "Effective resolution < " + NPeffRes.editContents + " Ppi", "Effective resolution > " + VPeffRes.editContents + " Ppi", "with Embedded profile", "Graycsale color space", "with Vector data");
									for  (Crerr = 0; Crerr < myCondSepImages.length; Crerr ++)
									if (myCondSepImages [Crerr].length > 0)
									CheckStateCopyLinks[Crerr] = checkboxControls.add({staticLabel: myCondSepImages[Crerr].length + " " +myCondParText[Crerr], checkedState:CheckStateCopyLinks[Crerr]});
								}	
							with (dialogColumns.add())
								{ 
									for  (Crerr = 0; Crerr < myCondSepImages.length; Crerr ++)
									if (myCondSepImages[Crerr].length > 0) 
										{
											IndErrInfRep = new Array();
											for (var Derr = 0; Derr < myCondSepImages[Crerr].length; Derr ++)
											IndErrInfRep.push(myCondSepImages[Crerr][Derr].name);
											dropdowns.add({stringList: IndErrInfRep, selectedIndex: 0, minWidth:250});
										}	
								}
						}
				}
			// для изображений без связи
			if (myDocGraphics[1].length > 0) {dialogRows.add().staticTexts.add({staticLabel: "Images without Link: " + myDocGraphics[1].length});}
			// Pantones (Lab)
			if (CheckPantonesBColor.checkedState == true & PantonesNames.length > 0)
				{
					dialogRows.add().staticTexts.add({staticLabel:"Pantones (Lab) in placed graphics:"});
					for (var cPants = 0; cPants < PantonesNames.length; cPants ++)
					dialogRows.add().staticTexts.add({staticLabel:String(cPants+1) + ". " + PantonesNames[cPants]});
				}
		}
	// отображаем диалог-отчет:
	var RCLinkRresult = ReportCopyDialog.show();
	// проверка необходимости вызова функции копирования 
	var CopySLtoFolder = false;
	if (myDocGraphics[0].length > 0) 
		{
			// для каждого условия поиска:
			for (var CSKLcount = 0; CSKLcount < CheckStateCopyLinks.length; CSKLcount ++)	
				{
					CheckStateCopyLinks[CSKLcount] = CheckStateCopyLinks[CSKLcount].checkedState;
					if (CheckStateCopyLinks[CSKLcount] == true) CopySLtoFolder = true;
				}
		}
	if (RCLinkRresult != false & CopySLtoFolder == true) 
		{	// копирование выбранных файлов
			CopySelectedLinksToFolder (myCondSepImages, CheckStateCopyLinks, myActDocFilePath);
		}
	
	// формирование отчета
	if (myReportSave.checkedState == true) myImagesChkReport(myActDocument, WonFS);
	try {activeWindow.activePage = myIshActPage;
	activeWindow.zoom (ZoomOptions.fitPage);
	} catch(e){}
	EffResDialog.destroy();			
	ReportCopyDialog.destroy();		
	exit();
}

// ФУНКЦИИ  ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●

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

// Функция выполняет UnLock Positon изображения myGraphObj.
function myUnlock_ParentRe (myGraphObj)
{
	try {if (myGraphObj.parent.locked == true) 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 == true) return true;
				}
			else return true;
		} 	
catch (e) {return false;} 
}

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

/* Функция "отфильтровывания" изображений с модифицированными и отсутствующими связями.
Возвращает массив:
myStatusImages[0] - внедренные изображения и с "нормальными" связями,
myStatusImages[1] - изображений без связей (вставлены из буфера обмена),
myStatusImages[2] - счетчики изображений:
myStatusImages[2][0] - с "нормальными" связями,
myStatusImages[2][1] - внедренные,
myStatusImages[2][2] - с отсутствующими связями,
myStatusImages[2][3] - модифицированные.
*/
function selNormAndEmbed_Links(myImagesArray, myLockParentFk) 
{
	var myStatusImages = new Array();
	var myNormAndEmbed = new Array();
	var myCBimages= new Array();
	var myMissModCounter = new Array(0,0,0,0);
	var myStatusLink = null;	
	for (var myCounter = 0; myCounter < myImagesArray.length; myCounter++) 
		{
			// UnLock Positon изображения
			if (myLockParentFk == true) myUnlock_ParentRe (myImagesArray[myCounter]);
			// определяем состояние связи с файлом теущего изображения
			try {myStatusLink = myImagesArray[myCounter].itemLink.status;}
			catch (e) 
				{
					myCBimages.push(myImagesArray[myCounter]);
					myStatusLink = null;
				}
			if(myStatusLink != null)
				{
					if (myStatusLink == LinkStatus.normal )
						{
							myNormAndEmbed.push(myImagesArray[myCounter]);
							myMissModCounter[0]++;
						}
					else if (myStatusLink == LinkStatus.linkEmbedded) 
						{
							myNormAndEmbed.push(myImagesArray[myCounter]);
							myMissModCounter[1]++;		
						}
					else if (myStatusLink == LinkStatus.linkMissing) myMissModCounter[2]++;
					else if (myStatusLink == LinkStatus.linkOutOfDate) myMissModCounter[3]++;
				}	
		}	
	myStatusImages.push(myNormAndEmbed);
	myStatusImages.push(myCBimages);
	myStatusImages.push(myMissModCounter);
return myStatusImages;
}

/* Функция проверки Pantones (Lab) в векторных изображениях документа.
Возвращает массив имен найденных дополнительных цветов: LabPantNames.
*/
function CheckPantonesBC (myDoc)
{
	var ColorsDoc = myDoc.colors;
	var OldColorSpace;
	var LabPantNames = new Array();
	// для всех цветов документа
	for (var myCounter = 0; myCounter < ColorsDoc.length; myCounter++) 
		{
			if(ColorsDoc[myCounter].model == ColorModel.spot & ColorsDoc[myCounter].space == ColorSpace.lab)
				{
					// запоминаем цветовое пространство
					OldColorSpace = ColorsDoc[myCounter].space;
					try {ColorsDoc[myCounter].space = ColorSpace.cmyk; ColorsDoc[myCounter].space = OldColorSpace;}
					catch (e) {LabPantNames.push(ColorsDoc[myCounter].name);}
				}
		}
return LabPantNames;
}

/* Функция определения параметров изображения.
Возвращает массив параметров RVPpiProf.
*/
function RastrPPIimposProfile (myL_Image)
{
	var RVPpiProf = new Array();
	// 1) связь с файлом
	var myLinkObj = null;
	var myLinkObjCreator = "N/A";
	try {myLinkObj = myL_Image.itemLink; myLinkObjCreator = myLinkObj.linkXmp.creator;} 
	catch (e) {}	
	// 2) цветовое пространство изображения 
	var ImageRastrType = true;	
	var CurrentImageSpace = "N/A";
	try 
		{  
			CurrentImageSpace = myL_Image.space;
			// если нет ошибки,  то считаем что изображение является растровым
		}
	catch (e) 
		{ 
			if (!findWord_inStr(myLinkObjCreator, "Photoshop")) ImageRastrType = false;
			// если не определяется цветовое пространство 
			// и в названии программы, создавшей изображение, не найдено "Photoshop", то считаем изображение векторным
		}
	// 3) физическое и эффективное разрешение   
	var PPIimpos = true;	
	var EffPpi1 = "N/A";
	var EffPpi2 = "N/A";
	var actPpi1 = "N/A";
	var actPpi2 = "N/A";
	try 
		{ 
			actPpi1 = myL_Image.actualPpi[0];
			actPpi2 = myL_Image.actualPpi[1];
			EffPpi1 = myL_Image.effectivePpi[0];
			EffPpi2 = myL_Image.effectivePpi[1];
		}
	catch (e) {PPIimpos = false;}
	// 4) встроенный профиль
	var ProfileSts = "";
	try {ProfileSts = myL_Image.profile;}
	catch (e) {ProfileSts = "N/A";}
	// тип изображения
	var CurrentImageType = myL_Image.imageTypeName;
	if (CurrentImageType == "") CurrentImageType = myL_Image.constructor.name;
	// атрибут "не печатать"
	var myImNonprint = myNonprint_ParentRe (myL_Image);
	var myImClippingType = myImageClippingPath(myL_Image);
	// масштаб
	var VertScaleObj = String(myL_Image.verticalScale).substr(0,6);
	var HorzScaleObj = String(myL_Image.horizontalScale).substr(0,6);
	// углы
	var ARotateAngleObj;
	if (Math.abs (myL_Image.rotationAngle) > 0.001) ARotateAngleObj= String (myL_Image.rotationAngle).substr (0,6);
	else ARotateAngleObj = 0;
	var AShearAngleObj;
	if (Math.abs (myL_Image.shearAngle) > 0.001) AShearAngleObj= String (myL_Image.shearAngle).substr (0,5);
	else AShearAngleObj = 0;
	// заполняем массив полученными данными 
	RVPpiProf.push(ImageRastrType);						// 	RVPpiProf [00]	- boolean, тип объекта: для растрового - "true"
	RVPpiProf.push(PPIimpos);									//	RVPpiProf [01]	- boolean, возможность получения данных об эффективном разрешении
	RVPpiProf.push(ProfileSts);								//	RVPpiProf [02]	- string, информация о цветовом профиле 
	RVPpiProf.push(CurrentImageSpace);					//	RVPpiProf [03]	- цветовое пространство 
	RVPpiProf.push(EffPpi1);									//	RVPpiProf [04]	- эффективное разрешение (горизонтальное)
	RVPpiProf.push(EffPpi2);									//	RVPpiProf [05]	- эффективное разрешение (вертикальное)
	RVPpiProf.push(CurrentImageType);					//	RVPpiProf [06]	- тип изображения
	RVPpiProf.push(HorzScaleObj);							//	RVPpiProf [07]	- значение масштабирования по горизонтали (%)
	RVPpiProf.push(VertScaleObj);							//	RVPpiProf [08]	- значение масштабирования по вертикали (%)
	RVPpiProf.push(myImNonprint);							//	RVPpiProf [09]	- boolean, при "true" - не печатать изображение
	RVPpiProf.push(myLinkObj);								//	RVPpiProf [10]	- itemLink
	RVPpiProf.push(myImClippingType);					//	RVPpiProf [11]	- тип Clipping Path изображения
	RVPpiProf.push(ARotateAngleObj);						//	RVPpiProf [12]	- значение угла поворота Rotation Angle
	RVPpiProf.push(AShearAngleObj);						//	RVPpiProf [13]	- значение Shear Angle
	RVPpiProf.push(actPpi1);									//	RVPpiProf [14]	- физическое разрешение (горизонтальное)
	RVPpiProf.push(actPpi2);									//	RVPpiProf [15]	- физическое разрешение (вертикальное)
	RVPpiProf.push(myLinkObjCreator);					// 	RVPpiProf [16]	- имя программы, в которой создавался файл изображения
return RVPpiProf;	
}

/* Функция проверки изображений.
CondImageNamePath - массив изображений,
NPppi - нижний предел эффективного разрешения,
VPppi - верхний предел эффективного разрешения.
Возвращает массив объектов itemLink, отобранные по условиям поиска:
CondImageNamePath [0] - с цветовым пространством -  RGB;
CondImageNamePath [1] - с цветовым пространством - Lab;
CondImageNamePath [2] - с эффективным разрешением меньше порогового;
CondImageNamePath [3] - с эффективным разрешением больше порогового;
CondImageNamePath [4] - со встроенным профилем;
CondImageNamePath [5] - с цветовым пространством -  Grayscale;
CondImageNamePath [6] - связи с векторными файлами;
*/
function ImPrePressCheck (arrMyImages, NPppi, VPppi, TraspCheck, ClippTypeCheck, GrayscaleColorChk, shwRSAngle, myDialogToDestroy)
{
	var CondImageNamePath = new Array();
	var CondImageNamePath = new Array();
	var RGBImageNamePath = new Array();
	var LabImageNamePath = new Array();
	var GrayscaleImages = new Array();
	var NppiImageNamePath = new Array();
	var VppiImageNamePath = new Array();
	var ProfileImageNamePath = new Array();
	var PdfAiEpsLnImages = new Array();
	// текущий объект (изображение)
	var CurObj;
	// параметры изображения
	var ObjParams;
	// информация об изображении
	var myImageInfo;
	// установки прозрачности
	var objBlendingSettings;
	var onlyTranspSet;
	var myAlertImageInf;
	for (var myCounter = 0; myCounter < arrMyImages.length; myCounter++) 
		{	
			myImageInfo = "";
			myAlertImageInf = "";
			objBlendingSettings = "";
			onlyTranspSet = false;
			// определяем изображение
			CurObj = arrMyImages[myCounter];
			// выделяем объект на странице 	
			try {CurObj.itemLink.show();}
			catch (e) {app.selection[0] = CurObj;}
			// определяем параметры изображения (функции RastrPPIimposProfile):
			ObjParams = RastrPPIimposProfile(CurObj);
			// проверяем на соответствие
			if (ObjParams[0] == true) 
				{
					if (ObjParams[3] == "RGB" | ObjParams[3] == "RGB + Spot") 
						{
							RGBImageNamePath.push (ObjParams [10]);
							myImageInfo +=  "● Color Space: " + ObjParams[3]  + "\n";
						}		
					if (ObjParams[3] == "Lab" | ObjParams[3] == "Lab + Spot")
						{
							LabImageNamePath.push (ObjParams [10]);
							myImageInfo +=  "● Color Space: " + ObjParams[3]  + "\n";
						}	
					if ((ObjParams[3] == "Grayscale" | ObjParams[3] == "Grayscale + Spot") & GrayscaleColorChk == true)
						{
							GrayscaleImages.push(ObjParams [10]);
							myImageInfo +=  "● Color Space: " + ObjParams[3]  + "\n";
						}
				}
			if (ObjParams[2] != "None" & ObjParams[2]  != "N/A" & ObjParams[2] != "Use Document Default")
				{
					ProfileImageNamePath.push (ObjParams [10]);
					myImageInfo += "● Profile: " + ObjParams[2] + "\n";
				}
			if (ObjParams[1] == true)
				{
					if (ObjParams[4]  > VPppi | ObjParams[5]  > VPppi) VppiImageNamePath.push (ObjParams [10]);
					if (ObjParams[4]  < NPppi | ObjParams[5]  < NPppi)
						{
							myImageInfo += "● Effective Resolution: "+ ObjParams[4] + "x" + ObjParams[5] +" Ppi\n";
							myImageInfo += "● Native Resolution: "+ ObjParams[14] + "x" + ObjParams[15] +" Ppi\n";
							myImageInfo += "● Scale: Hor."+ ObjParams[7] + "% - Vert."+ ObjParams[8] + "%\n";
							NppiImageNamePath.push (ObjParams [10]);
						}	
				}
			if (shwRSAngle == true)
				{
					if (ObjParams[12] != 0) myImageInfo += "● Rotation Angle: "+ ObjParams[12] + "°\n";
					if (ObjParams[13] != 0) myImageInfo += "● Shear Angle: "+ ObjParams[13] + "°\n";
				}
			// Clipping Path Type
			if (ClippTypeCheck == true & ObjParams [11] != "None") myImageInfo += "● Clipping Path Type: " + ObjParams [11] + "\n";
			// векторные Pdf, Ai, Eps...
			if (ObjParams[0] == false) PdfAiEpsLnImages.push (ObjParams [10]);
			// атрибут "Nonprinting"
			var myImageName = "Image without link";
			if (ObjParams[10] != null) myImageName = ObjParams[10].name;
			if (ObjParams[9] == true) if (confirm("Set attribute Nonprinting to Off?", "", myImageName) == true) {myNonpFalse_ParentRe (CurObj);}
			// Blending Settings
			if (TraspCheck == true) objBlendingSettings = OBJ_Effects (CurObj, InDver);
			// формируем информацию о параметрах изображения
			if (myImageInfo == "") onlyTranspSet = true;
			if (myImageInfo + objBlendingSettings != "")
				{	
					if (myNonprint_ParentRe (CurObj) == true) myImageInfo += "● Print: Off\n"; 
					else  myImageInfo += "● Print: On\n";		
					if (ObjParams[10] != null)
						{
							myAlertImageInf = "File: \"" + myImageName + "\"";
							if (ObjParams[16] != "N/A") myAlertImageInf += "\nCreator: " + ObjParams[16];
							myAlertImageInf +=  "\n\n● Type: " + ObjParams[6] + "\n" + myImageInfo + objBlendingSettings;
							if (ObjParams[0] == true & !onlyTranspSet)
								{
									 // открываем файл Adobe Photoshop 
									if (confirm (myAlertImageInf + "\nOpen this file with Adobe Photoshop?", "", myScrName) == true) 
									try {photoshop.open(File(ObjParams[10].filePath));}
									catch (e) {alert(e + "\nAdobe Photoshop is not Installed!", "", true)}
								}
							else if (confirm(myAlertImageInf + "\nContinue?", "", myScrName) == false) {myDialogToDestroy.destroy(); exit();}
						}
					else 
						{
							myAlertImageInf = myImageName + ":\n\n● Type: " + ObjParams[6] + "\n" + myImageInfo  + objBlendingSettings + "\nContinue?";
							if (confirm (myAlertImageInf, "", myScrName) == false) {myDialogToDestroy.destroy(); exit();}
						}
				}
		} 	 // завершение циклов проверки графических объектов массива
	CondImageNamePath.push(RGBImageNamePath);
	CondImageNamePath.push(LabImageNamePath);
	CondImageNamePath.push(NppiImageNamePath);
	CondImageNamePath.push(VppiImageNamePath);
	CondImageNamePath.push(ProfileImageNamePath);	
	CondImageNamePath.push(GrayscaleImages);
	CondImageNamePath.push(PdfAiEpsLnImages);	
return CondImageNamePath;
}

/* Функция копирования выбранных по условиям файлов в папку.
arrImagesChStForCopy [0] - с цветовым пространством - RGB;
arrImagesChStForCopy [1] - с цветовым пространством - Lab;
arrImagesChStForCopy [2] - с эффективным разрешением меньше порогового;
arrImagesChStForCopy [3] - с эффективным разрешением больше порогового;
arrImagesChStForCopy [4] - со встроенным профилем; 	
*/
function CopySelectedLinksToFolder (arrImagesChStForCopy, ArrSelCondIm, sDpath)
{	// запускаем диалог выбора папки
	var mySelectedFolder = Folder.selectDialog("Select the folder where linked files will be copied.", sDpath);
	if (mySelectedFolder != null)
		{
			// массив скопированных Links и путей файлов 
			var CopyErrImagePath= new Array();
			var CopyToYes;
			var ChkFilePath;
			var CopyToLink;
			// для каждого из условий:
			for (var CountCond = 0; CountCond < ArrSelCondIm.length; CountCond++) 
			if (ArrSelCondIm[CountCond] == true)
				{	// для каждого из изображений
					for (var Imc = 0; Imc < arrImagesChStForCopy[CountCond].length; Imc++) 
						{
							CopyToYes = true;
							ChkFilePath = arrImagesChStForCopy[CountCond][Imc].filePath;
							CopyToLink = arrImagesChStForCopy[CountCond][Imc];
							// проверка дубликатов связей:
							for (var indPath = 0; indPath < CopyErrImagePath.length ; indPath++)
								{
									// для нескольких связей с одним файлом
									if (CopyErrImagePath[indPath][0] == ChkFilePath) 
										{
											CopyToYes = false;	
											CopyToLink.relink(File(CopyErrImagePath[indPath][1].filePath));
											//myUpdLink = myLink.update();
										}
									// если связанный файл уже был скопирован
									if (CopyErrImagePath[indPath][1] == CopyToLink) CopyToYes = false;	
								}
							// копируем файл в выбранную папку
							if (CopyToYes == true)
								{
									CopyErrImagePath.push([ChkFilePath, CopyToLink]);		
									// если файл внедрен в документ
									if (CopyToLink.status == 1282237028) CopyToLink.unembed (mySelectedFolder); 
									else CopyToLink.copyLink (mySelectedFolder);		
								}
						}
				}
		}	
	else 
	alert(myScrName + "\nCanceled by User !");
}

/* Функция анализа  установок прозрачности.
Анализируется непрозрачность (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 = "On"; else IBl = "Off";
	if (KG == true) KG = "On"; else KG = "Off";
	// Заполняем массив значений 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;
}
function cr()
{if (mn != "\u00A9\ \u0044\u006D\u0069\u0074\u0072\u0069\u0079\ \u004C\u0061\u0070\u0061\u0065\u0076") exit();}

/* Функция определения типа Clipping Path изображения. */	
function myImageClippingPath(myGrImage)
{
	var myClippingPathTypes = new Array(["None", 1852796517], ["Detect Edges", 1685349735], ["Alpha Channel", 1634756707], ["Photoshop Path", 1886613620], ["User-modified Path", 1970106484]);
	var myObjClipPath = myGrImage.clippingPath.clippingType;
	for (var cpt = 0; cpt < myClippingPathTypes.length; cpt++)
	if (myObjClipPath == myClippingPathTypes[cpt][1]) var myCPtypeStr = myClippingPathTypes[cpt][0];
	if (myGrImage.clippingPath.appliedPathName != "") myCPtypeStr += ", " + myGrImage.clippingPath.appliedPathName;
return myCPtypeStr;
}

/* Функция возвращает истинность при обнаружении слова 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 DocImagesReport(arrDocImages)
{
	var CurrImage;
	var ImageProp;
	var myImageParmTexts = new Array();
	var myTextReport = new Array();
	var myLinksStatus = new Array (["Normal", 1852797549], ["Modified", 1819242340], ["Missing", 1819109747], ["Embedded", 1282237028]);
	// Заголовок
	var myHeaderTabl = new Array("# (" + arrDocImages.length + ")", "Name", "File Path", "Link Status", "Type", "Creator", "Profile", "Color Space", "Effective Res., Ppi", "Native Res., Ppi", "Horizontal Scale", "Vertical Scale", "Rotation Angle", "Shear Angle", "Clipping Path Type", "Print");
	myTextReport.push(myHeaderTabl);
	for (var myImC = 0; myImC < arrDocImages.length; myImC++) 
		{	
			// текущее изображение
			CurrImage = arrDocImages[myImC];
			// выделяем объект на странице 	
			app.selection = CurrImage;
			// определяем параметры изображения 
			ImageProp = RastrPPIimposProfile(CurrImage);
			/* 
			ImageProp [00]	- boolean, тип объекта: для растрового - "true"
			ImageProp [01]	- boolean, возможность получения данных об эффективном разрешении
			ImageProp [02]	- string, информация о цветовом профиле 
			ImageProp [03]	- цветовое пространство 
			ImageProp [04]	- эффективное разрешение (горизонтальное)
			ImageProp [05]	- эффективное разрешение (вертикальное)
			ImageProp [06]	- тип изображения
			ImageProp [07]	- значение масштабирования по горизонтали (%)
			ImageProp [08]	- значение масштабирования по вертикали (%)
			ImageProp [09]	- boolean, при "true" - не печатать изображение
			ImageProp [10]	- itemLink
			ImageProp [11]	- тип Clipping Path изображения
			ImageProp [12]	- значение угла поворота Rotation Angle
			ImageProp [13]	- значение Shear Angle
			ImageProp [14]	- исходное разрешение (горизонтальное)
			ImageProp [15]	- исходное разрешение (вертикальное) 
			ImageProp [16]	- имя программы, в которой создавался файл изображения */
			// Properties
			myImageParmTexts.push(myImC + 1);
			if (ImageProp [10] != null) 
				{
					myImageParmTexts.push(ImageProp [10].name);
					myImageParmTexts.push(ImageProp [10].filePath);
					// состояние связи
					for (var myLSc = 0; myLSc < myLinksStatus.length; myLSc++) 
					if (ImageProp [10].status == myLinksStatus[myLSc][1]) myImageParmTexts.push(myLinksStatus[myLSc][0]);
				}
			else 
				{
					myImageParmTexts.push("N/A");
					myImageParmTexts.push("Null Link");
					myImageParmTexts.push("[Emb.]");
				}
			myImageParmTexts.push(Str_inskbk(ImageProp [06]));
			// creator
			myImageParmTexts.push(ImageProp [16]);
			myImageParmTexts.push(ImageProp [02]);
			myImageParmTexts.push(ImageProp [03]);
			if (ImageProp [01] == true)
				{
					myImageParmTexts.push(ImageProp [04] + "x" + ImageProp [05]);
					myImageParmTexts.push(ImageProp [14] + "x" + ImageProp [15]);
				}
			else
				{
					myImageParmTexts.push(ImageProp [04]);
					myImageParmTexts.push(ImageProp [14]);
				}
			myImageParmTexts.push(ImageProp [07] + "%");
			myImageParmTexts.push(ImageProp[08] + "%");
			myImageParmTexts.push(ImageProp[12] + "°");
			myImageParmTexts.push(ImageProp[13] + "°");
			myImageParmTexts.push(ImageProp[11]);
			if (ImageProp [9] == true) myImageParmTexts.push("Off"); else myImageParmTexts.push("On");
		}
		myTextReport.push(myImageParmTexts);
return myTextReport;
}

/* Функция создает новый документ формата А4, портрет, 
формирует страницы с таблицей параметров изображений документа myChkDoc,
экспортирует отчет в PDF-файл.
*/
function myImagesChkReport(myChkDoc, tpFsOs)
{
	// параметры изображений
	var myImagesPTContents =  DocImagesReport(myChkDoc.allGraphics);
	// Document Preset
	var myDocumentPreset = app.documentPresets.add();
	with (myDocumentPreset)
		{
			name = "Report";
			bottom = "10 mm";
			left  = "10 mm";
			right = "10 mm";
			top = "10 mm";
			columnCount = 1;
			columnGutter = "4 mm";
			documentBleedBottomOffset = "0 mm";
			documentBleedInsideOrLeftOffset = "0 mm";
			documentBleedOutsideOrRightOffset = "0 mm";
			documentBleedTopOffset = "0 mm";
			slugBottomOffset=  "0 mm";
			slugInsideOrLeftOffset =  "0 mm";
			slugRightOrOutsideOffset  = "0 mm";
			slugTopOffset  = "0 mm";
			facingPages = false;
			pageHeight = "210 mm";
			pageWidth = "297 mm";
			pagesPerDocument = 1;
			pageOrientation = PageOrientation.landscape;
		}
	// создаем новый документ
	var myNewDocument = app.documents.add(false, myDocumentPreset);
	// удаляем Document Preset
	myDocumentPreset.remove();
	// еденицы измерения - mm
	with (myNewDocument.viewPreferences)
		{
			horizontalMeasurementUnits = MeasurementUnits.millimeters;
			verticalMeasurementUnits = MeasurementUnits.millimeters;
		}
	// новыe цвета документа
	var myAltColor = docNewCmykProcColor (myNewDocument, "Red",  [0,100,100,10]);
	var myNAColor = docNewCmykProcColor (myNewDocument, "Green", [80,10,100,20]);
	// мастер документа
	var myMasterSpread = myNewDocument.masterSpreads[0];
	// линии
	newGraphicLine(myMasterSpread, [12,10,12,287], "2 pt");
	newGraphicLine(myMasterSpread, [202,30,202,277], "3 pt");
	// стиль текста "Master texts1"
	var myRepCharSt1 = TextCharStyle(myNewDocument, "Master texts1", "Arial",  "Regular", 10, myNAColor, 100);
	// стиль текста "Master texts2"
	var myRepCharSt2 = TextCharStyle(myNewDocument, "Master texts2", "Times New Roman",  "Bold Italic", 11, myAltColor, 100);
	// стиль текста "Document Name"
	var myRepCharSt3 = TextCharStyle(myNewDocument, "Document Name", "Times New Roman",  "Regular", 9, "Black", 100);
	// стиль текста "Copyright & Date"
	var myRepCharSt4 = TextCharStyle(myNewDocument, "Copyright & Date", "Times New Roman",  "Italic", 8, "Black", 100);
	// стиль текста "For Table Header"
	var myRepCharSt5 = TextCharStyle(myNewDocument, "For Table Header", "Times New Roman",  "Bold Italic", 8, "Paper", 100);
	// стиль текста "For Table Cells"
	var myRepCharSt6 = TextCharStyle(myNewDocument, "For Table Cells", "Arial",  "Regular", 8, "Black", 100);
	// название и версия скрипта
	with (NewTextFrame(myMasterSpread, [8,10,13,60]).texts[0])
		{ 
			appliedCharacterStyle = myRepCharSt1;
			contents = myScrName;
			justification = Justification.leftAlign;
		}
	// название документа
	with (NewTextFrame(myMasterSpread, [8.5,60,21,287]).texts[0])
		{ 
			appliedCharacterStyle = myRepCharSt3;
			contents = myChkDoc.name + " ( " + File(myChkDoc.filePath).fsName + " ) • Adobe InDesign " + InDver + " on " + tpFsOs;
			justification = Justification.rightAlign;
		}
	// сopyright
	with (NewTextFrame(myMasterSpread, [200,10,204,40]).texts[0])
		{ 
			appliedCharacterStyle = myRepCharSt4;
			contents = mn;
			justification = Justification.leftAlign;
		}
	// дата
	with (NewTextFrame(myMasterSpread, [200,50,204,247]).texts[0])
		{ 
			appliedCharacterStyle = myRepCharSt4;
			contents = "Date: " + Date(2007,0,10,20,10).substr(4,27);
			justification = Justification.centerAlign;
		}
	// номер страницы
	with ( NewTextFrame(myMasterSpread, [200,270,205,282]).texts[0])
		{
			appliedCharacterStyle = myRepCharSt4;
			justification = Justification.rightAlign;
			contents = "Page";
		}
	with (NewTextFrame(myMasterSpread, [199.5,270,207,287]).texts[0])
		{
			appliedCharacterStyle = myRepCharSt2;
			justification = Justification.rightAlign;
			contents = SpecialCharacters.autoPageNumber;
		}
	// создаем таблицу на мастере
	var myHd_Frame = NewTextFrame(myMasterSpread, [17, 10, 30, 287]);
	var myHEvPageTble = myTableHeader (myHd_Frame, myImagesPTContents[0], myRepCharSt5);
	with (myHEvPageTble)
		{	// ширина столбцов
			columns[00].width = 10;
			columns[01].width = 20;
			columns[02].width = 44;
			columns[05].width = 17;
			columns[06].width = 17;
			columns[08].width = 17;
			columns[09].width = 17;
			columns[14].width = 20;
			columns[15].width = 10;
		}
	// формируем таблицу с параметрами изображений документа
	onePageTable(myNewDocument, myImagesPTContents, myRepCharSt6);
	// экспортируем в PDF 
	var myCheckReportFile = new File (myChkDoc.filePath + "/" +  FileNameWtExt(myChkDoc.name, false).substr(0,8) + "_ImChkRep.pdf" );
	newPDFExportPreference(app.pdfExportPreferences);
	try {myNewDocument.exportFile(ExportFormat.pdfType, myCheckReportFile, false);}
	catch (e) {alert(e);}
	// закрываем без сохранения
	myNewDocument.close(1852776480);
}

/* Функция создает текстовые блоки с таблицей на страницах документа myWorkDoc.
Таблица заполняется данными из массива myTableContents.
*/
function onePageTable(myWorkDoc, myTableContents, myTableCellCharStyle)
{	
	// текстовый фрейм таблицы на первой странице
	var myTableFrame = NewTextFrame(myWorkDoc.pages[0], [25, 10, 200, 287]);
	// создаем таблицу
	var MyTabl = myTableFrame.tables.add();
	// количество столбцов таблицы
	MyTabl.columnCount = myTableContents[0].length;	
	// количество строк
	MyTabl.bodyRowCount = myTableContents[1].length / MyTabl.columnCount;
	// переменная содержания текста ячейки таблицы
	var myCellCont;
	// заполняем ячейки таблицы
	for (myTCC = 0; myTCC <  MyTabl.columnCount * MyTabl.bodyRowCount; myTCC++) 
		{	
			myCellCont = String(myTableContents[1][myTCC]);
			with (MyTabl.cells[myTCC])
				{	
					bottomEdgeStrokeTint = 70; 
					bottomEdgeStrokeWeight = "1 pt"; 
					with(texts[0])
						{
							appliedCharacterStyle = myTableCellCharStyle;
							justification = 1667591796;  // по центру	
							// цвет текста ячейки
							if (myCellCont == "RGB"| myCellCont == "Lab"|myCellCont == "RGB + Spot"|myCellCont == "Lab + Spot"|myCellCont == "Modified"|myCellCont == "Missing"|myCellCont == "Embedded"| myCellCont == "WMF"|myCellCont == "Null Link"|myCellCont == "Off") 
							{fillColor = "Red 0-100-100-10"; fillTint = 100;}
							if (myCellCont == "N/A" | myCellCont == "[Emb.]" | myCellCont == "Grayscale" | myCellCont == "Grayscale + Spot" | myCellCont == "CMYK + Spot" | myCellCont == "Use Document Default") 
							{fillColor = "Green 80-10-100-20"; fillTint = 100;}
							contents = myCellCont;
						}		
				}
		}	
	// задаем стиль столбцов таблицы
	for (var myTCC = 0; myTCC <  MyTabl.columnCount ; myTCC++) 
	tableCellStr_Weight_Color(MyTabl.columns[myTCC], "1 pt", "Black", 70, 10);
	// задаем ширину столбцов
	with (MyTabl)
		{
			columns[00].width = 10;
			columns[01].width = 20;
			columns[02].width = 44;
			columns[05].width = 17;
			columns[06].width = 17;
			columns[08].width = 17;
			columns[09].width = 17;
			columns[14].width = 20;
			columns[15].width = 10;
		}
	newPageAndTextFrContinue (myWorkDoc, myTableFrame);
}

/* Функция формирует "однострочную" таблицу в текстовом блоке myTextFrameWithTable
на основании данных массива myHeaderInfoArray. 
*/
function myTableHeader (myTextFrameWithTable, myHeaderInfoArray, myTableCharStyle)
{	
	var myMPTable = myTextFrameWithTable.tables.add();
	// количество столбцов таблицы
	myMPTable.columnCount = myHeaderInfoArray.length;
	// количество строк таблицы
	myMPTable.bodyRowCount = 1;	
	// стиль таблицы
	tableCellStr_Weight_Color(myMPTable.rows[0], "1 pt", "Black", 70, 70);
	for (var myHinfC = 0; myHinfC < myHeaderInfoArray.length; myHinfC++) 
		{	
			if (myHinfC < myHeaderInfoArray.length - 1) 
				{
					myMPTable.cells[myHinfC].rightEdgeStrokeTint = 10;
					myMPTable.cells[myHinfC].rightEdgeStrokeWeight = "1 pt";
				}
			with(myMPTable.cells[myHinfC].texts[0])
				{
					appliedCharacterStyle = myTableCharStyle;
					justification = 1667591796;  // по центру	
					contents = myHeaderInfoArray[myHinfC];
				}
		}
return myMPTable;
}	

/* Функция добавляет страницы документа  myCurrentDoc при условии переполнения исходного текстового фрейма myBigTextFrame.
На добавленных страницах создаются текстовые фреймы, которые заполняются избыточным содержанием исходного.
Геометрические координаты созданных текстовых блоков соответствуют координатам исходного фрейма.
*/
function newPageAndTextFrContinue (myCurrentDoc, myBigTextFrame)
{
	if (myBigTextFrame.overflows == true)
		{
			// добавляем страницу в документе
			var myNewDocPage = myCurrentDoc.pages.add();
			var myNTFrame = NewTextFrame(myNewDocPage, myBigTextFrame.geometricBounds);
			myBigTextFrame.nextTextFrame = myNTFrame;
			// рекурсивный вызов
			newPageAndTextFrContinue (myCurrentDoc, myNTFrame);
		}
}

/* Функция задает параметры ячеек (колонок, столбцов) таблицы */
function tableCellStr_Weight_Color(myCellT, myCellWeight, myCellColor, myStrCellTint, myCellFillTint)
{
	with (myCellT)
		{
			topEdgeStrokeWeight = myCellWeight;
			leftEdgeStrokeWeight = myCellWeight;
			rightEdgeStrokeWeight = myCellWeight;
			bottomEdgeStrokeWeight = myCellWeight;
			
			topEdgeStrokeColor = myCellColor;
			leftEdgeStrokeColor= myCellColor;
			rightEdgeStrokeColor = myCellColor;
			bottomEdgeStrokeColor = myCellColor;
			
			topEdgeStrokeTint = myStrCellTint;
			leftEdgeStrokeTint = myStrCellTint;
			rightEdgeStrokeTint = myStrCellTint;
			bottomEdgeStrokeTint = myStrCellTint;
			
			verticalJustification = VerticalJustification.centerAlign;
			width = 15;
			fillColor = myCellColor;
			fillTint = myCellFillTint;
		}
}
/* Функция создает новый цвет с именем myColorName в документе myCurrDoc 
(CMYK, Proocess, arrColorValue - массив значений триадных красок, %).
*/
function docNewCmykProcColor (myCurrDoc, myColorName, arrColorValue)
{
	var myNewCMYKColor = myCurrDoc.colors.add();
	with (myNewCMYKColor)
		{
			name = myColorName + " " + myStrSymbolsReplace(arrColorValue, ",", "-");
			model = ColorModel.process;
			space = ColorSpace.cmyk;
			colorValue = arrColorValue;
		}
return myNewCMYKColor;
}

/* Функция заменяет символ 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;
}

/* Функция выбирает в строке 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;
}

/* Функция создает текстовый блок (Frame) объекта myInDesObj.
(myTextFrameGBounds - Geometric Bounds текстового блока) 
*/
function NewTextFrame(myInDesObj, myTextFrameGBounds)
{
	var myTextFrame = myInDesObj.textFrames.add();
	with (myTextFrame)
		{
			geometricBounds = myTextFrameGBounds;
			contentType = ContentType.textType;
			fillColor = "None";
			strokeColor = "None";
			with (myTextFrame.texts[0])
				{
					strokeColor = "Paper";
					strokeWeight = "1 pt";
				}
		}
return myTextFrame;
}

/* Функция создает графическую линию объекта myInDesObj.
(myLineGBounds - Geometric Bounds линии) 
*/
function newGraphicLine(myInDesObj, myLineGBounds, myLineStrWght)
{
	var myNewGrLine = myInDesObj.graphicLines.add();
	with (myNewGrLine)
		{
			geometricBounds = myLineGBounds;
			strokeAlignment = StrokeAlignment.outsideAlignment;
			try {strokeType = "White Diamond";}
			catch (e) {}
			fillColor = "None";
			strokeColor = "Black";
			strokeTint = 40;
			strokeWeight = myLineStrWght;
			gapColor = "Black";
			gapTint = 80;
		}
return myNewGrLine;
}

/* Функция создает стиль текста (Character Style). */
function TextCharStyle(myDocWithText, myCharStyleName, myTxtFontName, myTxtFontStyle, myTxtPointSize, myTxtFillColor, myTxtFillTint)
{
	var myNewCharStyle = myDocWithText.characterStyles.add();
	with (myNewCharStyle)
		{
			name = myCharStyleName;
			appliedFont = myTxtFontName;  
			fontStyle = myTxtFontStyle;
			pointSize = myTxtPointSize;
			fillColor = myTxtFillColor;
			fillTint = myTxtFillTint;
			verticalJustification = VerticalJustification.centerAlign;
		}
return myNewCharStyle;
}

/* Функция редактирует PDFExportPreference . */
function newPDFExportPreference(PDFExpPref)
{
	with (PDFExpPref)
		{
			acrobatCompatibility = AcrobatCompatibility.acrobat6;
			try {appliedFlattenerPreset = "[High Resolution]";}
			catch (e){}
			bleedBottom = "0 mm";
			bleedInside = "0 mm";
			bleedOutside = "0 mm";
			bleedTop = "0 mm";
			try {colorBitmapQuality = CompressionQuality.maximum;}
			catch (e){}
			colorBitmapCompression = BitmapCompression.zip
			colorBitmapSampling = Sampling.none;
			try {colorBitmapSamplingDPI = 300;}
			catch (e){}
			colorTileSize = 1024;
			compressionType = PDFCompressionType.compressNone;
			compressTextAndLineArt = true;
			contentToEmbed = PDFContentToEmbed.embedAll;
			cropImagesToFrames = true;
			exportGuidesAndGrids = false;
			exportLayers = false;
			exportNonprintingObjects = false;
			exportReaderSpreads = false;
			//exportWhichLayers 
			generateThumbnails = true;
			try {grayscaleBitmapQuality = CompressionQuality.maximum;}
			catch (e){}
			grayscaleBitmapCompression = BitmapCompression.zip
			grayscaleBitmapSampling = Sampling.none;
			try {grayscaleBitmapSamplingDPI = 300;}
			catch (e){}
			grayTileSize = 1024;
			try {ignoreSpreadOverrides = false;}
			catch (e){}
			includeBookmarks = true;
			includeHyperlinks = true;
			try {includeICCProfiles = ICCProfiles.includeNone;}
			catch (e){}
			includeSlugWithPDF = false;
			includeStructure = false;
			interactiveElements = false;
			monochromeBitmapCompression = MonoBitmapCompression.none;
			monochromeBitmapSampling = Sampling.none;
			try {monochromeBitmapSamplingDPI = 1200;}
			catch (e){}
			omitBitmaps = false;
			omitEPS  = false;
			omitPDF  = false;
			optimizePDF  = true;
			pageInformationMarks = false;
			pageMarksOffset = "5.5 mm";
			pdfColorSpace = 1970161251; // PDFColorSpace.unchangedColorSpace;
			pdfMarkType = 1147563124; // MarkTypes.defaultValue
			printerMarkWeight = PDFMarkWeight.p25pt;
			cropMarks = false;
			bleedMarks = false;
			colorBars = false;
			registrationMarks = false;
			try {simulateOverprint = false;}
			catch (e){}
			subsetFontsBelow = 100;
			thresholdToCompressColor = 500;
			thresholdToCompressGray = 500;
			thresholdToCompressMonochrome = 1400;
			useDocumentBleedWithPDF = true;
			standardsCompliance = 1852796517; // PDFXStandards.none
			try {pdfDestinationProfile = 1851868240;}  // PDFProfileSelector.useNoProfile;
			catch (e){}
			try {pdfXProfile = 1851868240;} // PDFProfileSelector.useNoProfile
			catch (e){}
			/* PDF/X
			ocRegistry 
			outputCondition
			outputConditionName
			effectiveOCRegistry
			effectiveOutputCondition
			effectivePDFDestinationProfile
			effectivePDFXProfile */
			pageRange = PageRange.allPages;
			useSecurity = false;
			viewJDF = false; 
			viewPDF = true;
		}
}

// 27 января 2008 года