// 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('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){
  
alert(elementid?elementid:layer);
  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.initArchiveEvents = function(bol){
  var offset = this.getParam("offset");
  if(offset!=undefined && parseInt(offset) != NaN){
    this.playerManager.go(offset);
  }

  if(bol!=undefined && bol.getBroadcast()!=undefined){
     this.events=bol.getBroadcast().events;
     for(var t=0;t< this.eventtypes.length;t++){
			 eventtype = this.eventtypes[t].type;	 
			 this.events.unshift(new Event(eventtype,""));
     }  

//        eventHandlerPoll(this.me);
      window.setTimeout(this.me+".eventHandlerPoll()", 1000);
  }


 
}

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.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(presentationId,activeSlideId){

  xsl = this.getXsl("xsl/presentation.xsl");
  xslparameters = new Array();
  if(presentationId){
    xslparameters.push(new XSLParam("presentationId",presentationId));
  }
  if( activeSlideId){
   xslparameters.push(new XSLParam("activeSlideId",activeSlideId));
  }
    
   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
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.id,event.slide.number);
			
         }
         else if(event.presentation != undefined ){
               this.renderPresentation(event.presentation.id); 
         }

	  }

	 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 {
	     //value event
	    
	      this.renderComment(document.getElementById(event.type),event.value);
	     	 
	  }
	}
	catch(e){
	
	
	}
}

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(pos) {
		var eventtype;
		var event;

			if ( pos != undefined ){ 
			pos=parseInt(pos);		   
			for(var t=0;t< this.eventtypes.length;t++){
			 eventtype = this.eventtypes[t].type;	 
		      for(var i = this.events.length-1;i>=0; i--){
			    event = this.events[i]; 		
				if(event.type==eventtype && event.time.Seconds() <= pos+1 ){
				   if(eventtypes[t].id != event.id){
				       this.showEvent(event);
				   }
		   		   eventtypes[t].id = event.id;		   		   
				   i=-1;//exit loop		  
				}
			 }
		   }
		   
		  }

	}
	
	
	
	
//OTHER




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);
}
	
	
this.eventHandlerPoll = function(){

  try{ 
	  if(this.playerManager.getPosition() != undefined && this.playerManager.getPlayState()>1){
	     this.eventHandler(this.playerManager.getPosition());
	  }

  }  
  catch(e){
    //alert(e);
  }


  window.setTimeout(this.me+".eventHandlerPoll()", 100);
  
}


}	 
	 
	 
