/*
 * JS ad serving script
 *
 * Version 1.71
 * Last modified: 2/16/2012
 *
 */ 
(function(window) {

    document._write = document.write;

    /* ie fallback */
    var isie = false;
    if (navigator.appName == "Microsoft Internet Explorer") {
        isie = true;
        var onload = function(func,unique) {
            document._write('<script type="text/javascript" ' 
                         + 'id="loading_ie_fallback'
                         + unique
                         + '" defer="defer" '
                         + 'src="javascript:void(0)">'
                         + '<\/script>');

            var cload = document.getElementById("loading_ie_fallback"+unique);
            cload.onreadystatechange = function() {
                if( this.readyState=="complete" ) {
                    func();
                }
            };
        };
    }

    var rgx = {
        scriptcont:/<script.*?\/script>/gi,
        jsurl:/src\s*=\s*[\'\"]\s*http[s]*:\/\/.*\.js/gi,
        scripttags:/<[\/]*script[^>]*>/gi
    };

    var processmedia = function processmedia(media,target,forceHTML) {

        /* Remove single line comments and whitespace formatting */
        media = media.replace(/\/\/.*\n$/g,'');
        media = media.replace(/[\r\n\t]/g,"");

        var scripts = media.match(rgx.scriptcont,"") || [],
            nodes = [];

        /* Some strings come in with wonky \r\n, so translate them */ 
        media = media.replace(/&#rn;/g,"\r\n");
        media = media.replace(/&#n;/g,"\n");
        media = media.replace(rgx.scriptcont,"");   

        /* Extract all scripts */

        /* This loop idiom is faster in javascript */
        scripts.reverse();
        var iter = scripts.length;
        while( iter-- ) {

            var script = scripts[iter],
                opentag = script.match(/^<[^>]+/)[0],
                attributes = opentag.match(/[a-zA-Z]+\s*=\s*[\'\"][^\'\"]+/gi),
                pass = {};

            /* Remove CDATA tags */
            script = script.replace(/<\!--.*?\*\//,"");
            script = script.replace(/\/\*.*?\/-->/,"");

            /* Extract attributes, if they be */
            if( attributes ) {
                var set = [];
                var _iter = attributes.length;
                while( _iter-- ) {
                    /*
                     * Need to extract and recreate attributes. 
                     * Splitting on "=" works in most cases, however
                     * src urls with cgi vars need to be collapsed,
                     * so after the initial attribute name is shifted
                     * out of the array, join the rest of it, so
                     * 
                     * src="somewhere.com?x=y"
                     *
                     * becomes
                     *
                     * attr_name:"src"
                     * attr_val:"somewhere.com?x=y"
                     *
                     * .join() will take single element arrays and
                     * just convert them to strings, so there's no
                     * need to check for the case.
                     */
                    var set = attributes[_iter].replace(/[\'\"\s]/g,'')
                                               .split("=");
                    var attr_name = set.shift();
                    var attr_val = set.join("=");
                    pass[attr_name] = attr_val;
                }
            }

            /* Create a script node */
            nodes[nodes.length] = [document.createElement("script"),false];
            
            /* Add attributes back in */
            for( var attr in pass ) {
                nodes[nodes.length-1][0][attr] = pass[attr];
            }

            /* Save inline js for eval */
            if( !pass["src"] ) {
                script = script.replace(rgx.scripttags,"");
                nodes[nodes.length] = [script,true];
            }
        }

        var appendage = document.createElement("span");
        appendage.innerHTML = media;
        target.appendChild(appendage);


        /* Incoming 3rd party .writes will destroy the page */
        var docwrite = function(append) { 
            /*
             * The forceHTML option is designed
             * to compensate for inline doc writes
             * that simply append html, and won't
             * work properly in the window scope.
             */ 
            if( forceHTML ) {
                var appendage = document.createElement("span");
                appendage.innerHTML = append;
                target.appendChild(appendage);
            } else {
                processmedia(append,target);
            }
        };

        document.write = docwrite;
        document.writeln = docwrite;

        /* Create a fragment to hold nodes before appending to DOM */
        var nodeset = document.createDocumentFragment();

        nodes.reverse();
        var __iter = nodes.length;
        while( __iter-- ) {
            if( nodes[__iter][1] ) {
                try {
                    window.eval(nodes[__iter][0]);
                } 
                catch(e) {}
            } else {
                target.appendChild(nodes[__iter][0]);
            }
        }
        target.appendChild(nodeset);
    };

    var create = function() {
        
        var adcount = 0;

        return function(advars) {

            adcount++;
            var id = 'global_ad_id' + adcount;
            
            /* Short circuit if missing key vars */
            if( !advars.zone ) return;

            var src = "http://ads.mocean.mobi/ad";
            if( typeof advars.service != "undefined" ) {
                src = advars.service;
            }

            /* Build script src url */
            var cgi = ['url=' + escape(document.location),
                       'cb=' + Math.random(),
                       'key=6',
                       'version=2.0',
                       'jsvar=' + id,
                       'ua=' + navigator.userAgent];

            for( var setting in advars ) {
                var cgivar = setting + '=' + escape(advars[setting]);
                cgi[cgi.length] = cgivar;
            }
            src += "?" + cgi.join('&');

            /* Create containers */
            document._write("<div id='" + id + "'></div>");
            var container = document.getElementById(id),
                varscall = document.createElement("script");

            if( advars.defaultHtml ) {
                container.innerHTML = "<div id= 'm_dcontent" 
                                    + id + "' "
                                    + "style='display:none'>"
                                    + advars.defaultHtml
                                    + "</div>";
            }

            /* Setup script to get data */
            varscall.type = "text/javascript";
            var varsloaded = function() {

                /* 
                 * IE loses the container var in this 
                 * scope, so need to snag it again
                 */ 
                if( isie ) {
                    container = document.getElementById(id);
                }

                var ads = window[id];

                for( iter=0;iter<ads.length;++iter ) {

                    var ad = ads[iter];
                    if( !advars.target ) {
                        advars.target = '';
                    }

                    if( ad.error ) {
                        if( advars.defaultHtml && advars.reveal ) {
                            container.innerHTML = ad.error;
                        }
                        continue;  
                    }

                    if( ad.img ) {
                        /* Image */
                        var width = (advars.img_width ? advars.img_width: ''),
                            height = (advars.img_height ? advars.img_height: ''),
                            /* border:none added to prevent ie default styling */
                            tag = "<a href='" 
                                + ad.url 
                                + "' target='" + advars.target + "'>"
                                + "<img style='border:none' src='" + ad.img + "'"; 

                        if( advars.img_width ) {
                            tag += " width='" + width + "'";
                        }         
                        if( advars.img_height ) {
                            tag += " height='" + height + "'";
                        }         

                        tag += "/></a>"; 

                        container.innerHTML = tag;
                    } else if( ad.content ) {
                        /* Richmedia */
                        container.innerHTML = '';
                        processmedia(ad.content,container,advars.forceHTML);
                    } else {
                        /* Text */
                        var tag = "<a href='" + ad.url + "' "
                                + "target='" + advars.target + "'>"
                                + ad.text
                                + "</a>";

                        container.innerHTML = tag;
                    }

                    /* Ad pixel tracker */
                    var track = new Image();
                    track.src = ad.track;
                }

                if( dcont = document.getElementById("m_dcontent" + id) ) {
                    dcont.style.display = "block";
                }

                /* Ad prepend to all links */
                if( advars.clickPrepend ) {
                    var links = container.getElementsByTagName("a");
                    for( iter=0;iter<links.length;++iter ) {
                        var link = links[iter],
                            original = link.href;
                        link.href = advars.clickPrepend + original;
                    }
                }
             
                /* Publisher pixel tracker */
                if( advars.pixelUrl ) {
                    var cachebust = Math.random(),
                        join = (advars.pixelUrl.indexOf('?') ? '&' : '?'),
                        img = new Image();

                    img.src = advars.pixelUrl + join + cachebust; 
                }

                /* Take out the trash */
                if( !isie ) delete this;
            };

            /* Account for IE event model */
            if( !isie ) {
                varscall.onload = varsloaded;
            } else {
                varscall.onreadystatechange = function() {
                    if( this.readyState != 'complete'
                     && this.readyState != 'loaded') return;

                    varsloaded();
                    this.onreadystatechange = null;
                }
            }
            varscall.src = src;

            /* 
             * Explorer can't find the written object
             * until the DOM finishes rendering.
             * NOTE: in order to make rewriting the 
             * document.write function more palatable
             * and less intrusive, all processing is 
             * now deferred to after DOM load.
             */
            if( !isie ) {
                window.addEventListener(
                    "DOMContentLoaded",
                    function() {
                        container.appendChild(varscall);
                    },
                    true
                );
            } else {
                onload(function() {  
                    document.getElementById(id).appendChild(varscall); 
                },id);
            }
            /* Take out the trash */
            if( !isie ) delete this;
        };
    };

    if( !window.AdRequest_ ) {
        window.AdRequest_ = create(); 
    }
})(window);

