/*
Название: StandartLinkNames.js
Язык реализации: JavaScript
Операционная система: Windows XP SP2
Условия распространения: Freeware; On your own risk
Описание: Скрипт для использования в программе Adobe InDesign CS, CS2
Назначение: Поиск и перелинковывание в док-те файлов с нестанд. именем
на его же копию со стандартным именем.
Техническая поддержка: Sergei-Anosov@yandex.ru
*/
if(app.documents.length == 0) {exit()};
AD = app.activeDocument
fs = "Windows"
//
// ***** ОСНОВНОЙ МОДУЛЬ
//
if( !LINKS_OK()) {
	alert("                 ВНИМАНИЕ! \n"+
	         "Состояние некоторых связей \n"+
                           "в документе "+app.activeDocument.name+ "\n"+
                           "может не позволить провести операцию\n"+
                           "замены нестандартного имени файла!");
}
do {
F_NAME = new Array() // массив имен ВСЕХ файлов
F_NAME_CYR = new Array() // массив имен файлов с кириллицей
SHOW_NAME = new Array() // массив имен файлов для отображения в диалоге
F_PATH = new Array() // массив путей файлов
F_PATH_CYR = new Array() // массив путей файлов с кириллицей
F_IND = new Array() // массив индексов файлов
DOC_LINKS = app.activeDocument.links
N_LINK = DOC_LINKS.length // общее кол-во линков в док-те
var N_FILES = 0 // общее кол-во файлов 
var N_FILES_CYR = 0 // общее кол-во файлов с кириллицей
var F_NAME_i =""
var F_PATH_i =""
var NEW_FILE_PATH = ""
var NEW_FILE_NAME = ""
var FULL_NAME_TO_RELINK = ""
var FS_N = 0
var N_REL = 0
var N_EMBEDDED = 0
var NEXT_RELINK = false
	FILE_INFO();
	SORT_NAMES();
	SORT_SHOW_NAMES();
	if (DIALOG_SHOW()) {
		READ_NEW_FILE()
		if(NEXT_RELINK) continue;
		RELINK_FILE()
	}
	
	
} while (true);
exit();
//
// ***** ПОДПРОГРАММА ВВОДА НОВОГО ИМЕНИ ФАЙЛА
//
function READ_NEW_FILE() {
var E = GET_FILE_EXT(F_NAME_CYR[FS_N])// расширение нов. файла
var N = GET_ONLY_NAME(F_NAME_CYR[FS_N])// только имя (без расш.) нов. файла
var L = LAT(N) // исправленое имя (без расш.) нов. файла
var P = F_PATH_CYR[FS_N] // путь с именем
var P = FIX_PATH(P)// испр. путь с именем (добавл. \)
var P = GET_ONLY_PATH(P)// только испр. путь без имени
NEW_FILE_NAME = L + "."+ E
FULL_NAME_TO_RELINK = P + NEW_FILE_NAME // полное нов. имя + путь нов. файла
NF = File(FULL_NAME_TO_RELINK) // файл с новым именем
var i=1
do {	
	if(NF.exists){
		var L = LAT(N)
		L = L+i+"";
		NEW_FILE_NAME = L + "."+ E
		FULL_NAME_TO_RELINK = P + NEW_FILE_NAME // полное нов. имя + путь нов. файла
		NF = File(FULL_NAME_TO_RELINK)
		i++;
		continue;
	}
	else {break}
} while(true);
		
var myDialog2 = app.dialogs.add({name:"Ввод исправленного имени файла"});
with(myDialog2) {
	with(dialogColumns.add()){
		dialogRows.add().staticTexts.add({staticLabel:"Старое имя файла:"});
		dialogRows.add().staticTexts.add({staticLabel:"Новое имя файла :"});
        }
	with(dialogColumns.add()){
		dialogRows.add().staticTexts.add({staticLabel:F_NAME_CYR[FS_N]});
                var NEW_FILE = dialogRows.add().textEditboxes.add({editContents:NEW_FILE_NAME, minWidth:200});
	}

}
if(myDialog2.show()) {
	NEW_FILE_NAME = NEW_FILE.editContents;
	FULL_NAME_TO_RELINK = P + NEW_FILE_NAME;
	NF = File(FULL_NAME_TO_RELINK)
	if(NF.exists){
		var w = confirm("Файл с именем "+NEW_FILE_NAME+" уже существует\n"+
				"Перезаписать копию с этим именем\nи продолжить операцию замены?");
		if(w == false) {
		NEXT_RELINK = true
		return
		};
	}
	myDialog2.destroy();
	return;
};
NEXT_RELINK = true
//exit();
return;
}

