//var TextEditor="WordPad"	//для вызова другой программы
//var TextEditor="C:\\PROGRA~2\\SciTE\\SciTE.exe"
var TextEditor="notepad"

//
//Редактируется только раздел description. Разделы Name и Short остаются без изменений.
//

var dAlfa = new ActiveXObject("Scripting.Dictionary");
var dAlfaKOI = new ActiveXObject("Scripting.Dictionary");
var strName = "", strShort = "", isDescr = false		//текст некорректируемых разделов

//===========================================================
String.prototype.trimRight=function() // убирает все пробелы в конце строки
{
  return this.replace(/\s+$/,'');
}

String.prototype.trimLeft=function() // убирает все пробелы в начале строки
{
  return this.replace(/^\s+/,'');
}

String.prototype.trim=function()	 // убирает все пробелы в начале и в конце строки
{
  return this.trimRight().trimLeft();
}
//===========================================================

main()

function main(){
	var i,ss,
		args = WScript.Arguments,
		OutFIle;

	args.length>0 ? inFile=args.item(0): inFile="?"

	if (inFile == "?"){
		WScript.Echo("Редактирование файлов properties\n	EditProperties.js файл")
		return
	}
	
	var fso = new ActiveXObject("Scripting.FileSystemObject");

	s="";
	if (fso.GetExtensionName(inFile)=='properties'){
		initdict()			//словарь инициализируем
		decof(inFile); 		//обработаем файл
		dAlfa.RemoveAll()	//очистим словарь 	
	}	
}


function decof(fil){

	var fso = new ActiveXObject("Scripting.FileSystemObject");
	var s, sr, i;
	var OutFile=fso.GetSpecialFolder(2)+"\\"+fso.GetTempName()+".txt",
		fo = fso.CreateTextFile(OutFile, true, false);	//создадим временный файл

	var f;
	
	ch=""
	ss=""

	try{
		f = fso.OpenTextFile(fil, 1, -1);
	}catch(e){
		if (e!=0) {
			WScript.Echo("Ошибка открытия "+fil)
			return
		}
	} 	

	
	//Перекодируем исходный файл и запишем результат во временный
	while (!f.AtEndOfStream){
		s = f.ReadLine()
			
		if (s.indexOf("Name ") == 0){	//имя раздела всегда в начале строки
			strName=s
			continue
		}
		if (s.indexOf("Short ") == 0){
			strShort=s
			continue
		}
		
		if (s.indexOf("Description ") == 0){
			isDescr=true
		}
				
		k=s.indexOf("Description ")
		if (k == 0)
			s=s.substr(k+12)

		
		sr=""
		s=s.replace(/\\n/g,"\\u00nn")	//остальные новые строки перкодируем в служ код 00nn
		ss = s.split(/\\u/);			//разобъем посимвольно KOI8RU
	
		for (i in ss){					//для каждого символа кои8
			ch=ss[i].slice(0,4)
			dAlfa.exists(ch) ? sr+=dAlfa.item(ch) : sr+=ch	//перекодируем в 1251
			sr+=ss[i].slice(4)
		}

		fo.WriteLine(sr)
	}
	f.close()
	fo.close()
//	showFile(OutFile)					//только просмотр временного файла
	editFile(OutFile,fil)				//Редактирование временного файла
}


//просмотр и удаление временного файла
function showFile(ofil){
	var oShell = WScript.CreateObject("WScript.Shell");
	oShell.Run(TextEditor+' ' +ofil);
	WScript.Sleep(3000)
	FSO = new ActiveXObject("Scripting.FileSystemObject")
	FSO.DeleteFile(ofil)
}


//Редактирование файл ofil и запись результатов в properties
function editFile(ofil,propFile){
	var oShell = WScript.CreateObject("WScript.Shell")
	var FSO = new ActiveXObject("Scripting.FileSystemObject"),
		File = FSO.GetFile(ofil),
		StrMod1 = File.DateLastModified	//датавремя создания файла

	oShell.Run(TextEditor+' ' +ofil,1,true);	//редактируем, если было сохранение файла - датавремя изменится
	File = FSO.GetFile(ofil)
	var StrMod2 = File.DateLastModified
	
	if (StrMod2  -  StrMod1 > 0)
		updateProp(ofil,propFile)	//файл был модифицирован - обновим properties
}

