// import formatter.js
// import bolmodel.js


function Layer(name,elementid){
  this.name=name;
  this.elementid=elementid;
}

function Duration(pm, years, months, days, hours, minutes, seconds, fraction){
		 
	var giYearMill = 31536000000;	var giMonthMill = 2592000000;
	var giDayMill = 86400000;	var giHourMill = 3600000;
	var giMinMill = 60000;	var giSecMill = 1000;

	this.pm = pm;
	this.years = (years?years:0)*1;
	this.months = (months?months:0)*1;
	this.days = (days?days:0)*1;
	this.hours = (hours?hours:0)*1;
	this.minutes = (minutes?minutes:0)*1;
	this.seconds = (seconds?seconds:0)*1;
	this.fraction = fraction*1;
	if(fraction != undefined){
	   this.milliseconds = eval('0.'+fraction) * 100;
	}
	else {
	   this.milliseconds = 0;
	}
	this.mask = ((this.years?1:0)<<6) + ((this.months?1:0)<<5) + ((this.days?1:0)<<4) + ((this.hours?1:0)<<3) + ((this.minutes?1:0)<<2) + ((this.seconds?1:0)<<1) + (this.milliseconds?1:0);
	this.Seconds = function(){
	          if (this.years || this.months){
			          return Number.NaN;
			  }	
		
		return (this.days*giDayMill + this.hours*giHourMill + this.minutes*giMinMill + this.seconds*giSecMill)*(this.pm=="-"?-1:1);

	}
	
	
	this.validDuration = function(d){
        var parts;
        var re = new RegExp("^([\-])?P(([0-9]+)Y)?(([0-9]+)M)?(([0-9]+)D)?((T)?(([0-9]+)H)?(([0-9]+)M)?((([0-9]+)(\.([0-9]+))?)S)?)?$");
        if (parts = re.exec(d)){
                
                if ((/T$/.exec(d)) || (parts[9] == "T" && parts[11]+parts[13]+parts[16]+parts[18]== ""))// ~(:+(|) duh!!!
                       return Number.NaN;
                return new Duration(parts[1]?parts[1]:"", parts[3], parts[5], parts[7], parts[11], parts[13], parts[16], parts[18]);				
        }
        return Number.NaN;
	 }	 
	 
	 this.formatDuration = function(du){
		if (typeof(du) == "object"){
			var pm = du.pm;
			var y = du.years;
			var m = du.months;
			var d = du.days;
			var h = du.hours;
			var n = du.minutes;
			var s = du.seconds + du.milliseconds/1000;
			
			if (y+m+d+h+n+s == 0)
				return 'P0S';
			return pm + "P" + 
					(y!=0?y + "Y":'') + 
					(m!=0?m + "M":'') + 
					(d!=0?d + "D":'') + 
					(h+n+s!=0?"T":'') +
					(h!=0?h + "H":'') + 
					(n!=0?n + "M":'') + 
					(s!=0?s + "S":'');
		}else{
			var pm = (du<0?'-':'');
			du = Math.abs(du);
			var d = Math.floor((du) / giDayMill);
			var h = Math.floor((du % giDayMill) / giHourMill);
			var n = Math.floor((du % giHourMill) / giMinMill);
			var s = Math.floor((du % giMinMill) / giSecMill) + (du % giSecMill)/1000;
			if(du==0){
			return pm + "PT0.000S" ;
			}
			else{
			return pm + "P" + 
					(d!=0?d + "D":'') + 
					(h+n+s!=0?"T":'') +
					(h!=0?h + "H":'') + 
					(n!=0?n + "M":'') + 
					(s!=0?s + "S":'');
			}
		}
}	

}

