//Текстовый редактор
//var TextEditor = "notepad.exe"
var TextEditor = ""			//если пусто - не запускать.

//Предлагаю создать отдельный каталог для своих списков с именем MyLists, чтоб не мусорить в каталоге SET_DATA.
//Укажите свое расположение каталога со списками:
var OutFilePath = "..\\!AircraftSelector\\MyLists"


var Zaglushki = [
"A6M2_21",
"A_20C",
"BF_109E4B",
"B_25G1",
"B_25J1",
"C_47",
"D3A1",
"F4F3",
"FI_156",
"G4M1_11",
"H8K1",
"HE_111H6",
"HS_129B2",
"IL_2_1940Late",
"IL_4_IL4",
"I_16TYPE24",
"JU_52_3MG4E",
"JU_52_3MG5E",
"JU_88A4",
"KI_21_II",
"L2D",
"LI_2",
"MBR_2AM34",
"PBN1",
"PE_2SERIES1",
"SEAFIRE3",
"U_2VS"
]
	

//var deb = true	//ТОЛЬКО ДЛЯ ОТЛАДКИ! Записывает в выходной файл отладочную информацию.
var deb = false //рабочий режим


/*
Построение списка самолетов динамической кампании.
	DgenCustomList.js файл
Файл - файл вида campaignsNNXX.dat из каталога Dgen.
Формируется список с именем из первой строки campaignsNNXX.dat

Скопировать и запускать скрипт в каталоге Dgen.
Скрипт не меняет никаких файлов на диске. По окончании  Открывает список текстовым
редактором (переменная TextEditor).
Если открывать не нужно скорректируйте на:
var TextEditor = ""

!!! НЕ ЗАБЫТЬ УСТАНОВИТЬ ПЕРЕМЕННУЮ deb в false !!!!
*/

/*
Работает довольно медленно. Виндовс может снять скрпит из-за превышения времени выполнения.
Для увеличения времени можно однократно сохранить парамтры командной строки:
	cscript //T:60 //S
или каждый раз запускать:
	cscript //T:60 DGenCustomList.js файл
T:60 - максимальное время выполнения скрипта в секундах.
*/

/*
Алгоритм:
Основной файл - campaignsNNXX.dat - это корневой который читает игра
Через параметр выбрать: campaignsDe77.dat (campName=De77)
campFile=campaignsNNXX.dat

файлы в c 3-ей строки до конца файла (.db добавить):
SGT41_NorthernFront_06_23_F.db
SGT41_NorthernFront_07_17_F.db
SGT41_NorthernFront_09_11_F.db

fileDB=первоеслово+:".db"
Для каждого fileDB:
1-я строка : *:имя2 (NameMis = имя2)

1) Найти секцию [planes]
секция [planes]	- 4-е слово (именно четвертое слева!) = самолет
2)NameMis*.mis - обычные мис файлы

Обработать файл planes:
PlanesFile=palnescampName.dat - все строки без [ = имена самолетов
*/

var cuList = new Array,
	namList = new Array;

//================================================================
//для удобстава обработки строк:
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 DEBUG(STR){
	if (deb)
		addPlane(STR)
}

