var fs, source_fld, excel_fld, stream, i, str;
var xlToRight = -4161;
fs = WScript.CreateObject("Scripting.FileSystemObject");
source_fld = fs.GetFolder("g:\\残業\\");

//テキストファイルから各人の残業時間を読み取る
var fc = new Enumerator(source_fld.Files);
var arrData = new Array();
var nData = 0;
for(; !fc.atEnd(); fc.moveNext()) {
	if(/残業[0-9]+\.txt/.test(fc.item().Name)) {
		arrData[nData] = new Data();
		arrData[nData].setDate(fc.item().Name);
		stream = fs.OpenTextFile(fc.item());
		str = stream.ReadLine();
		arrName = str.split(",");
		str = stream.ReadLine();
		arrHours = str.split(",");
		stream.Close();
		for(i = 0; i < arrName.length; i++)
			arrData[nData].setData(arrName[i], arrHours[i]);
		nData++;
	}
}

var objXL = WScript.CreateObject("Excel.Application");
//objXL.Visible = true;
excel_fld = fs.GetFolder("c:\\残業");
for(i = 0; i < nData; i++)
	with(objXL) {
		OpenMonthBook(arrData[i].d);
		r = arrData[i].d.getDate() + 1;
		str = arrData[i].d.toLocaleString();
		Cells(r, 1).Value = str.substring(0, 10);
		cmax = Cells(1, 2).End(xlToRight).Column;
		for(c = 2; c <= cmax; c++) {
			str = Cells(1, c).Text
			if(arrData[i].IsExist(str))
				Cells(r, c).Value =
							arrData[i].getZangyou(str);
		}
		ActiveWorkbook.Save();
	}
objXL.Quit();

//その月に対応するブックを開く
function OpenMonthBook(d) {
	var books, bookname, prebookname;
	var y = d.getYear();
	if(y >= 2000)
		y -= 2000;
	var m = d.getMonth() + 1;
	bookname = excel_fld.Path + "\\残業"
				+ FormatZ(y, 2) + FormatZ(m, 2) + ".xls";
	
	//すでに開かれているか
	//開かれていればそのまま抜ける
	for(var j = 1; j <= objXL.Workbooks.Count; j++)
		if(objXL.Workbooks(j).Name == bookname)
			return;
	
	//開かれていない場合
	if(fs.FileExists(bookname))
		objXL.Workbooks.Open(bookname);
	else {
		//ファイルが存在しない場合は新しくブックを作る
		if(objXL.Workbooks.Count == 0) {
			//前月のブックを開く
			if(m == 1) {
				y = y == 0 ? 99 : y - 1;
				m = 12;
			}
			else
				m--;
			prebookname = excel_fld.Path + "\\残業"
				+ FormatZ(y, 2) + FormatZ(m, 2) + ".xls";
			if(fs.FileExists(prebookname))
				objXL.Workbooks.Open(prebookname);
			else {
				//なければ終わる
				WScript.Echo("ブックがみつかりません");
				objXL.Quit();
				WScript.Quit();
			}
		}
		with(objXL) {
			Workbooks.Add();
			//名前をコピーする
			for(var c = 2; Workbooks(1).Worksheets(1).Cells(1, c).Text != ""; c++)
				Cells(1, c).Value =
						Workbooks(1).Worksheets(1).Cells(1, c).Value;
			//新しいブックに名前をつける
			Workbooks(Workbooks.Count).SaveAs(bookname);
		}
	}
}

function Data() {
	this.d;
	this.dic = WScript.CreateObject("Scripting.Dictionary");
	this.setDate = setDate;
	this.setData = setData;
	this.IsExist = IsExist;
	this.getZangyou = getZangyou;
}

function setDate(str) {
	var y = parseInt(str.substring(2, 4));
	if(y < 90)
		y += 2000;
	var m = parseInt(str.substring(4, 6)) - 1;
	var d = parseInt(str.substring(6, 8));
	this.d = new Date(y, m, d);
}

function setData(name, value) {
	this.dic.add(name, parseFloat(value));
}

function IsExist(name) { return this.dic.Exists(name); }

function getZangyou(name) { return this.dic.Item(name); }

function FormatZ(num, width) {
	var pos;
	var str = num + "";
	if(str.indexOf("e") != -1) {
		WScript.Echo(str + " : 不適切な数値です(FormatZ)");
		WScript.Quit();
	}
	if((pos = str.indexOf(".")) != -1)
		str = str.substring(0, pos);
	
	for(; str.length < width; str = "0" + str)
		;
	if((pos = str.indexOf("-")) != -1)
		str = "-" + str.substring(0, pos)
				+ str.substring(pos + 1, str.length);
	return str;
}
