if (typeof(getElementsByClassName) == "undefined") {
 	getElementsByClassName = function(oElm, strTagName, strClassName){
		var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
		var arrReturnElements = new Array();
		strClassName = strClassName.replace(/\-/g, "\\-");
		var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
		var oElement;
		for(var i=0; i<arrElements.length; i++){
			oElement = arrElements[i];
			if(oRegExp.test(oElement.className)){
				arrReturnElements.push(oElement);
			}
		}
		return (arrReturnElements);
	}
};

var OpenXS1 = (function(){
  var requestQueue = [];
  var Config = {
    // specify whether the first x elements should be loaded synchroniously, 0 for none
    sync: 1,
    preAds: 0,
    openXCall: typeof(OA_PROMOSAT1_show) == "function" ? OA_PROMOSAT1_show : function() {},
    idBase: "OpenXS1_teaser"
  };
  
  isSync = function() {
    return requestQueue.length < Config.sync;
  };
  
  isPreAd = function() {
    return requestQueue.length < (Config.sync + Config.preAds);
  };
  
  prepareDeferredRequest = function(id) {
    document.write("<div class='OpenXS1_teaser' id='" + Config.idBase + "_container" + id +"' ></div>");
  };
  
  request = function(id) {
    if (isSync()) {
      execute(id, 0);
      requestQueue.push({
        id: id,
        toexecute: 0
      });
    } else {  
      prepareDeferredRequest(id);
      if (isPreAd()) {
        requestQueue.push({
          id: id,
          toexecute: -1
        });
      } else {
        requestQueue.push({
          id: id,
          toexecute: 1
        });
      }
    }  
  };
  
  execute = function(id) {
    Config.openXCall.apply(window, arguments);
  };
  
  currentIndex = function(preOrPostAd) {
    for (var i=0; i<requestQueue.length; i++) {
      if (requestQueue[i].toexecute === preOrPostAd) break;
    };
    return i;
  };
  
  executeDeferred = function(callCount, preOrPostAd) {
    var i = currentIndex(preOrPostAd);
    if (typeof(requestQueue[i]) != "undefined") { 
      document.write("<div class='OpenXS1_trigger' id='" + Config.idBase + "_trigger" + requestQueue[i].id +"' >");
      Config.openXCall.apply(window, [requestQueue[i].id]);
    }
  };
  
  finish = function(callCount, preOrPostAd) {
    var i = currentIndex(preOrPostAd);
    if (typeof(requestQueue[i]) != "undefined") {
      document.write("</div>");
      requestQueue[i].toexecute = 0;
    }
  };

  finalize = function() {
    var el, id, triggers = getElementsByClassName(document, "div", "OpenXS1_trigger");
    for (var i in triggers) {
      id = triggers[i].id.split(Config.idBase + "_trigger")[1];
      try {
        el = document.getElementById(Config.idBase + "_container" + id);
        el.parentNode.replaceChild(triggers[i], el);
        document.getElementById(Config.idBase + "_trigger" + id).className += " OpenXS1_show";
      } catch (err) {
      }
    }
  };
  
  return {
    request: request,    
    executePostAds: function() {
      executeDeferred(arguments[0], 1);
    },
    finishPostAds: function() {
      finish(arguments[0], 1);
    },
    finalizePostAds: finalize,
    
    executePreAds: function() {
      executeDeferred(arguments[0], -1);
    },
    finishPreAds: function() {
      finish(arguments[0], -1);
    },
    finalizePreAds: finalize
  }
})();
