/* music ontology */

var TL = {
	obj:[],
	init:function() { /* create timeline; add bands based on triple content */
		var options1 = {
			formatter:false,
			resize:false,
			timeStepOverride:"_fiveseconds",
			timeTitleOverride:function(date) {
				return date.format("i:s.x");
			},
			timeLabelOverride:function(date) {
				return date.format("i:s.x");
			}
		}
		var options2 = {
			formatter:false,
			resize:false,
			timeStepOverride:"_seconds",
			timeTitleOverride:function(date) {
				return date.format("i:s.x");
			},
			timeLabelOverride:function(date) {
				return date.format("i:s.x");
			}
		}
		OAT.Dom.clear("tl1");
		var tl1 = new OAT.Timeline("tl1",options1);
		TL.obj.push(tl1);
		OAT.Event.attach(window,"resize",tl1.sync); 
		OAT.Dom.clear("tl2");
		var tl2 = new OAT.Timeline("tl2",options2);
		TL.obj.push(tl2);
		OAT.Event.attach(window,"resize",tl2.sync);
	},
	
	add:function(tl,triples) { /* plot events */
		var colors = ["#D3D3D3","#EDFDFE","#FEEFEF","#EDFDFE","#FEEFEF"];//#CBFEFE
		var cindex = 1;
		/* root band */
		var root = Data.findP(triples,"time")[0];
		tl.addBand(root[0],colors[0]);
		var dur = "P0S";
		if (Data.findSP(triples,root[2],"durationXSD").length > 0)
			dur = Data.findSP(triples,root[2],"durationXSD")[0][2];
		var start = Data.date(false);
		var end = Data.date(dur);
		var div = OAT.Dom.create("div");
		if (dur != "P0S")
			div.innerHTML = "Duration";
		tl.addEvent(root[0],start,end,div,"#888");
		
		var types = Data.findPO(triples,"subClassOf","Event");
		for (var i=0;i<types.length;i++) {
			var type = types[i][0];
			tl.addBand(type,colors[cindex++]);
			var events = Data.findPO(triples,"type",type);
			for (var j=0;j<events.length;j++) { TL.addEvent(tl,triples,events[j][0],type);	}
		}
		
		tl.draw();
	},
	
	addEvent:function(tl,triples,e,bandtype) {
		var label = Data.findSP(triples,e,"label");
		if (!label.length) { label = Data.findSP(triples,e,"key"); }
		if (label.length > 0)
		{ label = label[0][2]; }
		var div = OAT.Dom.create("div",{},"eventlabel");

		var time = Data.findSP(triples,e,"time")[0][2];
		var type = Data.findSP(triples,time,"type")[0];
		if (type[2] == "Instant") { /* instant */
			var dur = Data.findSP(triples,time,"atDuration")[0][2];
			var start = Data.date(dur);
			//var end = Data.date(dur); 
			// For demo's sake
			var end = new Date(start.getTime() + Data.duration("P0.001S"));
		} else { /* interval */
			var dur1 = Data.findSP(triples,time,"beginsAtDuration")[0][2];
			var start = Data.date(dur1);
			var dur2 = "P1S";
			if (Data.findSP(triples,time,"durationXSD").length > 0)
			{ 
				dur2 = Data.findSP(triples,time,"durationXSD")[0][2]; 
				var end = new Date(start.getTime() + Data.duration(dur2));
			}
			else if (Data.findSP(triples,time,"endsAtDuration").length > 0)
			{
				var end = Data.date(Data.findSP(triples,time,"endsAtDuration")[0][2]);
			}

		}
		
		if (!label.length)
		{ 
			timelabel = Data.findSP(triples,time,"label");
			if (timelabel.length > 0)
				label = timelabel[0][2];
			else
				label = "";
		}
		div.innerHTML = label;
		tl.addEvent(bandtype,start,end,div,"#888");
	}
}

var Data = {
	simplify:function(str) {
		if (!str.match(/^http/i) && !str.match(/^file/i))
			return str;
		var r = str.match(/([^\/#]*)$/);
		return r[1];
	},
	parse:function(xmlDoc) {
		var triples = OAT.RDF.toTriples(xmlDoc);
		var t2 = [];
		for (i=0;i<triples.length;i++) {
			var t = triples[i];
			var s = Data.simplify(t[0]);
			var p = Data.simplify(t[1]);
			var o = Data.simplify(t[2]);
			t2.push([s,p,o]);
		}
		return t2;
	},
	duration:function(str) {
		var time = str.substring(1);
		if (str[1] == 'T')
			time = str.substring(2);
		var r = time.match(/([^M]+M)?([^S]+S)?$/)
		var total = 0;
		if (r[1]) {
			total += parseFloat(r[1]) * 60 * 1000;
		}
		if (r[2]) {
			total += parseFloat(r[2]) * 1000;
		}
		return total;
	},
	date:function(str) {
		var d = new Date();
		d.setHours(0)
		d.setMinutes(0);
		d.setSeconds(0);
		d.setMilliseconds(0);
		if (!str) { return d; }
		d.setMilliseconds(Data.duration(str));
		return d;
	},
	findS:function(triples,s) {
		var result = [];
		for (var i=0;i<triples.length;i++) {
			var t = triples[i];
			if (t[0] == s) { result.push(t); }
		}
		return result;
	},
	findP:function(triples,p) {
		var result = [];
		for (var i=0;i<triples.length;i++) {
			var t = triples[i];
			if (t[1] == p) { result.push(t); }
		}
		return result;
	},
	findPO:function(triples,p,o) {
		var result = [];
		for (var i=0;i<triples.length;i++) {
			var t = triples[i];
			if (t[1] == p && t[2] == o) { result.push(t); }
		}
		return result;
	},
	findSP:function(triples,s,p) {
		var result = [];
		for (var i=0;i<triples.length;i++) {
			var t = triples[i];
			if (t[1] == p && t[0] == s) { result.push(t); }
		}
		return result;
	}
}

function load() {
	/* 
		1. fetch data
		2. parse it
		3. init timeline
		4. plot events 
	*/
	
	var callback = function(xmlDoc) {
		/* #2 */
		var triples = Data.parse(xmlDoc);
		/* #3 */
		TL.init();
		/* #4 */
		TL.add(TL.obj[0],triples);
		TL.add(TL.obj[1],triples);
	}
	
	/* #1 */
	OAT.Dereference.go($v("url"),callback,{type:OAT.AJAX.TYPE_XML});
}

function init() {
	OAT.Event.attach("btn","click",load);
	OAT.Event.attach("url","keypress",function(e) {
		if (e.keyCode == 13) { load(); }
	});
	OAT.Dom.hide("throbber");
	OAT.AJAX.startRef = function() { OAT.Dom.show("throbber"); }
	OAT.AJAX.endRef = function() { OAT.Dom.hide("throbber"); }
}

