/*
 * This object stores External Interface calls until
 * a flash object is ready to recieve it.
 * 
 * Only the most recent call is stored per flash embed.
 * 
 * Interface:
 * 
 * @param flashEmbedName string - the name of the embed from swfobject
 * @param methodName string 0 the name of the External Interface call in the flash movie.
 * 
 * eiProxy.call(flashEmbedName, methodName)
 * 
 */
 
var eiProxy = function(){
  var _timer;
  var eiCalls = new Array();
  var isFirstTimer = true;
   
  function makeCall(eiObj){
    var slideRef = swfobject.getObjectById(eiObj.eName);
    if (typeof slideRef != 'undefined' && slideRef != null) {
      if (typeof slideRef[eiObj.fName] != 'undefined' && slideRef[eiObj.fName] != null) {
        slideRef[eiObj.fName]();
        return true;
      }
    }
    return false;
  }
  
  function addToIeStack(eiObj){
    for(var i = 0; i < eiCalls.length;i++){
      if(eiObj.eName === eiCalls[i].eName){
        //this is the same embed obj,
        //lets replace.
        eiCalls[i] = eiObj;
        return;
      }
    }
    //we need to add
    eiCalls.push(eiObj)
  }
  
  function clearTimeOut(){
    //lets clear the last timeout
    if (_timer !== undefined) {
      window.clearTimeout(_timer)
    }
  }
  
  function startTimer(){
      var len = (isFirstTimer)?1000:250;
      isFirstTimer = false;
      _timer = window.setTimeout("eiProxy.timerComplete()",len);
  }
  
  function timerCompleteInternal(){
    var newEiCalls = new Array();
    
    for(var i = 0; i < eiCalls.length;i++){
      if(!makeCall(eiCalls[i])){
        
        debuger.log("call messed up",eiCalls[i]);
        //this item wasn't ready
        newEiCalls.push(eiCalls[i]);
      }
    }
    
    eiCalls = newEiCalls;
    
    if(eiCalls.length == 0){
      clearTimeOut();
    }    
  }
  
  return {
    call : function(embedName, functionName){
      var eiObj ={
        eName: embedName,
        fName: functionName
      }
      var ret = makeCall(eiObj);
      if(ret == false){
        debuger.log("the external interface is not ready for" + eiObj.name);
        addToIeStack(eiObj);
        startTimer();
      }
    },
    timerComplete : function(){
      timerCompleteInternal();
    }
  }  
}();

