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

var beacon=-1;
var lastbeacontime=0;

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


function EventManager(xml,assetFolder, frameworkappUrl){
    var livedelay= 30000;
    var archivedelay= 30000;    
    var events;
    var playerManager;
    var me="eventManager";
    var xslMap = new Object();
    var eventsXml;
    var lasteventsUrl;
    var lasteventId=-1;
    var lastEventPosition=0;;
    var live;
    

    
    this.xml = xml;
    this.eventsXml = eventsXml;
    this.lastEventPosition = lastEventPosition;
    this.assetFolder = assetFolder;
    this.me = me;
    this.events = events;
    this.livedelay = livedelay;    
    this.archivedelay = archivedelay;    
    this.lasteventsUrl = lasteventsUrl;
    this.lasteventId = lasteventId;
    this.live = live;
	

    
     this.frameworkappUrl = frameworkappUrl!=undefined?frameworkappUrl:getCookie("frameworkappUrl");
    //constructor
    
    frameworkappUrl = this.frameworkappUrl;	
    setCookie("frameworkappUrl",   frameworkappUrl );
	//end

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

this.renderInterface = function(pageXml){

  
  if(pageXml != null ){
   
  layers = pageXml.getElementsByTagName("xhtmlcontent");
  
 

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

   if(docElement != undefined && content != undefined){
          
        docElement.innerHTML=content;
        
   }
  }
  
 javascript = pageXml.getElementsByTagName("javascript")[0];
  if(javascript!=undefined){

        eval(xmlManager.getStringFromDom(javascript.firstChild));
  }

  }

}


   
this.getBroadcastNode = function(){
   var ele;
   if(this.xml!=undefined){
     ele = this.xml.getElementsByTagName("broadcast")[0];
   }
   return ele;
   

}
 
 
this.initLiveEvents = function(lasteventsUrl, streamname){

this.lasteventsUrl=lasteventsUrl;
this.streamName = streamname;
this.live = true;
var func =    "xmlManager.getDomFromUrl('"+manager.lasteventsUrl+"?"+new Date().getTime()+"',manager.getLastEventsCallback)" ;
window.setTimeout(func,30000); // check for new events each 30 sec

}
this.getLastEventsCallback = function(resp){
 
       if(manager.streamName!=undefined){
	         var streams = resp.getElementsByTagName('stream');
	         for(var i=streams.length-1;i>=0;i--){
	      
	            if(streams[i].getAttribute("name") != manager.streamName){
	                      streams[i].parentNode.removeChild(streams[i]);
	         	}
	         }
       	}
       	
     
       	manager.showEvent(resp);
     
       
        if(beacon==-1){  // no embeded events yet
           window.status="Got events: "+ new Date();           
           var func =    "xmlManager.getDomFromUrl('"+manager.lasteventsUrl+"?"+new Date().getTime()+"',manager.getLastEventsCallback)" ;
           window.setTimeout(func,30000); // check for new events each 30 sec
        
        }
        else{
         window.status="Using embeded events.";
         manager.checkBeacon();
        }
	
}

this.checkBeacon = function(){
    var time= new Date().getTime();
    
    

    if(  (time-lastbeacontime)>30000 ){
            
            beacon=-1; // error in embeded events try to fallback
            xmlManager.getDomFromUrl(manager.lasteventsUrl+"?"+time,manager.getLastEventsCallback) ;
    }
    
    
    else if(manager.lasteventId!=undefined && manager.lasteventId!=NaN &&  manager.lasteventId<beacon  ){
    
            beacon=-1; // error in embeded events try to fallback this happends when the video is buffering and the event didn't come in
            xmlManager.getDomFromUrl(manager.lasteventsUrl+"?"+time,manager.getLastEventsCallback) ;
    
    }
    
    else{
	window.setTimeout("manager.checkBeacon()",30000); // check incoming events each 30 sec
   }

}