//
// ***** ПОДПРОГРАММА СБОРА ИНФ. О ЛИНКАХ
//
function FILE_INFO() {
// начальная обработка инф. о линках
// формирование массивов  F_NAME и F_PATH инф. о файлах
// и общее кол-во залинкованных файлов N_FILES
//
	N_EMBEDDED = 0;
	for (var i = 0; i < N_LINK; i++) {// цикл по всем линкам в док-те
		if(DOC_LINKS.item(i).status == LinkStatus.linkEmbedded) { 
			N_EMBEDDED++;
			continue 
		}
		if(i == 0) {// самый первый (0) файл
			F_NAME[0] = unescape(DOC_LINKS.item(0).name);
			if(version_CS()) F_PATH[0] = unescape(DOC_LINKS.item(0).filePath.fsName)
			else F_PATH[0] = unescape(DOC_LINKS.item(0).filePath)
			N_FILES = 1
			continue;
		}
		FILE_IN_ARRAY = false;
		F_NAME_i = unescape(DOC_LINKS.item(i).name);
		if(version_CS()) F_PATH_i = unescape(DOC_LINKS.item(i).filePath.fsName)
		else F_PATH_i = unescape(DOC_LINKS.item(i).filePath)
		for (var j=0; j<N_FILES; j++){// цикл по массиву файлов
			if ((F_NAME_i == F_NAME[j]) && (F_PATH_i == F_PATH[j])){
 				FILE_IN_ARRAY = true;// такой файл уже есть в массиве
				break;
			}
		}
		if(FILE_IN_ARRAY == true) { continue }
		F_NAME.push(F_NAME_i)
		F_PATH.push(F_PATH_i)
		N_FILES++;
	}
	if (N_FILES == 0) {
		alert("Документ не содержит СВЯЗАННЫХ файлов!");
		exit();
	}
//
//	формирование массива для файлов с кириллицей
//
	for( var i=0; i < N_FILES; i++) {
		var F_NAME_i = F_NAME[i];
		var F_PATH_i = F_PATH[i];
		if( CONTENT_CYR(F_NAME_i)) {
			F_NAME_CYR.push(F_NAME_i);
			F_PATH_CYR.push(F_PATH_i);
			continue;
		}
	}
	N_FILES_CYR = F_NAME_CYR.length;
	var S_EMBEDDED = "";
	if(N_FILES_CYR == 0) {
		if( N_EMBEDDED > 0 ) S_EMBEDDED = "Некоторые файлы внедрены "+"\n"+
						   "и их имена не проверены!"+"\n";
		alert("Документ "+app.activeDocument.name+"\n"+
                                             "не содержит СВЯЗАННЫХ файлов" +"\n"+
                                             "с нестандартными именами!"+"\n"+
		          S_EMBEDDED);
		exit();
	}
return // FILE_INFO
}
//
// ***** ПОДПРОГРАММА СОРТИРОВКИ МАССИВА ИМЕН ФАЙЛОВ
//
function SORT_NAMES() {
	for (var i=0; i < N_FILES_CYR; i++) {
		for(var j=0; j < N_FILES_CYR-1; j++) {
			var F_NAME_CYR_j = F_NAME_CYR[j];
			var F_PATH_CYR_j = F_PATH_CYR[j];
			if (FIRST_STR(F_NAME_CYR[j],F_NAME_CYR[j+1]) == 0) { // если имена одинаковые
				//
				// проверка по именам путей
				//
				if (FIRST_STR(F_PATH_CYR[j],F_PATH_CYR[j+1]) == 1) {
					continue;
				}
				if (FIRST_STR(F_PATH_CYR[j],F_PATH_CYR[j+1]) == 2) {
					F_NAME_CYR[j] = F_NAME_CYR[j+1];
					F_NAME_CYR[j+1] = F_NAME_CYR_j;
					F_PATH_CYR[j] = F_PATH_CYR[j+1];
					F_PATH_CYR[j+1] = F_PATH_CYR_j;
					continue;
				}
			}
			if (FIRST_STR(F_NAME_CYR[j],F_NAME_CYR[j+1]) == 1) {
				continue;
			}
			if (FIRST_STR(F_NAME_CYR[j],F_NAME_CYR[j+1]) == 2) {
				F_NAME_CYR[j] = F_NAME_CYR[j+1];
				F_NAME_CYR[j+1] = F_NAME_CYR_j;
				F_PATH_CYR[j] = F_PATH_CYR[j+1];
				F_PATH_CYR[j+1] = F_PATH_CYR_j;
				continue;
			}
		}
	}
return
}
//
// ***** ПОДПРОГРАММА ФОРМИРОВАНИИ МАССИВА ИМЕН ФАЙЛОВ С КИРИЛЛИЦЕЙ
//	 ДЛЯ ОТОБРАЖЕНИЯ В ДИАЛОГЕ
//
function SORT_SHOW_NAMES() {
	for( var i=0; i < N_FILES_CYR; i++) {
		SHOW_NAME[i] = F_NAME_CYR[i] + "  >>  " + F_PATH_CYR[i];
	}
return;
}