//создание propFile на основе inFile с перекодировкой в koi8ru
function updateProp(inFile,propFile) {
	var FSO = new ActiveXObject("Scripting.FileSystemObject"),
		f = FSO.OpenTextFile(inFile, 1, -2);	

	initdicKOI()					//словарь
									//чтение и перекодировка файла в буфер s
	s = ""
	if (isDescr) 					//заменить табуляции и преводы строк 0D0A
		while (!f.AtEndOfStream){
			ch = f.Read(1)
			if (ch==String.fromCharCode(9)) {
				s += "\\t"
				continue
			}
			if (ch==String.fromCharCode(13)) {
				continue
			}
			if (ch==String.fromCharCode(10)) {
					s += "\\n"				//Строка закончилась
				continue	
			}
			dAlfaKOI.exists(ch) ? s+="\\u"+dAlfaKOI.item(ch) : s+=ch	//собственно перекодировка
		}
 	 else
		while (!f.AtEndOfStream){	//без замены переводо строк и табуляций
			ch = f.Read(1)
			dAlfaKOI.exists(ch) ? s+="\\u"+dAlfaKOI.item(ch) : s+=ch
		}
	
	
	f.Close()

	dAlfaKOI.RemoveAll()			//очистим словарь 
	FSO.DeleteFile(inFile)			//удалим временный файл
	

									//восстановть name short если были
	hdr=""
	if (strName.length != 0)
		hdr=hdr+strName+String.fromCharCode(13,10)

	if (strShort.length !=0)
		hdr=hdr+strShort+String.fromCharCode(13,10)
	
	if (isDescr)
		s=hdr+"Description "+s
	else
		s=hdr+s
	
	
	
	
	
/*	
	s=s.replace(/\\nName/g, +"Name")
	s=s.replace(/\\nShort/g, String.fromCharCode(13,10)+"Short")
	s=s.replace(/\\nDescription/g, String.fromCharCode(13,10)+"Description")

//	s=s.replace(/Name/g, String.fromCharCode(13,10)+"Name")
//	s=s.replace(/Short/g, String.fromCharCode(13,10)+"Short")
//	s=s.replace(/Description/g, String.fromCharCode(13,10)+"Description")
	s=s.trim()						//пустые строки в начале и конце убарть
*/	
									//сохраним старый properties 
	try{
		FSO.CopyFile(propFile, propFile+".bak", true)	//получим bak с перезаписью 
	}catch(e){
		if (e!=0) {
			WScript.Echo("Ошибка копирования "+propFile)
			return
		}
	} 	
		
	fo = FSO.CreateTextFile(propFile)	//создать новый	properties
	fo.write(s)
	fo.Close()
}
	



//таблица перекодировки KOI8RU в 1251
//Если в тексте появляются "странные" симполы, то их код и значение можно добавить в таблицу
//перекодировки без начаьлных символов \u
function initdict(){
	dAlfa.CompareMode = 1;

	dAlfa.add("00nn","\x0d\x0a");
	dAlfa.add("00AB","«");
	dAlfa.add("00BB","»");
	dAlfa.add("0430","а");
	dAlfa.add("0431","б");
	dAlfa.add("0432","в");
	dAlfa.add("0433","г");
	dAlfa.add("0434","д");
	dAlfa.add("0435","е");
	dAlfa.add("0451","ё");
	dAlfa.add("0436","ж");
	dAlfa.add("0437","з");
	dAlfa.add("0438","и");
	dAlfa.add("0439","й");
	dAlfa.add("043A","к");
	dAlfa.add("043B","л");
	dAlfa.add("043C","м");
	dAlfa.add("043D","н");
	dAlfa.add("043E","о");
	dAlfa.add("043F","п");
	dAlfa.add("0440","р");
	dAlfa.add("0441","с");
	dAlfa.add("0442","т");
	dAlfa.add("0443","у");
	dAlfa.add("0444","ф");
	dAlfa.add("0445","х");
	dAlfa.add("0446","ц");
	dAlfa.add("0447","ч");
	dAlfa.add("0448","ш");
	dAlfa.add("0449","щ");
	dAlfa.add("044A","ъ");
	dAlfa.add("044B","ы");
	dAlfa.add("044C","ь");
	dAlfa.add("044D","э");
	dAlfa.add("044E","ю");
	dAlfa.add("044F","я");
	dAlfa.add("0410","А");
	dAlfa.add("0411","Б");
	dAlfa.add("0412","В");
	dAlfa.add("0413","Г");
	dAlfa.add("0414","Д");
	dAlfa.add("0415","Е");
	dAlfa.add("0401","Ё");
	dAlfa.add("0416","Ж");
	dAlfa.add("0417","З");
	dAlfa.add("0418","И");
	dAlfa.add("0419","Й");
	dAlfa.add("041A","К");
	dAlfa.add("041B","Л");
	dAlfa.add("041C","М");
	dAlfa.add("041D","Н");
	dAlfa.add("041E","О");
	dAlfa.add("041F","П");
	dAlfa.add("0420","Р");
	dAlfa.add("0421","С");
	dAlfa.add("0422","Т");
	dAlfa.add("0423","У");
	dAlfa.add("0424","Ф");
	dAlfa.add("0425","Х");
	dAlfa.add("0426","Ц");
	dAlfa.add("0427","Ч");
	dAlfa.add("0428","Ш");
	dAlfa.add("0429","Щ");
	dAlfa.add("042A","Ъ");
	dAlfa.add("042B","Ы");
	dAlfa.add("042C","Ь");
	dAlfa.add("042D","Э");
	dAlfa.add("042E","Ю");
	dAlfa.add("042F","Я");
}