this.initArchiveEvents = function(eventsXml, streamname){

  this.eventsXml=eventsXml;
  this.live = false;
  streamname==undefined?"default":streamname;

  
  var sync = isNaN(parseInt(this.getParam("sync")))?0:parseInt(this.getParam("sync"));
  
  

  	if(this.eventsXml!=undefined){
		var eventElements = this.eventsXml.getElementsByTagName('event');
		var topic;
		var ref;
		var nexttime;
		var d = new Duration();
		var xslparameters = new Array();
		xslparameters.push(new XSLParam("streamname",streamname));
		  

	    for( var  i = 0 ; i < eventElements.length;i++ ){
	       
	    
	       
	       if(eventElements[i].getAttribute('time')!=undefined){
	          eventElements[i].setAttribute('eventtime',d.validDuration(eventElements[i].getAttribute('time')).Seconds()+sync);
		  
	       }
	        if(eventElements[i].getAttribute('duration')!=undefined && eventElements[i].getAttribute('duration')!="" && d.validDuration(eventElements[i].getAttribute('duration')).Seconds() > 0 ){	       
	          eventElements[i].setAttribute('durationtime',d.validDuration(eventElements[i].getAttribute('duration')).Seconds()+sync);
	       }else{
	          eventElements[i].removeAttribute("duration");
	          eventElements[i].removeAttribute("durationtime");	          
	       }
	    }  





	   
	    	    
	    this.eventsXml= xmlManager.transform(this.eventsXml, this.getXsl("xsl/sortevents.xsl"),xslparameters,true);
	    
	    eventElements = this.eventsXml.getElementsByTagName('event');
	    

	    
	     for( var i = 0 ; i < eventElements.length;i++ ){
	       
	       eventElements[i].setAttribute('id',i);
	       
	      if(eventElements[i].getAttribute('duration')==undefined){	       
	         
	          //find next time
	         durationtime=86400000;//24hours
	         for(var t = i+1 ; t < eventElements.length;t++ ){
	            if(eventElements[t].getAttribute('type')==eventElements[i].getAttribute('type')){
	              nexttime = d.validDuration(eventElements[t].getAttribute('time')).Seconds()+sync;
	              durationtime = nexttime - parseInt(    eventElements[i].getAttribute("eventtime")   );
	              t=eventElements.length;

	            }
	         }

	         eventElements[i].setAttribute('durationtime',durationtime);
			 
	       }
	       
	         
	        
	       
	      
	       
	    }  

	   
        this.eventsXml= xmlManager.transform(this.eventsXml, this.getXsl("xsl/addhidetoevents.xsl"),xslparameters,true);

	      
	   


	      
	      this.events=this.eventsXml.getElementsByTagName('event');
	      this.eventHandler();
	}
	
	

//   window.setInterval("manager.eventHandler()",1000);
 }



  






this.eventHandler =function() {

        try{ 
        



		    if( this.lastEventPosition < manager.events.length && this.playerManager!=undefined && this.playerManager.getPosition() != undefined && this.playerManager.getPlayState()==3){

              
	            var pos = this.playerManager.getPosition();
				var roundedPos = Math.round(pos/1000)*1000;
				var eventPos = parseInt(manager.events[this.lastEventPosition].getAttribute("eventtime"));
				 
				if(roundedPos>=eventPos){
					
					var	 eventDoc = xmlManager.getDom();
					var root = eventDoc.createElement("root");
					root.appendChild(manager.events[this.lastEventPosition].cloneNode(true));					
					eventDoc.appendChild(root);
					manager.showEvent(eventDoc);				 
					this.lastEventPosition++;

					manager.eventHandler();
					
					
					
					return;
				}

            }
		  }  
		  catch(e){
		    alert(e.message);
		  }

	      window.setTimeout("manager.eventHandler()", 1000);

}	
	

this.onPositionChange = function(oldpos,pos){

   this.lastEventPosition=10000000;


     var posEvents;
   
   /*
    if(oldpos!=undefined){
    oldpos=Math.round(oldpos);
    xslparameters = new Array();
    xslparameters.push(new XSLParam("eventtime",oldpos*1000));    
    xslparameters.push(new XSLParam("oldpos","true"));     
    transform= xmlManager.transform(this.xml, this.getXsl("xsl/eventHandlerInit.xsl"),xslparameters,true);
    this.showEvent(transform);
    }
    
    */
    
    
    pos=Math.round(pos);
    var xslparameters = new Array();
    xslparameters.push(new XSLParam("eventtime",pos*1000));
    transform = xmlManager.transform(this.xml, this.getXsl("xsl/eventHandlerInit.xsl"),xslparameters,true);
    this.showEvent(transform);
    
    for(var i=0;i<this.events.length;i++){
      this.lastEventPosition=i;
      if(this.events[i].getAttribute("eventtime")>pos*1000){
        i=this.events.length;
      }
    }
    

    
    

    

 
}


this.render = function(elementId,renderHTML){

// Make it possible to run javascript code inside the xsl templates  use defer attribute - <script defer="1"></script>
 if(renderHTML!=undefined){
  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;   
  
  }
  }
  return renderHTML;
}

this.renderTransformation = function(elementId,xslfile,xslparameters,xml){
    
    xsl = this.getXsl(xslfile);
    if(xml!=undefined){
    return this.render(elementId, xmlManager.transform(xml,xsl,xslparameters));
    }
    else{
    return this.render(elementId, xmlManager.transform(this.xml,xsl,xslparameters));
    }
    
}




// EVENTS

