Fixed an error in the ordering, output added via document.write is rendered
authorKai Moritz <kai@coolibri.de>
Tue, 25 Sep 2012 10:17:54 +0000 (12:17 +0200)
committerKai Moritz <kai@coolibri.de>
Tue, 26 Feb 2013 13:53:26 +0000 (14:53 +0100)
Because output added by an ad-script via document.write() was always
prepended to the unrendered rest of the banner-code, the order of the
markup was messed up, if an ad-script called document.write() more then
once!

openx.js

index a01c775..3499345 100644 (file)
--- a/openx.js
+++ b/openx.js
@@ -12,7 +12,8 @@
   count = 0,
   slots = {},
   queue = [],
-  ads = [];
+  ads = [],
+  output = [];
 
 
   openx.show_ads = function(server, zones) {
@@ -73,6 +74,8 @@
 
     while (ads.length > 0) {
 
+      var result, src, inline, i;
+
       id = ads.shift();
       node = slots[id];
 
 
       // node.append(id + ": " + node.attr('class'));
 
-      var result, src, inline;
+      /**
+       * If output was added via document.write(), this output must be
+       * rendered before other banner-code from the OpenX-server is rendered!
+       */
+      if (output.length > 0) {
+        output.push(OA_output[id]);
+        OA_output[id] = "";
+        for (i=0; i<output.length; i++)
+          OA_output[id] += output[i];
+        output = [];
+      }
 
       while ((result = /<script/i.exec(OA_output[id])) != null) {
         node.append(OA_output[id].slice(0,result.index));
 
   function document_write() {
 
-    if (id == undefined)
-      return;
-
-    var
-    str = "",
-    i;
-
-    for (i=0; i < arguments.length; i++)
-      str += arguments[i];
-
-    OA_output[id] = str + OA_output[id];
+    for (var i=0; i<arguments.length; i++)
+      output.push(arguments[i]);
+
+    if (id != ads[0])
+      /**
+       * Re-Add the last banner-code to the working-queue, because included
+       * scripts had added markup via document.write(), which is not
+       * proccessed yet.
+       * Otherwise the added markup would be falsely rendered together with
+       * the markup from the following banner-code.
+       */
+      ads.unshift(id);
 
   }