$('#logFile').ready(waitForIt);
dateExp=/(\d+):(\d+):(\d+):(\d+):(\d+):(\d\d).*/;
idExp=/\[(\d+).*/;
//COLUMNS=["time", "actorName", "actorId", "petName", "petId", "targetName", "targetId", "effectName", "effectId", "effectType", "special", "effectValue", "effectBaseValue"];

function go() {
	var doc=logFile.document || logFile.contentDocument;
	var raw=$(doc.documentElement).text();
	var rows=raw.split(/[\r\n]+/g);
	var entries=[];
	var c=rows.length;
	for (var i=0; i < c; i++) {
		if (rows[i]) {
			entry=parseRow(rows[i]);
			entries.push(entry);
		}
	}
	var log=new TAFFY(entries);
	window.log=log;
	log.actors={};
	log.specials={};
	log.effectTypes={};
	log.forEach(indexLog);
}

function indexLog(f,n) {
	log.actors[f.actorId]=log.actors[f.actorId] || {};
	log.actors[f.actorId].name=f.actorName;
	if (f.targetId) {
		log.actors[f.targetId]=log.actors[f.targetId] || {};
		log.actors[f.targetId].name=f.targetName;
	}
	log.actors[f.actorId].effects=log.actors[f.actorId].effects || {};
	log.actors[f.actorId].effects[f.effectId]=log.actors[f.actorId].effects[f.effectId] || {};
	log.actors[f.actorId].effects[f.effectId].name=f.effectName;
	log.actors[f.actorId].effects[f.effectId].type=f.effectType;
	log.effectTypes[f.effectType]=true;
	if (f.special) {
		for (var i in f.special) {
			log.specials[f.special[i]]=true;
		}
	}
}

function parseRow(text) {
	var entry={};
	var cols=text.split(/,|::/g);
	entry.time=parseDate(cols[0]);
	entry.actorName=cols[1];
	entry.actorId=cols[2].replace(idExp,"$1");
	entry.petName=cols[3];
	entry.petId=cols[4]=="*" ? "" : cols[4].replace(idExp,"$1");
	entry.targetName=cols[5];
	entry.targetId= (cols[6] && cols[6] !="*") ? cols[6].replace(idExp,"$1") : "";
	entry.effectId=cols[8];
	entry.effectName=cols[7] || entry.effectId.replace('Powerdef.Name.','');
	entry.effectType=cols[9];
	entry.special=cols[10] ? cols[10].split("|") : undefined;
	entry.effectValue=parseFloat(cols[11]);
	entry.effectBaseValue=parseFloat(cols[12]) || entry.effectValue;
	return entry;
}

function waitForIt(phase,length) {
	phase=(phase * 1) ? phase : 1;
	length=length || 0;
	logFile=window.logFile || document.getElementById('logFile');
	var doc=logFile.document || logFile.contentDocument;
	switch (phase) {
		case 1: {
			if (doc) {
				length=$(doc.documentElement).text().length;
				waitForIt(2,length);
				//$(logFile.document).ready(go);
				return;
			}
			break;
		}
		case 2 : {
			if ($(doc.documentElement).text().length && ($(doc.documentElement).text().length == length)) {
				go();
				return;
			}
			length=$(doc.documentElement).text().length;
		}
	}
	window.status=length;
	setTimeout('waitForIt('+phase+','+length+')',1);
}

function parseDate(raw) {
	var d=new Date(raw.replace(dateExp,"$2/$3/$1, $4:$5:$6"));
	var milli=raw.split(".")[1]*100;
	d.setUTCMilliseconds(milli);
	return d;
}

function analyzeCritsFor(name, startTime,endTime){
	var query={actorName:name, targetId:{length:{gt:0}}};
	if (startTime) {
		query.time={gt:startTime};
	}	
	if (endTime) {
		query.time={lt:endTime};
	}
	var attacks=log.find(query);
	var totalCount=attacks.length;
	query={special:{has:"Critical"}};
	var crits=log.find(query,attacks);
	var critCount=crits.length;
	var critPercent=critCount/totalCount;
	critPercent=Math.floor(critPercent*10000)/100;
	alert ("There were " + critCount + " criticals out of " + totalCount + " attacks, for a " +critPercent+ "% crit rate.");
	return log.get(crits);
}

function summarize(entries) {
	
}