function EventManager(xml,assetFolder){
    var delay=500;
    var events = new Array();
    var playerManager;
    var me="eventManager";
    var xslMap = new Object();


	this.xml = xml;
	this.assetFolder = assetFolder;
    this.me = me;
	

    

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.getBroadcastNode = function(){
   var ele=this.xml.getElementsByTagName('broadcast');
   
   return ele[0];
}


this.initEvents = function(){
  
  if( this.playerManager== undefined){
     alert("Error: Player manger is undefined.");
     return;
  }
    
  


        if(this.getBroadcastNode().getAttribute("end")!=undefined){
           this.initArchiveEvents();
        }       
        else{
           this.initLiveEvents(this.getBroadcastNode().getAttribute("name"));
        }


  
}



this.initArchiveEvents = function(){
  var offset = this.getParam("offset");

  if(offset!="" ){
    this.playerManager.go(offset);
  }
  else{
  this.playerManager.go(1);
  }
  
  
  	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');
	       }
	       
	       eventElements[i].setAttribute('id',i);
	    }
	}
	
   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, eventElement){

 try{
  
  if(eventElement==undefined){
	      eventElement = this.getBroadcastNode().getElementsByTagName('event')[pos-1];
   }
  
  var type = eventElement.getAttribute("type");
  var value  =  eventElement.getAttribute("value");

  	  if(type == "slide"){	  
         
	  		 this.renderPresentation(); //hide slide
			 return;
	  }

	 else if(type == "speaker"){
         
      		 this.renderSpeaker(); //hide 
			 return;
	  }
	 
	
	  else if(type == "topic"){

		    this.deactivateAllNodes(document.getElementById("agenda"),type);
	 }
	  
	 else if(type == "skip"){	  
	 
            if(value=="hideMediaPlayer"){
             this.playerManager.show();                 
               
            }
            else if(value=="hideAndMuteMediaPlayer"){
             this.playerManager.mute(false);  
             this.playerManager.show();                              
            } 
            else if(value=="muteMediaPlayer"){
             this.playerManager.mute(false);  
             }
            
	     
	     
	  }
	  	/*
	 else if(type == "questionform"){	    
	      this.renderTransformation("questionform","xsl/questionform.xsl",new Array());            	  
	 }
	 */
	 
	  else if(type == "comment") {
	     //value event
	      
	      this.renderComment(document.getElementById(type),"");
	     	 
	  }
	  
	}
	catch(e){
	 alert(e.message);
	}

}



this.showEvent=function(event){


    

  	  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 == "questionform"){	  
	   // check accreditation
	      var xslparameters = new Array();
          xslparameters.push(new XSLParam("questionformTitle",event.questionform.title));
	      this.renderTransformation("questionform","xsl/questionform.xsl",xslparameters);            	  
  	  }
  	  */
  	  
	 else if(event.type == "skip"){	  
	 

             var pos = this.playerManager.getPosition();
             var newpos = (parseInt(event.eventtime))+ (parseInt(event.durationtime));
			
			if(event.value=="hideMediaPlayer"){
			 this.playerManager.hide("images/novideooraudio.jpg");                           
            }
			else if(event.value=="hideAndMuteMediaPlayer"){
             this.playerManager.mute();  
			 this.playerManager.hide("images/novideooraudio.jpg");               
            } 
			else if(event.value=="muteMediaPlayer"){
             this.playerManager.mute();  
            }
            else{
             if( (parseInt(pos)+10000) < newpos){  // give the keyframe a chance
			     this.playerManager.go( newpos );
			  }
			}
	     
	     
	  }
	  	  
	  else {
	     //value event
	      var target  = document.getElementById(event.type);
	      if(target){
	        this.renderComment(target,event.value);
	      }
	     	 
	  }
	  try{
	}
	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()==3){

	            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(Math.round(oldPos),Math.round(newPos));
}

function getLastEvents(oldpos, pos){
 
    
    xslparameters = new Array();
    xslparameters.push(new XSLParam("eventtime",oldpos*1000));    
    xslparameters.push(new XSLParam("oldpos","true"));
    manager.renderTransformation("hidden","xsl/eventHandlerInit.xsl",xslparameters);      

    var xslparameters = new Array();
    xslparameters.push(new XSLParam("eventtime",pos*1000));
    manager.renderTransformation("hidden2","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);
}
	
	


}	 
	 
	 