//
// ****** ПОДПРОГРАММА ОПРЕДЕЛЕНИЯ ПОРЯДКА СТРОК
//
// если код символа меньше, то этот символ считается первым
// если длина строк разная, и соответствующие символы в более
// длинной строке совпадают с символами в короткой, тогда
// первой считается более короткая
//
// возвращает значение:
// 0, если строки равны
// 1, если сначала s1
// 2, если сначала s2
//
function FIRST_STR(s1,s2) {
	var sl1 = s1.length
	var sl2 = s2.length
	var N = Math.min(sl1, sl2);
	if (s1 == s2) {
		return 0;
	}
	for(var i = 0; i < N; i++) {
		var c1 = s1.charCodeAt(i);
		var c2 = s2.charCodeAt(i);
		if(c1 < c2) {
			return 1;
		}
		if(c1 > c2) {
			return 2;
		}
	}
	if (sl1 < sl2) { 
		return 1;
	}
	if (sl1 > sl2) { 
		return 2;
	}
}// FIRST_STR
//
// ***** ПОДПРОГРАММА ОТОБРАЖЕНИЯ ДИАЛОГА
//
function DIALOG_SHOW() {
var myDialog = app.dialogs.add({name:"Замена нестандартных имен файлов"});
with(myDialog) {
	 with(dialogColumns.add()){
		dialogRows.add().staticTexts.add({staticLabel:"Документ: "+app.activeDocument.name});
		dialogRows.add().staticTexts.add({staticLabel:"Количество связей в документе:..... "+N_LINK});
		dialogRows.add().staticTexts.add({staticLabel:"Использовано файлов в связях:....... "+N_FILES});
		dialogRows.add().staticTexts.add({staticLabel:"Файлов с нестандартными именами: "+N_FILES_CYR});
		dialogRows.add().staticTexts.add({staticLabel:"Выбор файлов для замены имени: "});
                		var SELECTED_FILE = dropdowns.add({stringList:SHOW_NAME, selectedIndex:0, minWidth:300});
	}

}
if(myDialog.show()) {
	FS_N = SELECTED_FILE.selectedIndex;
	myDialog.destroy();
return true
};
exit();
}
//
// ***** ПОДПРОГРАММА RELINK
//
function RELINK_FILE() {
	LINK_ID = new Array();
	NEXT_RELINK = false
	var F = F_NAME_CYR[FS_N]
	var P = F_PATH_CYR[FS_N]
	var N_RELINK_FAILED = 0;
	for (var i=0; i < N_LINK; i++) { 
		F_NAME_CYR_i = DOC_LINKS.item(i).name;
		if(version_CS()) F_PATH_CYR_i = DOC_LINKS.item(i).filePath.fsName
		else F_PATH_CYR_i = DOC_LINKS.item(i).filePath
		if( F_NAME_CYR_i == F && F_PATH_CYR_i == P) {
			LINK_ID.push(DOC_LINKS.item(i).id)
		}
	}
	if( LINK_ID.length == 0 ){
		NEXT_RELINK = true
		alert("Все связи с файлом "+F_NAME_CYR[FS_N]+"\n"+
		        "утеряны (Missing) и/или внедрены (Embedded)\n"+
		        "Cледует восстановить связи с этим файлом");
		return;
	}
//
// создание копии файла с правильным именем
//
var P = F_PATH_CYR[FS_N] // путь с именем
var P = FIX_PATH(P)// испр. путь с именем (добавл. \)
OLD_FILE = File(P)
OLD_FILE.copy(FULL_NAME_TO_RELINK)
NF = File(FULL_NAME_TO_RELINK)
for ( var i=0; i < LINK_ID.length; i++) {
	if(DOC_LINKS.itemByID(LINK_ID[i]).status == LinkStatus.linkEmbedded) { 
		N_RELINK_FAILED++;
		continue;
	}
	if(DOC_LINKS.itemByID(LINK_ID[i]).status == LinkStatus.linkMissing) { 
		N_RELINK_FAILED++;
		continue;
	}	
	DOC_LINKS.itemByID(LINK_ID[i]).relink(NF);
	DOC_LINKS.itemByID(LINK_ID[i]).update();
	N_REL++;
		
}
var S_FAILED = "";
if ( N_RELINK_FAILED > 0 ) S_FAILED = "Не удалось  заменить........................: "+N_RELINK_FAILED+"\n"
else S_FAILED = "";
alert(	"Замена файлов с нестандартными именами\n"+
	"Документ "+app.activeDocument.name+"\n"+"\n"+
	"Старое имя файла: "+F_NAME_CYR[FS_N]+"\n"+
	"Новое имя файла  : "+NEW_FILE_NAME+"\n"+
	"Всего связей с этим файлом в документе: "+LINK_ID.length+"\n"+
	"Сделано замен в связях.....................: "+N_REL+"\n"+
	S_FAILED);
NEXT_RELINK = true
return;
}
//
// ***** ПОДПРОГРАММА ИСПРАВЛЕНИЯ ПУТИ
//
function FIX_PATH(s1) {
	var len = s1.length
	s2 = ""
	for( i=0; i < len; i++){
		var c = s1.charAt(i);
		if( c  == "\\") {
			s2 = s2 + c
		}
		s2 = s2 + c
	}
return s2;
}
//
// ***** ПОДПРОГРАММА ПОЛУЧЕНИЯ ТОЛЬКО ПУТИ
//
function GET_ONLY_PATH(s1) {
	var s2 = ""
	var l = s1.length;
	i = l-1
	do {
		var c = s1.charAt(i);
		if (c == "\\") break;
		i--;
	} while (i >= 0);
	s2 = s1.substring(0,i+1);
return s2;
}
//
// ***** ПОДПРОГРАММА ПОЛУЧЕНИЯ расширения файла
//
function GET_FILE_EXT(s1) {
	var l = s1.length;
	var s2 =  s1.substring(l-3, l);
	var s2 = s2.toLowerCase();
	if( s2 == ".ai") {
		var s2 = "ai";
	}
return s2;
}


