  /* SPRUCE
	  Self-Presenting Rich User-Content Enhancement
		by Randy Brandt
		Copyright 2011 tiredjake.com
  */

	// type constants
  var tTemp=1; // class
  var tAdd=2;
  var tRemove=3;
  var tToggle=4;
  var tCSS=5;
  var tHTML=6; // set HTML
  var tJS=7; // call a function
  
  // defaults
  var last_type=0;
	var last_class;
  var last_target;

  var priorPos;
	var oMsg;

  var eventNum;
  var priorNum=-1;

	var curFile=1; // for multiple videos
  var nextPos=new Array();
  var maxEvent=new Array();
	var evt=new Array();
	var option;
	var seeking=0;
	var seekNum;
	var seekPass; //ignore first event

	/* init function */
	function fnInitSpruce(opt) {
		eventNum=0;
		maxEvent[curFile]=evt.length; // all done after this
		nextPos[curFile]=evt[eventNum].time; // pos in file 1, event 1
		oMsg=$(opt.msg);
		opt.skin="../~lib/jwplayer/beelden.zip";

$.log("fnInitSpruce div: "+opt.div+" evtlen: "+evt.length);
//$.log(evt);
$.log(opt);
	
		option=opt;
		jwplayer(opt.div).setup({
			flashplayer: "../~lib/jwplayer/player.swf",
			image: opt.image,
			file: opt.file,
			controlbar:"bottom",
			skin: opt.skin,
			frontcolor: "white",
			screencolor: "black",
			width: 320,
			height: 210,

			events: {
				onFullscreen: function(event) {
$.log("fullscreen state: "+event.fullscreen);
				},

				onMute: function(event) {
$.log("mute state:"+event.mute);
					return false;
				},

				onVolume: function(event) {
$.log("volume: "+event.volume);
				},

				onPause: function(event) {
$.log("paused: "+event.oldstate);
				},
				
				// eventNum
				onTime: function(event) {
					if (seeking) {
						if (seekPass) {
							seekPass=0;	//ignore first event
							return;
						}
						
$.log("seek:"+seeking+" < "+event.position,"err");
						if (seeking>event.position) {
							return;
						} else {
							nextPos[curFile]=seeking;
							seeking=0;
							priorPos=0;
							eventNum=seekNum;
							jwplayer().setMute(false);
						}
					}
					
					if (event.position<priorPos) {
$.log(eventNum+" reverse to pos "+event.position+" from priorPos "+priorPos,"err");
						while (eventNum && evt[eventNum].time>event.position) {
							eventNum--;
						}
$.log("eventNum-- to "+eventNum+" time: "+evt[eventNum].time+" seekSpruce");
						priorPos=0; // clear
						if (eventNum==0) {
							oMsg.html(opt.msgReady); // reset to start
						}
						fnSeekSpruce(eventNum);
						return;
					
$.log("end reverse eventNum:"+eventNum+" @ "+evt[eventNum].time,"err");
						nextPos[curFile]=evt[eventNum].time;
						if (eventNum) {
							priorPos=evt[eventNum-1].time;
						} else {
							priorPos=0;
							oMsg.html(opt.msgReady); // reset to start
						}
					}
					
					if (eventNum < maxEvent[curFile] && event.position>nextPos[curFile]) {
						fnNextEvent(event);
					}
					
//  $.log("post fnNextEvent");
				},
				
				onReady: function(event) {
$.log("onReady:");
$.log(opt.msgReady);
					oMsg.html(opt.msgReady);
				},
		
				onComplete: function(event) {
					eventNum=0;
					nextPos[curFile]=evt[eventNum].time;
					opt.onCompleteFN();
				}
				
			}
		});
	
		if (opt.play) {
			jwplayer(opt.div).play();
		}
	}
   	/*
		*/
		function fnNextEvent(event) {
  $.log("fnNextEv:"+eventNum+" pos: "+event.position+" nextPos:"+nextPos[curFile]);

	//oMsg.html(nextPos[curFile]+" : "+event.position.toFixed(2));

			while (event.position>nextPos[curFile]) {
				if (evt[eventNum].type) {
					last_type=evt[eventNum].type;
				}
				if (evt[eventNum].className) {
					last_class=evt[eventNum].className;
				}
				
				if (evt[eventNum].target) {
					last_target=evt[eventNum].target;
				}
	
//	$.log("fn: "+event.position+" Num:"+eventNum+" type:"+last_type+" targetID:"+evt[eventNum].target+" class:"+last_class);

				switch (last_type) {
					case tTemp:
						// if temp, remove prior class before add
						if (priorNum>-1) {
							$(evt[priorNum].target).removeClass(evt[priorNum].className);							
						}
						priorNum=eventNum;
						//fall through to add
//$.log("fall","war");
						
//	x=$(targetID[eventNum]).html();
//	$.log(nextPos[1]+" > "+x);
	
					case tAdd:
//$.log("add "+evt[eventNum].className);
						$(last_target).addClass(last_class);
						break;
					
					case tToggle:
						$(last_target).toggleClass(last_class);
						break;
					
					case tRemove:
						$(last_target).removeClass(last_class);							
						break;
					
					case tCSS:
						ofs=(last_class).indexOf(":"); //"color:fuchsia"
						prop=(last_class).substr(0,ofs);
						ofs++;
						$(last_target).css(prop,(last_class).substr(ofs));							
						break;

					case tHTML:
						$(last_target).html(evt[eventNum].text);
						break;

					case tJS:
						//Call the function defined in target
						var ret=last_target(event,last_class);
						break;
				}
				eventNum++;
        priorPos=nextPos[curFile]; // in case of drag to prior time
				nextPos[curFile]=evt[eventNum].time;
			}
			return;
    }
		
		
	/* */
	function fnSeekSpruce(id) {
		var idt="#"+id;
		var gotHit=false;
$.log("fnSeekSpruce id="+idt);

		$.each(evt, function(i, val) {
			last_type=(val.type)? val.type:last_type;
			last_class=(val.className)? val.className:last_class;
			last_target=(val.target)? val.target:last_target;

			if (val.target==idt) {
				gotHit=true;
				seeking=val.time;
				seekNum=i;
				return false;
			}
		});
		if (gotHit) {
				seekPass=1;
$.log("fnSeekSpruce seeking="+seeking);
			jwplayer()
				.setMute(true)
				.seek(seeking);
		}
	}
