var cuList = new Array;

var fso = new ActiveXObject("Scripting.FileSystemObject");
var main_folder_path;
var main_folder;
var OutFile;



//================================================================
//для удобстава обработки строк:
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 args = WScript.Arguments;
/*
	if (args.length == 0){
  		WScript.Echo("Формирование custom.txt из файлов  *.mis.\nВыбираются имена из class air. и .Plane$\nИспользование:\n 	getCustomList.js  Каталог [файл] \nПервый параметр - начальный каталог\nВторой параметр - файл списка (если не задан - MyCustomList.txt в текущем каталоге)\nПример:\n	getCustomList.js E:\\IL-2\\Missions\\Campaign\\US e:\\CustomUS.txt\nДобавить самолеты всех кампаний каталога US в e:\\CustomUS.txt")
		return
	}
*/
	
	var WS = WScript.CreateObject("WScript.Shell"),
		Directory = WS.CurrentDirectory,
		AircraftSelector_path="!AircraftSelector\\MyLists",
		OutFilePath=Directory.substr(0,Directory.indexOf("Missions"))+AircraftSelector_path;

	
	//OutFile - файл в который добавляются самолеты из class air или Plane$. Может быть не пустым.
	//Если самолет уже есть в файле, то он не добавляется.
	
	if (args.length == 0)
		main_folder_path = Directory
	else
		main_folder_path = args.item(0);	//Начальный каталог кампаний или отдельной кампании

	if (args.length>1) 
		OutFile = args.Item(1)
	else {
		is = Directory.toUpperCase().indexOf("SINGLE")
		if (is == -1)
			is = Directory.toUpperCase().indexOf("CAMPAIGN")

		cName=Directory.substr(is).replace(/\\/g,"-")
		OutFile=OutFilePath+"\\"+cName.trim() + ".txt"
	}


	main_folder=fso.GetFolder(main_folder_path);

	initList()						//Заполнение списка cuList из OutFile если OutFile существует
	
	DirWithSubFolders(main_folder);	//обход всех каталогов начиная с указанного в первом параметре

	writeCuList()					//запись сформированного списка в OutFile
		
	WScript.Echo('Создан файл \n'+OutFile);

}

// ================================================================
//обход всех каталогов начиная с указанного в первом параметре
function DirWithSubFolders(_folder){
    EnumerateFiles (_folder);	//получение всех файлов mis в каталоге
    var more_folders = new Enumerator(_folder.SubFolders);
    for (;!more_folders.atEnd();more_folders.moveNext()){
        OneFolder = more_folders.item();
  //      WScript.Echo (OneFolder.Path);
        DirWithSubFolders (OneFolder);	//обработка подчиненных каталогов
    }
}

// ================================================================
//Обработка всех файлов mis в очередном каталоге
function EnumerateFiles(_folder){
    var more_files = new Enumerator(_folder.Files);
//		 WScript.Echo (_folder);
    for (;!more_files.atEnd();more_files.moveNext()){
        one_file = more_files.item();
		if (one_file.Path.indexOf("mis") > 0) {
//			findClassInPlayer(one_file.Path)			//поиск классов в очередном файле в секции player 
			findClassInAllSections(one_file.Path)		//поиск классов в очередном файле во всех секциях
		}
    }
}


//поиск классов в очередном файле во всех секциях
function findClassInAllSections(fil){
	var fso, f, s, ForReading;

//	WScript.Echo("Поиск в ",fil );
	
	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.
			if (!inList(cuList,pclass))	//добавим если нет в списке
				cuList[cuList.length]=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)
			if (!inList(cuList,pclass))	//добавим если нет в списке
				cuList[cuList.length]=pclass
		}
	}

	f.Close()

}


//поиск классов в очередном файле только в секции player
function findClassInPlayer(fil){
	var fso, f, s, ForReading;

//	WScript.Echo("Поиск в ",fil );
	ForReading = 1, s= "";
	fso = new ActiveXObject("Scripting.FileSystemObject");
	f = fso.OpenTextFile(fil, ForReading, false);

	player = ""		//пусто - не найден
	
	sect = false  	//секция пока не найдена
	found = 0	//номер строки найденного класса
		
	while (!f.AtEndOfStream){
		s = f.ReadLine()
		
		
		//WScript.echo(s.toUpperCase())
		if (sect){	//внутри секции player
			
			k=s.toUpperCase().indexOf(" AIR.")
			if( k != -1 ){
				pclass=s.slice(k+5).trim()
//				WScript.Echo(inList(cuList,pclass))
				if (!inList(cuList,pclass))
					cuList[cuList.length]=pclass
			} else {
				if (s.indexOf("[") != -1)	//начало следующей секции
					break
			}

		}else    //пока нужная секция не найдена
			if (player.length == 0)	{
				k=s.toUpperCase().indexOf("PLAYER ")
				if (k != -1)
					player=s.slice(k+7).trim()
				
			}else //проверка на начало нужной секции
				if (s.indexOf('['+player+']') != -1)
					 sect=true	//началась секция [player]
	}

	f.Close()

}


//Заполнение списка cuList из OutFile если он есть перед началом обработки каталогов кампаний
function initList(){
	if (!fso.FileExists(OutFile)) return

	var fo = fso.OpenTextFile(OutFile,1)	//1 - для чтения
	while (!fo.AtEndOfStream){
		s=fo.ReadLine().trim()
		if (s.length > 0)
			if (!inList(cuList,s))
				cuList[cuList.length]=s
	}
	fo.close()
}

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

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

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

//показать список - отладка
function showCuList(){
	for (i in cuList){
		WScript.Echo(cuList[i])
	}
}
