/* построение списка файлов динамической кампании */

//Текстовый редактор
var TextEditor = "notepad.exe"


//Обязательно укажите полный путь к каталогу списков при вызове из Проводника
var OutFilePath = "E:\\il2fb\\!AircraftSelector\\MyLists\\"
//var OutFilePath = ""	//в текущем каталоге 

var cuList = new Array;
var opsList = 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 writeStr(STR){
	cuList[cuList.length]=STR
}

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

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

	
	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
	
	Lang='En'
	if (k != -1) {
		Lang=campName.substr(k+1,2).toUpperCase()	//Ru En ...
		campName=campName.substr(0,k)
	}
	
	campName=campName.replace(/.dat/,"").trim()
	
	var FSO = new ActiveXObject("Scripting.FileSystemObject"),
		f = FSO.OpenTextFile(campFile, 1, -1);
	
	
	s = f.ReadLine()	//читаем имя кампании
	writeStr(campFile+"	:"+s)

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

	OutFile=OutFilePath+campName+"-" + cName.trim() + ".list"
	
	s = f.ReadLine()	//пропускаем 2-ю строку
	
	while (!f.AtEndOfStream){
		s = f.ReadLine()
		processDB(s.substr(0,s.indexOf(" ")),Lang)
		
	}
	f.close()
	
	processPlaneFile("planes"+campName+".dat")
	processPlaneFile("Classes"+campName+".dat")
	processPlaneFile("squadrons"+campName+".dat")
	processPlaneFile("settings"+campName+".dat")
	
	writeCuList(OutFile)

	showFile(OutFile)
}


/*
1-я строка : *:имя2 (NameMis = имя2)

1) Найти секцию [planes]
секция [planes]	- 4-е слово (именно четвертое слева!) = самолет
2)NameMis*.mis - обычные мис файлы
*/
function processDB(fil,Lang){
	var fileDB=fil+".db"

	
	var FSO = new ActiveXObject("Scripting.FileSystemObject")
	
	if (!FSO.FileExists(fileDB)){
		writeStr('Нет файла '+fileDB);
		return
	}

	if (FSO.FileExists(fil+'Msg'+Lang+'.dat'))
		writeStr('	'+fil+'Msg'+Lang+'.dat')
	else
		writeStr('Нет файла '+fil+'Msg'+Lang+'.dat')
		


	var f = FSO.OpenTextFile(fileDB)
	s = f.ReadLine()
	var i=s.indexOf(":")
	NameMis = s.substr(i+1)

	writeStr('	'+fileDB);
	
//ищем секцию [operations]
	while (!f.AtEndOfStream){
		s = f.ReadLine()
		iop=s.indexOf("[Operations]")
		if (iop != -1){
			opName=s.substr(iop+15)
			if (!inList(opsList,opName))
				opsList[opsList.length] = opName
		}
	}

	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){
	writeStr('		'+fil);
}


function processPlaneFile(planeFile){
	var FSO = new ActiveXObject("Scripting.FileSystemObject");

	if (!FSO.FileExists(planeFile)){
		writeStr('Нет файла:'+planeFile);
		return
	}
	writeStr(''+planeFile);
	
}



//запись cuList в выходной файл
function writeCuList(OutFile){
//	WScript.Echo('writeCuList ',OutFile);
	var fso = new ActiveXObject("Scripting.FileSystemObject"),
		fo = fso.CreateTextFile(OutFile, true, false)

	for (i in cuList)
		fo.WriteLine(cuList[i])

	for (i in opsList)
		if (fso.FileExists(opsList[i]))
			fo.WriteLine(opsList[i]);
		else
			fo.WriteLine('Нет файла '+opsList[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);
}

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