/*########################################################################################################
## Advertisments Tracker
## ------------------------
## Author:   Stephen Blum
## Date:     April 28, 2008
## Filename: adtracker.js
## ------------------------
## Purpose:  Convert all element classes known as "TrackedAd" into
##           trackable links. The companion tracking code can be found in
##           "Main" in the function system_link_track().
########################################################################################################*/

var adTracker = (function() {

    var adTracker = {};

    // Number of Ads Parsed
    adTracker.numAdsParsed = 0;

    // Parse ads on the page
    adTracker.parseAds = function() {
        var trackLinkURL      = "";
        var relativeDirCheck  = window.location.href;
        var relativeDirChange = "";
        var i                 = 0;
        var relativeDirMatches;

        //------------------------------
        //Support for dev vs. production
        //in the following if statement.
        //------------------------------
        if (relativeDirCheck.indexOf('public_html/') != -1) {
            relativeDirCheck = relativeDirCheck.substr(relativeDirCheck.indexOf('public_html/'));
        }
        else {
            relativeDirCheck = relativeDirCheck.substr(relativeDirCheck.lastIndexOf('.com/'));
        }

        relativeDirMatches = relativeDirCheck.match(/\//g);

        for (i=0; i<relativeDirMatches.length-1; i++) {
            relativeDirChange += "../";
        }

        trackLinkURL = relativeDirChange + 
            "?class=main&screen=link&sessionid=" +
            document.getElementById("bmsid").value;

        adTracker.stepNode( document.body, function(node) {
            // if the node is marked to be a tracked advertisment
            if (node.tagName == "A" && node.className == "TrackedAd") {
                node.onmouseup = function() {
                    node.sqlName   = node.innerHTML
                    .replace( /<[^>]+>[^<]+<[^>]+>/g, '' )
                    .replace( /[^a-zA-Z0-9\-.: !]/g, '' );
                    // highlight ad
                    // adTracker.highlightAd( node );

                    catini.request({
                        url       : trackLinkURL +
                                    "&url=" + node.getAttribute('ahref') +
                                    "&name=" + node.sqlName,
                        onSuccess : function(responseText) {
                            setTimeout( function() {
                                window.location.replace( node.getAttribute('ahref') );
                            }, 500 );
                            return true;
                        }
                    });
                };
                adTracker.numAdsParsed++;
            }
        });
        return adTracker.numAdsParsed;
    };

    // show user that their click has been recognized
    adTracker.highlightAd = function(node) {
        var highlighter = adTracker.createElement({
            element : "span", 
            attributes : {
                innerHTML : " [ loading url... ] "
            },
            styles : {
                backgroundColor : "#111",
                color: "#eee"
            }
        });
        node.appendChild(highlighter);
    };

    // Test id "test" console and if not exists then create one.
    adTracker.checkTestConsole = function() {
        if ($("test")) {
            return $("test");
        }
        else {
            return adTracker.addTestConsole();
        }
    };

    // Add Test Console to page
    adTracker.addTestConsole = function() {
        var testConsole = adTracker.createElement({
            element : "div", 
            attributes : {
                id : "test",
                innerHTML : "<b>test</b>: "
            },
            styles : {
                position        : "absolute",
                top             : "0px",
                left            : "0px",
                backgroundColor : "white"
            }
        });

        document.body.appendChild( testConsole );

        return testConsole;
    };

    // step through source node's nodes and run func on each.
    adTracker.stepNode = function(node, func) {
        func(node);
        node = node.firstChild;
        while (node) {
            adTracker.stepNode(node, func);
            node = node.nextSibling;
        }

        return true;
    };

    // Easy Element Creator
    adTracker.createElement = function(args) {
        args       = args                      || {};
        var e      = args.element              || "div";
        var ea     = args.attributes           || {};
        var es     = args.styles               || {};
        var elmObj = document.createElement(e) || false;

        if (!elmObj) {
            return false;
        }

        for (var elmAttrib in ea) {
            if ( ea.hasOwnProperty(elmAttrib) ) {
                elmObj[elmAttrib] = ea[elmAttrib];
                elmObj.setAttribute( elmAttrib, ea[elmAttrib] );
            }
        }

        for (var elmStyles in es) {
            if ( es.hasOwnProperty(elmStyles) ) {
                elmObj.style[elmStyles] = es[elmStyles];
            }
        }
        return elmObj;
    };

    // return the element object no mater what!
    adTracker.getElement = function(elm) {
        var elementObject;

        if (typeof(elm) == "object") {
            elementObject = elm;
        }
        else {
            if ($) {
                elementObject = $(elm);
            }
            else {
                elementObject = document.getElementById(elm);
            }
        }

        return elementObject;
    };

    return adTracker;
})();
