// import formatter.js
// import bolmodel.js


function Layer(name,elementid){
  this.name=name;
  this.elementid=elementid;
}


function EventManager(xml,assetFolder){
    var delay=500;
    var events = new Array();
    var eventtypes = new Array(new Event('slide'), new Event('skip'),new Event('topic'),new Event('speaker'),new Event('comment'));
    var playerManager;
    var me="eventManager";
    var xslMap = new Object();


	this.xml = xml;
	this.assetFolder = assetFolder;
    this.me = me;
	
    this.eventtypes = eventtypes;
    

this.getXsl = function(key){
    if(xslMap[key]==undefined){
       xsl = xmlManager.getDomFromFile(key);              
       xslMap[key]=xsl;          
    }
   
   return xslMap[key];
   
}

this.renderInterface = function(page){

  
  url = page!=undefined?"xml/"+page+".xml":"xml/interface.xml";

  interface = xmlManager.getDomFromFile(url);  
  if(interface != null ){
   
  layers = interface.getElementsByTagName("layer");

  for(i =0;i<layers.length;i++){   
   docElement =   document.getElementById(layers[i].getAttribute("id"));
   content = layers[i].firstChild;

   if(docElement != undefined && content != undefined){
          
        docElement.innerHTML=content.firstChild.nodeValue;
        
   }
  }

  }

}

    
this.renderPage = function(layers){

  xsl = this.getXsl("xsl/page.xsl"); // may load from outside the asset folder
  for(var i = 0 ; i < layers.length ; i++){
     this.renderLayer(xsl,layers[i].name,layers[i].elementid);  
  }
  
 
}

this.renderLayer = function(xsl,layer,elementid){
  

  xslparameters = new Array();
  if(layer!=undefined){
    xslparameters.push(new XSLParam("layer",layer));    
  }  
  renderHTML = xmlManager.transform(this.xml,xsl,xslparameters);
  this.render(elementid?elementid:layer, renderHTML); 
 
}

this.initEvents = function(){
  
  if( this.playerManager== undefined){
     alert("Error: Player manger is undefined.");
     return;
  }
    
  xsl = this.getXsl("xsl/events.xsl");
  xslparameters = new Array();
  renderHTML = xmlManager.transform(this.xml,xsl);

  document.getElementById("events").innerHTML = renderHTML; 

  try{  
  eval(document.getElementById("evalcode").innerHTML);
	}
  catch(e){
    alert("Fout bij het laden van de events.");
  }
  

  if(bol!=undefined && bol.getBroadcast()!=undefined){
        if(bol.getBroadcast().isLive()){
           this.initLiveEvents(bol.getBroadcast().name);
        }       
        else{
           this.initArchiveEvents(bol);
        }
  }

  
}

this.getBroadcastNode = function(){
   var ele=this.xml.getElementsByTagName('broadcast');
   
   return ele[0];
}


this.initArchiveEvents = function(bol){
  var offset = this.getParam("offset");
  if(offset!=undefined && parseInt(offset) != NaN){
    this.playerManager.go(offset);
  }

  	if(this.getBroadcastNode()!=undefined){
		var eventElements = this.xml.getElementsByTagName('event');
	    for( i = 0 ; i < eventElements.length;i++ ){
	       if(eventElements[i].getAttribute('time')!=undefined){
	          eventElements[i].setAttribute('eventtime',new Duration().validDuration(eventElements[i].getAttribute('time')).Seconds());
	       }
	       if(eventElements[i].getAttribute('duration')!=undefined){
	          eventElements[i].setAttribute('durationtime',new Duration().validDuration(eventElements[i].getAttribute('duration')).Seconds());
	       }
	       else{
	         eventElements[i].setAttribute('duration','PT0.000S');
	       }
	       
	       
	    }
	}
	
   this.eventHandler();
 }


this.initLiveEvents = function(broadcastName,lastEventId){


   try {
    if (typeof ActiveXObject == 'undefined'){
    netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
    }
   } catch (e) {
    
   }
   
  lastEventId=lastEventId==undefined?0:lastEventId;
//  url = "http://www.bestuuronline.nl:8080/NoterikEventSystem_Rss/regie.do?method=lastEventXML&broadcast.name="+broadcastName+"&event.id="+lastEventId+"&"+new Date().getTime();
  url = "xml/lastevents.xml";
  lastEventsXml = xmlManager.getDomFromFile(url);  
  xsl = this.getXsl("xsl/events.xsl");
  xslparameters = new Array();
  renderHTML = xmlManager.transform(lastEventsXml,xsl);  
  document.getElementById("events").innerHTML = renderHTML; 

  try{
  eval(document.getElementById("evalcode").innerHTML);  
  
  }
  catch(e){
    alert("Fout bij het laden van de events.");
  }
  
  if(bol!=undefined && bol.getBroadcast()!=undefined){
     lastEvents=bol.getBroadcast().events;
     for(var t=0;t< lastEvents.length;t++){
             if(lastEventId<event.id){
                lastEventId=parseInt(event.id);
             }

	   		 this.showEvent(lastEvents[t]);
     }  
   
  }

  if(this.playerManager.isEmbeded()==false){ // poll if this stream has no embeded events
      window.setTimeout(this.me+".initLiveEvents('"+broadcastName+"',"+lastEventId+")", (this.delay+30000));
  }


 
}

this.render = function(elementId,renderHTML){
// Make it possible to run javascript code inside the xsl templates  use defer attribute - <script defer="1"></script>
  if(document.createElement("script").canHaveChildren == null){
	  d = document.createElement("div"); 
	  d.innerHTML=renderHTML;
	  document.getElementById(elementId).innerHTML="";
	  document.getElementById(elementId).appendChild(d);
  }
  else{
  document.getElementById(elementId).innerHTML=renderHTML;   
  }

}

this.renderTransformation = function(elementId,xslfile,xslparameters,xml){
    
    xsl = this.getXsl(xslfile);
   	xslparameters.push(new XSLParam("assetfolder",this.assetFolder));
    if(xml!=undefined){
    this.render(elementId, xmlManager.transform(xml,xsl,xslparameters));
    }
    else{
    this.render(elementId, xmlManager.transform(this.xml,xsl,xslparameters));
    }
    
}



this.renderAgenda = function(activeTopicId){
  xsl = this.getXsl("xsl/agenda.xsl");
  xslparameters = new Array();
  if(activeTopicId!=undefined){
    xslparameters.push(new XSLParam("activeTopicId",activeTopicId));
  }  
  renderHTML=xmlManager.transform(this.xml,xsl,xslparameters);
  this.render("agenda", renderHTML);
 
}

this.renderDocument = function(){
  xsl = this.getXsl("xsl/document.xsl");
  renderHTML = xmlManager.transform(this.xml,xsl);
  
    this.render("documents", xmlManager.transform(this.xml,xsl));
 
}

this.renderSpeaker = function(activeSpeakerId){

  xsl = this.getXsl("xsl/speaker.xsl");
  xslparameters = new Array();
  if(activeSpeakerId!=undefined){
    xslparameters.push(new XSLParam("activeSpeakerId",activeSpeakerId));
    renderHTML = xmlManager.transform(this.xml,xsl,xslparameters);
  }  
  
    this.render("speaker", xmlManager.transform(this.xml,xsl,xslparameters));

 
}

this.renderPlayer = function(live){
  xsl = this.getXsl("xsl/video.xsl");
  xslparameters = new Array();
  renderHTML = xmlManager.transform(this.xml,xsl);
  this.render("video",renderHTML);
}

this.renderPresentation = function(presentationName,activeSlideNumber){

  xsl = this.getXsl("xsl/presentation.xsl");
  xslparameters = new Array();
  if(presentationName){
    xslparameters.push(new XSLParam("presentationName",presentationName));
  }
  if( activeSlideNumber){
   xslparameters.push(new XSLParam("activeSlideNumber",activeSlideNumber));
  }
    
   this.render("presentation",xmlManager.transform(this.xml,xsl,xslparameters))
}

this.renderComment = function(target, value){
  xsl = this.getXsl("xsl/comment.xsl");
  xmlDoc = xmlManager.getDom(); 
  node = xmlDoc.createElement("event");
  node.setAttribute("value",value); 
  xmlDoc.appendChild(node);
  renderHTML = xmlManager.transform( xmlDoc,xsl);
  target.innerHTML = renderHTML; 
 
}

// EVENTS
/*

if(event.type == "skip"){	  
	 
alert(event.type);
	     if( event.time != undefined && event.duration!=undefined){ 
   			     for(var y ; y < this.eventtypes.length;y++){
   			       if(this.eventtypes[y].type=="skip"){
   			            this.eventtypes[y].id=-1;
   			         }
   			     }
			     this.playerManager.go(event.time.Seconds()+event.duration.Seconds());

	     }
	     
	     
	  }else
*/

this.getEvent = function (id){

 var eventElements = this.xml.getElementsByTagName("event");

 for(i = 0 ; i < eventElements.length;i++){
     var node=eventElements[i];
	 if(node.getAttribute("id")==""+id){	    
	   return node;
     }
}

}

this.showEventElement=function(pos, eventElement){


	     if(eventElement==undefined){
	      eventElement = this.getBroadcastNode().getElementsByTagName('event')[pos-1];
	     }
		       var event = new Object();
		       event['value']="";	
			   this.recurseChild(event,eventElement);
		   this.showEvent(event);
	     		 


}


this.hideEvent=function(pos, event){

this.showEventElement(pos,event);

}



this.showEvent=function(event){

 try{
    

  	  if(event.type == "slide"){	  
         
	     if(event.value != undefined && event.value.substring(0,4) == "hide" ){
      		 this.renderPresentation(); //hide slide
			 return;
		 }

         if(event.presentation != undefined && event.slide !=undefined){
 			this.renderPresentation(event.presentation.name,event.slide.number);
			
         }
         else if(event.presentation != undefined ){
               this.renderPresentation(event.presentation.name); 
         }

	  }

	 else if(event.type == "speaker"){
         
         if(event.value != undefined && event.value.substring(0,4) == "hide" ){
      		 this.renderSpeaker(); //hide 
			 return;
		 }
	     if( event.speaker != undefined ){	  	  
	             this.renderSpeaker(); //hide
		 	     this.renderSpeaker(event.speaker.id); 
		 }
		 
	  }
	 
	
	  else if(event.type == "topic"){

	      

	     if(    event.topic != undefined && event.topic.id != undefined && (event.value.substring(0,4) != "hide" ) ){	  	  
		 	    this.deactivateAllNodes(document.getElementById("agenda"),event.type);
		 	    this.activateNode(document.getElementById("topic_"+event.topic.id),event.type);
		 	    //this.renderAgenda(event.topic.id);
		 }
		 else{
 		 	    this.deactivateAllNodes(document.getElementById("agenda"),event.type);
		       //  this.renderAgenda();
		 }
		 
	  }
	  
	  
	  else if(event.type == "control"){	  
	     if(event.value="reinit"){
	         this.xml = new XmlManager().getDomFromFile("xml/asset.xml");
	         this.renderAgenda(  );
	         this.initEvents(playerManager,'eventManager');
	          
	     }
  	  
  	  }

	 else if(event.type == "skip"){	  
	 

             var pos = this.playerManager.getPosition();
             var newpos = (parseInt(event.eventtime))+ (parseInt(event.durationtime));

             if( (parseInt(pos)+10000) < newpos){  // give the keyframe a chance
			     this.playerManager.go( newpos );
			  }
	     
	     
	  }
	  	  
	  else {
	     //value event
	      
	      this.renderComment(document.getElementById(event.type),event.value);
	     	 
	  }
	 
	}
	catch(e){
	 alert(e.message);
	}
}

this.activateNode=function(node, type){

		if(node){
				node.className = "active"+type;
		}	
		        
        
	}
	
this.deactivateAllNodes = function(node,type){
								if(node.className == ("active"+type)){
									node.className = type;
								}
								var child = node.firstChild;
								while(child != null){
									this.deactivateAllNodes(child,type);
									child = child.nextSibling;
								}
}	






this.eventHandler =function() {

        try{ 
        



		    if(this.playerManager.getPosition() != undefined && this.playerManager.getPlayState()>1){
	            var pos = this.playerManager.getPosition();
				var roundedPos = Math.round(pos/1000)*1000;
				var xslparameters = new Array();
		 		xslparameters.push(new XSLParam("eventtime",roundedPos));
			    this.renderTransformation("hidden","xsl/eventHandler.xsl",xslparameters);
            }
		  }  
		  catch(e){
		    //alert(e);
		  }

	      window.setTimeout(this.me+".eventHandler()", 1000);

}	
	

this.onPositionChange = function(oldPos,newPos){
 getLastEvents(parseInt(newPos));
}

function getLastEvents(pos){

    var xslparameters = new Array();
    xslparameters.push(new XSLParam("eventtime",pos*1000));
    manager.renderTransformation("hidden","xsl/eventHandlerInit.xsl",xslparameters);  
  
}
	
	
//OTHER


this.recurseChild = function(event, element){

var attr;
var child;
     if(element.attributes!=undefined){
		  for (var i=0; i<element.attributes.length; i++){
                    attr = element.attributes[i];
			  // eval("event."+events.attributes.name+" = undefined;";
   			  if( (attr.name=="time" || attr.name=="duration") && attr.name.indexOf("PT")>-1 ){
   			     event[attr.name]=new Duration().validDuration(attr.value);            
   			  }
   			  
   			  else{
   			   event[attr.name]=attr.value;            
   			  }
			}

		}


		   for (var i=0; i<element.childNodes.length; i++){
				   	    child = element.childNodes[i];
		                event[child.nodeName]=new Object();
		    			this.recurseChild(event[child.nodeName],child);
				}

}



this.switchDisplay = function(targetId){
	target=document.getElementById(targetId);
	targetToggleID = targetId.split("_");
	toggleID = "togglespeakers_"+targetToggleID[1];

	if (target.style.display == 'block') 	{
		target.style.display  = "none"; // hide dropdown
		document.getElementById(toggleID).className = "itemTogglePlus";
	}
	else{
	    target.style.display  = "block"; // hide dropdown
	    document.getElementById(toggleID).className = "itemToggleMin";
	}

}




this.getParam =function(name){

  var start=location.search.indexOf("?"+name+"=");
  if (start<0) start=location.search.indexOf("&"+name+"=");
  if (start<0) return '';
  start += name.length+2;
  var end=location.search.indexOf("&",start)-1;
  if (end<0) end=location.search.length;
  var result=location.search.substring(start,end);
  var result='';
  for(var i=start;i<=end;i++) {
    var c=location.search.charAt(i);
    result=result+(c=='+'?' ':c);
  }
  return unescape(result);
}
	
	


}	 
	 
	 