//
// ***** ПОДПРОГРАММА ПОЛУЧЕНИЯ ТОЛЬКО имени файла
//	 БЕЗ РАСШИРЕНИЯ из имени
//
function GET_ONLY_NAME(s1) {
	var s2 = ""
	var l = s1.length;
	var F_EXT = s1.substring( l-3, l);
	F_EXT = F_EXT.toLowerCase();
	if( F_EXT == ".ai") {
		var n = 4;
	}
	else {
		var n = 5;
	}
	for(var i=l-n; i >= 0; i--) {
		if( s1[i] != "\\" && s1[i] != "/" ){
			var s2 = s1[i] + s2;
			continue;
		}
		break;
	}
return s2;
}
//
// ****** ПОДПРОГРАММА ОПРЕДЕЛЕНИЯ, СОДЕРЖИТ ЛИ НАЗВАНИЕ (не весь путь!) КИРИЛЛИЦУ и др. непр. симв.
//
function CONTENT_CYR(str) {
	var str = GET_ONLY_NAME(str)
	var str = str.toLowerCase()
	var l = str.length;
	for( var i=0; i < l; i++) {
		c = str[i];
		if(
			c != "0" &&
			c != "1" &&
			c != "2" &&
			c != "3" &&
			c != "4" &&
			c != "5" &&
			c != "6" &&
			c != "7" &&
			c != "8" &&
			c != "9" &&
			c != "a" &&
			c != "b" &&
			c != "c" &&
			c != "d" &&
			c != "e" &&
			c != "f" &&
			c != "g" &&
			c != "h" &&
			c != "i" &&
			c != "j" &&
			c != "k" &&
			c != "l" &&
			c != "m" &&
			c != "n" &&
			c != "o" &&
			c != "p" &&
			c != "q" &&
			c != "r" &&
			c != "s" &&
			c != "t" &&
			c != "u" &&
			c != "v" &&
			c != "w" &&
			c != "x" &&
			c != "y" &&
			c != "z" &&
			c != "_" &&
			c != "-" ){
			return true;
		}
	}
return false;		
}
//
// ****** ПОДПРОГРАММА ЗАМЕНЫ КИРИЛЛИЦЫ ЛАТИНИЦЕЙ
//
function LAT(str) {
	var s = ""
	str = str.toLowerCase();
	var l = str.length;
	var sc =""
	var c1 = 0
	for ( i=0; i < l; i++) {
		switch( str[i]) {
			case ("а"): { cl = "a"; break;} 
			case ("б"): { cl = "b"; break;} 
			case ("в"): { cl = "v"; break;} 
			case ("г"): { cl = "g"; break;} 
			case ("д"): { cl = "d"; break;} 
			case ("е"): { cl = "e"; break;} 
			case ("ё"): { cl = "yo"; break;} 
			case ("ж"): { cl = "zh"; break;} 
			case ("з"): { cl = "s"; break;} 
			case ("и"): { cl = "i"; break;} 
			case ("й"): { cl = "y"; break;} 
			case ("к"): { cl = "k"; break;} 
			case ("л"): { cl = "l"; break;} 
			case ("м"): { cl = "m"; break;} 
			case ("н"): { cl = "n"; break;} 
			case ("о"): { cl = "o"; break;} 
 			case ("п"): { cl = "p"; break;} 
			case ("р"): { cl = "r"; break;} 
			case ("с"): { cl = "s"; break;} 
			case ("т"): { cl = "t"; break;} 
			case ("у"): { cl = "u"; break;} 
			case ("ф"): { cl = "f"; break;} 
			case ("х"): { cl = "h"; break;} 
			case ("ц"): { cl = "ts"; break;} 
			case ("ч"): { cl = "ch"; break;} 
			case ("ш"): { cl = "sh"; break;} 
			case ("щ"): { cl = "sh"; break;} 
			case ("ы"): { cl = "y"; break;} 
			case ("ь"): { cl = ""; break;} 
			case ("ъ"): { cl = ""; break;} 
			case ("э"): { cl = "e"; break;} 
			case ("ю"): { cl = "yu"; break;} 
			case ("я"): { cl = "ya"; break;} 
			case (" "): { cl = "_"; break;} 
			case ("."): { cl = "_"; break;} 
			case (","): { cl = "_"; break;}
			case ("№"): { cl = "_"; break;}
			default: { cl = str[i]; break;}
		}
		s = s + cl;
	}
	s = s.toLowerCase();
	s1 = ""
	var l = s.length;
	for( var i=0; i < l; i++) {
		c = s[i];
		if(
			c != "0" &&
			c != "1" &&
			c != "2" &&
			c != "3" &&
			c != "4" &&
			c != "5" &&
			c != "6" &&
			c != "7" &&
			c != "8" &&
			c != "9" &&
			c != "a" &&
			c != "b" &&
			c != "c" &&
			c != "d" &&
			c != "e" &&
			c != "f" &&
			c != "g" &&
			c != "h" &&
			c != "i" &&
			c != "j" &&
			c != "k" &&
			c != "l" &&
			c != "m" &&
			c != "n" &&
			c != "o" &&
			c != "p" &&
			c != "q" &&
			c != "r" &&
			c != "s" &&
			c != "t" &&
			c != "u" &&
			c != "v" &&
			c != "w" &&
			c != "x" &&
			c != "y" &&
			c != "z" &&
			c != "_" &&
			c != "-" ){			
			s1 = s1 + "_";
			continue;
		}// if
	s1 = s1 + c;
	} //for i
if(s1 == ""){ s1 = "_" };
return s1;
}
//
// функция проверки  LINKS
//
function LINKS_OK() {
for( var i=0; i < app.activeDocument.links.length; i++){
	if( app.activeDocument.links[i].status != 1852797549 ) { return false }
}
return true;
}
//
// ******** ПОДПРОГРАММА ПОЛУЧЕНИЯ версии InDesign
//
function version_CS() {
var VERSION = app.version +"";
if(VERSION.substr(0,1) == "3") { return true;}
return false;
}