//перекодировка cp1251 в koi8ru Если появяться "странные" символы в текстах миссий, то их коды
//можно добавить в таблицу dAlfaKOI
function initdicKOI(){
//	dAlfaKOI.CompareMode = 1;

	dAlfaKOI.add("а","0430");
	dAlfaKOI.add("б","0431");
	dAlfaKOI.add("в","0432");
	dAlfaKOI.add("г","0433");
	dAlfaKOI.add("д","0434");
	dAlfaKOI.add("е","0435");
	dAlfaKOI.add("ё","0451");
	dAlfaKOI.add("ж","0436");
	dAlfaKOI.add("з","0437");
	dAlfaKOI.add("и","0438");
	dAlfaKOI.add("й","0439");
	dAlfaKOI.add("к","043A");
	dAlfaKOI.add("л","043B");
	dAlfaKOI.add("м","043C");
	dAlfaKOI.add("н","043D");
	dAlfaKOI.add("о","043E");
	dAlfaKOI.add("п","043F");
	dAlfaKOI.add("р","0440");
	dAlfaKOI.add("с","0441");
	dAlfaKOI.add("т","0442");
	dAlfaKOI.add("у","0443");
	dAlfaKOI.add("ф","0444");
	dAlfaKOI.add("х","0445");
	dAlfaKOI.add("ц","0446");
	dAlfaKOI.add("ч","0447");
	dAlfaKOI.add("ш","0448");
	dAlfaKOI.add("щ","0449");
	dAlfaKOI.add("ъ","044A");
	dAlfaKOI.add("ы","044B");
	dAlfaKOI.add("ь","044C");
	dAlfaKOI.add("э","044D");
	dAlfaKOI.add("ю","044E");
	dAlfaKOI.add("я","044F");
	dAlfaKOI.add("А","0410");
	dAlfaKOI.add("Б","0411");
	dAlfaKOI.add("В","0412");
	dAlfaKOI.add("Г","0413");
	dAlfaKOI.add("Д","0414");
	dAlfaKOI.add("Е","0415");
	dAlfaKOI.add("Ё","0401");
	dAlfaKOI.add("Ж","0416");
	dAlfaKOI.add("З","0417");
	dAlfaKOI.add("И","0418");
	dAlfaKOI.add("Й","0419");
	dAlfaKOI.add("К","041A");
	dAlfaKOI.add("Л","041B");
	dAlfaKOI.add("М","041C");
	dAlfaKOI.add("Н","041D");
	dAlfaKOI.add("О","041E");
	dAlfaKOI.add("П","041F");
	dAlfaKOI.add("Р","0420");
	dAlfaKOI.add("С","0421");
	dAlfaKOI.add("Т","0422");
	dAlfaKOI.add("У","0423");
	dAlfaKOI.add("Ф","0424");
	dAlfaKOI.add("Х","0425");
	dAlfaKOI.add("Ц","0426");
	dAlfaKOI.add("Ч","0427");
	dAlfaKOI.add("Ш","0428");
	dAlfaKOI.add("Щ","0429");
	dAlfaKOI.add("Ъ","042A");
	dAlfaKOI.add("Ы","042B");
	dAlfaKOI.add("Ь","042C");
	dAlfaKOI.add("Э","042D");
	dAlfaKOI.add("Ю","042E");
	dAlfaKOI.add("Я","042F");
}                 