function main(){
	var args = WScript.Arguments,
		campFile="";

	for (var i = 0; i < args.length; i++) {
		var arg = args.item(i);
		campFile += arg+" "
	}
	
//	args.length>0 ? campFile=args.item(0): campFile="?";
	
	if (campFile == "?"){
		WScript.Echo("Построение списка самолетов динамической кампании.\n	DgenCustomList.js файл\nФайл - файл вида campaignsNNXX.dat из каталога Dgen.\nФормируется список customNNXX.txt\nСкопировать скрипт в каталог Dgen.")
		return
	}


//	WScript.Echo(campFile);
	
	
	i=campFile.indexOf(".")
	if (i == -1)
		campFile = campFile+".dat"

	j=campFile.indexOf("campaigns")
	
	if (j == -1){
		WScript.Echo("Это не файл динамической кампании\n"+campFile);
		return
	}

	campName=campFile.substr(j+9,i)
	

	k=campName.indexOf("_")	//campaignsAB123_ru.dat
	if (k != -1)
		campName=campName.substr(0,k)

	campName=campName.replace(/.dat/,"").trim()
	
//	WScript.Echo(campName);
	
	var FSO = new ActiveXObject("Scripting.FileSystemObject"),
		f = FSO.OpenTextFile(campFile, 1, -1);

	s = f.ReadLine()	//читаем имя кампании

	//Сформируем имя списка на основе первой строки файла кампании без спецсимволов, 
	//добавим код кампании в начло.
	
	cName=s.replace(/[\"\\\/\:\*\?\<\>\|\+\@\!\%\«\»]/g, '')

	OutFile=OutFilePath+"\\"+campName+"-" + cName.trim() + ".txt"
	
	s = f.ReadLine()	//пропускаем 2-ю строку

	DEBUG('-Process '+campFile)
	
	while (!f.AtEndOfStream){
		s = f.ReadLine()
		processDB(s)
		
	}
	f.close()
	
	processPlaneFile("planes"+campName+".dat")
	
	addZaglushki()
	
	writeCuList(OutFile)
	showFile(OutFile)
}

function addZaglushki(){
	for (var i in Zaglushki)
			addPlane(Zaglushki[i])	
}
/*
1-я строка : *:имя2 (NameMis = имя2)

1) Найти секцию [planes]
секция [planes]	- 4-е слово (именно четвертое слева!) = самолет
2)NameMis*.mis - обычные мис файлы
*/
function processDB(s){
	fil=s.substr(0,s.indexOf(" "))	//файл кампании
	
	namList[namList.length]=s.substr(s.indexOf(" "))	//имя кампании в список
	
	var fileDB=fil+".db"
	
	var FSO = new ActiveXObject("Scripting.FileSystemObject")
	
	if (!FSO.FileExists(fileDB)){
		WScript.Echo('Нет файла ',fileDB);
		return
	}
	var f = FSO.OpenTextFile(fileDB)
	s = f.ReadLine()
	NameMis = s.substr(s.indexOf(":")+1)

	DEBUG('-processDB '+fileDB);
	
	plane=false
	while (!f.AtEndOfStream){
		s = f.ReadLine()
		if (s.toLowerCase()=="[planes]"){
			plane=true
			continue
		}
		if (s.charAt(0)=="[")
			if (plane)
				break
		if (plane){
			ss = s.split(/ /);
			addPlane(ss[3])
		}
	}
	f.close()
	processMisFiles(NameMis)
}

//NameMis*.mis - обычные мис файлы	
function processMisFiles(Prefix){
	var WS = WScript.CreateObject("WScript.Shell"),
	res=GetFileList(WS.CurrentDirectory, Prefix+"*.mis", false)
	for (var f in res)
		findClassInAllSections(res[f].trim())
}


//поиск классов в очередном файле во всех секциях
function findClassInAllSections(fil){
	
	DEBUG('-findClassInAllSections '+fil);
	
	var fso, f, s, ForReading,
		ForReading = 1,
		s= "",
		fso = new ActiveXObject("Scripting.FileSystemObject"),
		f = fso.OpenTextFile(fil, ForReading, false);
		
	
	while (!f.AtEndOfStream){
		s = f.ReadLine()
			
		k=s.toUpperCase().indexOf(" AIR.")	//ищем class    air.имя
		if( k != -1 ){
			pclass=s.slice(k+5).trim()		//имя после air.
			addPlane(pclass)
			continue
		} 
		k=s.toUpperCase().indexOf("PLANE$")	//ищем plane
		if( k != -1 ){
			pclass=s.slice(k+6).trim()
			l=pclass.indexOf(" ")		//имя после plane$ и до пробела
			pclass=pclass.substr(0,l)
			addPlane(pclass)
			continue
		}

		k=s.toUpperCase().indexOf("PLANEDGEN$")	//ищем planedGEN$
		if( k != -1 ){
			pclass=s.slice(k+10).trim()
			l=pclass.indexOf(" ")		//имя после plane$ и до пробела
			pclass=pclass.substr(0,l)
			addPlane(pclass)
			continue
		}

	}

	f.Close()
}



function processPlaneFile(planeFile){
	var FSO = new ActiveXObject("Scripting.FileSystemObject");
	
	DEBUG('-processPlaneFile '+planeFile);
	
	if (!FSO.FileExists(planeFile)){
		WScript.Echo('Файл не существует:',planeFile);
		return
	}
	
	var f = FSO.OpenTextFile(planeFile),s
	
	while (!f.AtEndOfStream){
		s = f.ReadLine()
		if (s.charAt(0) == "[")
			continue
		addPlane(s.trim())
	}
	f.Close()
}


function addPlane(pclass){
	if (!inList(cuList,pclass))		//добавим если нет в списке
		cuList[cuList.length]=pclass
}

//провека наличия строки str в списке List
function  inList(List,str){
	for (var k in List)
		if (List[k] == str)
			return true
	return false
}


//запись cuList в выходной файл
function writeCuList(OutFile){
	cuList.sort()	//сортировка по имени
	var fso = new ActiveXObject("Scripting.FileSystemObject"),
		fo = fso.CreateTextFile(OutFile, true, false)

	for (i in namList)
		fo.WriteLine("-- "+namList[i])
	
	for (i in cuList)
		fo.WriteLine(cuList[i])

	fo.close()
}


function GetFileList(Directory, Extension, Deep)
{
    var
        FSO = WScript.CreateObject("Scripting.FileSystemObject"),
        WshShell = WScript.CreateObject("WScript.Shell"),
        LastCurrentDirectory = WshShell.CurrentDirectory;

// Проверка необязательных параметров Extension, Deep
        !Extension || Extension=="" ? Extension = "": null;
        Deep? Deep = "/S": Deep = "";
        
// Преобразуем исходнный Directory в короткий путь
        Directory = FSO.GetFolder(Directory).ShortPath;
        
    var    
        Result = [],
        Command, 
        TempPath = WshShell.ExpandEnvironmentStrings("%TEMP%")+"\\", // Путь к папке %TEMP%
        TempBuffer = TempPath + (new Date()).valueOf().toString().substring(6)+".txt";
        
        // Ведем поиск средствами CMD. 
        Command = "cmd.exe /c chcp 1251 && cmd.exe /c && dir /B "+Deep+" /A:-D "+ Extension+ " > "+TempBuffer;
	
        // Устанавливаем директорию по умолчанию
        WshShell.CurrentDirectory = Directory;

        // Запустим CMD, ждем окончание выполнения этого процесса
        WshShell.Run(Command, 0, true);

    var 
		Stream = FSO.OpenTextFile(TempBuffer, 1, false);
		Stream.AtEndOfStream ?	Result="" : Result = Stream.ReadAll();
        Stream.Close();
        
        FSO.DeleteFile (TempBuffer);
        Result = Result.split("\n");
        Result.length -= 1;
        WshShell.CurrentDirectory = LastCurrentDirectory;
    return Result;
}


function showFile(ofil){
	if (TextEditor.length == 0)
		return
	
	var oShell = WScript.CreateObject("WScript.Shell");
	oShell.Run(TextEditor+" "+ofil);
}

