var CueManager = {

  pollStartTime: 0,
  pollInterval: 1000, // default to 1 second
  cueLoadScript: "",

  cueChangedMethod: false,
  currentCueData: false,
  currentCatNum: 0,
  currentClipNum: 0,
  cueCache: {},
  debugFlag: false,

  debug: function(text) {
    if (CueManager.debugFlag) {
      if (typeof(console) != 'undefined')
      	console.log("CUEMANAGER: "+text);
    }
  },
  
  start: function(params) {
  	
  	if (params.debugFlag)
      CueManager.debugFlag = params.debugFlag;
      	  	
    if (params.cueChangedMethod)
      CueManager.cueChangedMethod = params.cueChangedMethod;
    else
      CueManager.debug("No cueChangeMethod passed to CueManager.start");
    if (params.pollInterval)
      CueManager.pollInterval = params.pollInterval;
    if (params.cueLoadScript)
      CueManager.cueLoadScript = params.cueLoadScript;
    if (params.clipID)
      CueManager.currentClipNum = params.clipID;
    if (params.showCatID)
      CueManager.currentCatNum = params.showCatID;
    if (params.cueData)
    {
    	CueManager.debug("Preload cueData in CueManager.start");
    	
    	// pass json instead of using xhr to load it
    	CueManager._loadCueData(CueManager.currentClipNum, CueManager.currentCatNum, params.cueData);
    }
        
    var now = new Date();
    CueManager.pollStartTime = now.getTime()/1000;
    CueManager.initialCheck();
    setTimeout("CueManager._poller()", CueManager.pollInterval);
  },
  
  initialCheck: function() {
    CueManager._checkClip(0);
  },
  
  _poller: function() {
        
    if (typeof(cwPlayer) != 'undefined' && cwPlayer) {    	
        var curPos = 0;
        CueManager.debug("cwPlayer.playingAd=" + cwPlayer.playingAd);
        if ( typeof(cwPlayer.playingAd) == 'undefined' || cwPlayer.playingAd == false )
        {
            curPos = cwPlayer.player.CurrentPosition();
            CueManager.debug("CurrentPosition="+curPos);
        }
        CueManager._checkClip(curPos);
    }
    else
    {
	var now = new Date();
	var curTime = now.getTime()/1000;
	curPos = curTime - CueManager.pollStartTime;    	
	CueManager._checkClip(curPos);
    }
    
    setTimeout("CueManager._poller()", this.pollInterval);
  },
  
  _checkClip: function(curPos) {
    CueManager.debug("checking cat:" + CueManager.currentCatNum + " clip:" + CueManager.currentClipNum + " pos: " + curPos);
    var cueData = CueManager._getCueData(CueManager.currentClipNum, CueManager.currentCatNum, curPos);
    
    CueManager.debug("cueData="+cueData);
        
    if ((cueData != false) && (cueData != CueManager.currentCueData)) {
      CueManager.currentCueData = cueData;
      if (CueManager.cueChangedMethod)
        CueManager.cueChangedMethod(cueData);
    }
  },
  
  _getCueData: function(clipNum, catNum, pos) {
	CueManager.debug("_getCueData(" + clipNum + "," + pos + ")");
    
    var cueData = false;
    var cueSlot = CueManager.cueCache[clipNum];
    if (cueSlot) {
      CueManager.debug("loaded: " + cueSlot.loaded);
      if (cueSlot.loaded) {
        CueManager.debug("lastCue: " + cueSlot.lastCue);
        CueManager.debug("cues: " + cueSlot.cues);
      
        // quick check to if same as last cue
        if (cueSlot.lastCue && ((cueSlot.lastCue.start <= pos) && (cueSlot.lastCue.end >= pos))) {
          cueData = cueSlot.lastCue.cueData;
        }
        else {
          // do a linear search, aborting after the first future cue is found
          var cues = cueSlot.cues;
          for (var i=0; i<cueSlot.cues.length; i++) {
            var cue = cueSlot.cues[i];
            if (cue.start <= pos) {
              if (cue.end >= pos) {
                cueData = cue.cueData;
                cueSlot.lastCue = cue;
                break;
              }
            }
            else
              break;
          }
        }
      }
      else {
        // $$$ do we need to timeout old cache load requests here?
      }
    }
    else {
    	// load via xhr
		CueManager._loadCueData(clipNum, catNum, null);
    }
    
    return cueData;
  },

  _loadCueData: function(clipNum, catNum, cueData) {
    CueManager.debug("_loadCueData(" + clipNum + ","+catNum+ ","+cueData+")");
    CueManager.currentClipNum = clipNum;	// swf
    CueManager.currentCatNum = catNum;		// swf
    
    CueManager.cueCache[clipNum] = {};
    CueManager.cueCache[clipNum].loaded = false;
    CueManager.cueCache[clipNum].cues = [];
    CueManager.cueCache[clipNum].lastCue = false;
    
    if ( cueData )
    {
    	CueManager._cueSetData(clipNum, cueData);
    }
    else
    {
			
		var req = false;
		if ( window.XMLHttpRequest ) {
		  try {
			req = new XMLHttpRequest();
		  }
		  catch(e) {
			req = false;
		  }
		}
		else if (window.ActiveXObject) {
		  try {
			req = new ActiveXObject("Msxml2.XMLHTTP");
		  }
		  catch(e) {
			try {
			  req = new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch(e) {
			  req = false;
			}
		  }
		}
	
		if (req) {
		  CueManager.debug("getting cues");
		  //req.clipNum = clipNum;
		  req.onreadystatechange = function() {
			if (req.readyState == 4) {
			  CueManager._cueDataLoaded(CueManager.currentClipNum, req);
			}
		  }
		  req.open("GET", "/cw-video/getcues-p3/" + escape(clipNum) + "/" + escape(catNum), true);
		  req.send("");
		}
	}
	
  },

  _cueDataLoaded: function(clipNum, resp) {
    CueManager.debug("_cueDataLoaded(" + clipNum + ", " + resp.status + ")");
    if (resp.status == 200) {
      if (!CueManager.cueCache[clipNum].loaded) {
		
        CueManager.cueCache[clipNum] = {};
        CueManager.cueCache[clipNum].loaded = true;
        try {
          	CueManager.cueCache[clipNum].cues = eval(resp.responseText);
          	CueManager.initialCheck();
        }
        catch (e) {
          CueManager.debug("Bad cue cache load response: " + e);
          CueManager.cueCache[clipNum].cues = [];
        }
      }
    }
  },
  
  _cueSetData: function(clipNum, cueData) {
    
	CueManager.cueCache[clipNum] = {};
	CueManager.cueCache[clipNum].loaded = true;
	CueManager.cueCache[clipNum].cues = cueData;    
  }
  
};