this.showEvent=function(eventXml){


  
	var events = eventXml.getElementsByTagName("event");
	var type;
	var value;
	var event;
	var eventDoc;
    var hide=false;
    


    
		for(var i = 0 ; i<events.length;i++){
	 		 
	      try{ 
	 		 event = events[i];
			 type = event.getAttribute("type");
			 value = event.getAttribute("value");
			 
			 lasteventId = parseInt(event.getAttribute("id"));
			 eventDoc = xmlManager.getDom();
			 root = eventDoc.createElement("root");
			 root.appendChild(event.cloneNode(true));
			 eventDoc.appendChild(root);
			 
			 if(eventDoc.getElementsByTagName("hide")[0]==undefined){
		      hide=false;
		     }
		     else{
		      hide=true;
		     }
			

			

			
			if(isNaN(lasteventId) || this.lasteventId<lasteventId ) {
			 
			
	 			if( this.live ){
				   this.lasteventId=lasteventId;
				}
				 
				 if(type=="hideall"){
				  
				    document.getElementById("comment").innerHTML="";
				    document.getElementById("speaker").innerHTML="";				    
				    this.deactivateAllNodes(document.getElementById("agenda"),"topic");
				 }				  
				 
				 else if(type=="topic"){
				    this.deactivateAllNodes(document.getElementById("agenda"),type);
				    
				    if(hide==false){
				    
				   
				       
				        //moveTo("info_agenda","event_"+event.getAttribute("eventtime"));
						var container = "info_agenda";
						var element = "event_"+event.getAttribute("id") ;
						if(this.live==true){
						   element = "topic_"+event.getElementsByTagName("topic")[0].getAttribute("id") ;
						}
						
						 
						 
 					    this.activateNode(document.getElementById(element), type );
 					    
						container_y = Position.cumulativeOffset($(container))[1]
						element_y = Position.cumulativeOffset($(element))[1]
							
						new Effect.Scroll(container, {x:0, y:(element_y-container_y)}); 
						//new Effect.Highlight('tabAgenda',{duration:2.5})
						
						new Element.setOpacity('tabAgenda',0); 
					    new Effect.Appear('tabAgenda');
						
				    }
				 }
				 else if(type=="speaker"){
				           
				       		 
							 var xslparameters = new Array();
	  				         xslparameters.push(new XSLParam("assetFolder",this.assetFolder));
	  				         //alert(this.assetFolder);
	  				         
	  				         if(this.assetFolder.indexOf("hda") == -1){
	  				         	  				             
				       		 	manager.renderTransformation('speaker','xsl/speaker.xsl',xslparameters,eventDoc );   
							}else{
								manager.renderTransformation('speaker','xsl/school.xsl',xslparameters,eventDoc );
							}
				       		 
				       		 
							 this.deactivateAllNodes(document.getElementById("agenda"),type);
							  if(hide==false){
					       		new Element.setOpacity('speaker',0); 
					       		new Effect.Appear('speaker');	
					       		if(this.live==false){
				       		      this.activateNode(document.getElementById("event_"+event.getAttribute("id")), type );
				       		    }
				       		 }
				       		 else{
				       			
				       		 }
				       		 				       
			       		 
			       		 
				 }
				 else if(type=="eventcatcherslide"){
				           
				       		 alert("Slide event");
							 var xslparameters = new Array();
	  				         xslparameters.push(new XSLParam("assetFolder",this.assetFolder));    
				       		 manager.renderTransformation('slide','xsl/slide.xsl',xslparameters,eventDoc )   ;   

				       		 
				       		 
							 this.deactivateAllNodes(document.getElementById("agenda"),type);
							  if(hide==false){
					       		//hide agenda div
					       		//show slide div	
					       		
				       		 }
				       		 else{
				       			
				       		 }
				       		 				       
			       		 
			       		 
				 }
				 else if(type=="comment"){
                 
                      if(hide==true){
                      document.getElementById(type).innerHTML="";
                      }
                      else{

                         manager.renderTransformation('comment','xsl/comment.xsl',new Array(),eventDoc )   ;
			       		
			       		 Element.setOpacity(type,0); 
			       		 Effect.Appear(type);	
			       		 
                       }
				 
				 }
				 
			 
			
			}  
			  
			}	 
			catch(e){

 
				window.status=e.message;
			}
			
		}
	
	
	    eventXml=undefined;
	
		window.status="idle ";

}


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;
								}
}	

	
	
	
//OTHER




this.switchDisplay = function(targetId){
 
	target=document.getElementById(targetId);
	toggle = document.getElementById("toggle_"+targetId);

	if (target.style.display == 'block') 	{
		target.style.display  = "none"; // hide dropdown
		toggle.className = "itemTogglePlus";
	}
	else{
	    target.style.display  = "block"; // hide dropdown
	    toggle.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);
}
	
	


}	 

// uses effects and prototype.xsl

Effect.Scroll = Class.create();
Object.extend(Object.extend(Effect.Scroll.prototype, Effect.Base.prototype), {
  initialize: function(element) {
    this.element = $(element);
    var options = Object.extend({
      x:    0,
      y:    0,
      mode: 'absolute'
    } , arguments[1] || {}  );
    this.start(options);
  },
  setup: function() {
    if (this.options.continuous && !this.element._ext ) {
      this.element.cleanWhitespace();
      this.element._ext=true;
      this.element.appendChild(this.element.firstChild);
    }
   
    this.originalLeft=this.element.scrollLeft;
    this.originalTop=this.element.scrollTop;
   
    if(this.options.mode == 'absolute') {
      this.options.x -= this.originalLeft;
      this.options.y -= this.originalTop;
    } else {
   
    }
  },
  update: function(position) {   
    this.element.scrollLeft = this.options.x * position + this.originalLeft;
    this.element.scrollTop  = this.options.y * position + this.originalTop;
  }
});	 
	 
