/** 'required' scripts added to scriptLoader for dl limitation purposes */
var NNLM = (NNLM === undefined) ? {} : NNLM;
if(window.dump === undefined){
    window.dump = function(){
    };
}
NNLM.dump = function(msg){
    if(window.console !== undefined){
        window.console.log(msg);
    }
    else if(window.dump !== undefined){
        window.dump(msg);
    }
};
NNLM._po = function(obj){
    var depth = arguments.length > 1 ? arguments[1]+1 : 0;
    if(depth > 10){
        return;
    }
    var full = arguments.length > 2 ? arguments[2] : false;
    var pad = '    ';
    var pad2 = '';
    for (var i = 0; i <= depth; i++){
        pad2 += pad;
    }
    var lines = [];
    for (var param in obj) {
        if(obj.hasOwnProperty(param)){
            var s = typeof obj[param];
            switch(s){
            case 'string':
                lines.push(param + " : " + obj[param]);
                break;
            case 'function':
                if(full){
                    var str = param + " : ";
                    var fn = obj[param].toString().split("\n");
                    str += fn.shift();
                    lines.push(str);
                    lines = lines.concat(fn);
                }
                else{
                    lines.push(param + " : " + '(fn)');
                }
                break;
            case 'object':
                lines.push(param + ' : ' + NNLM._po(obj[param], depth, full));
                break;
            case 'boolean':
                lines.push(param  + ': ' + (obj[param] ? 'true' : 'false'));
                break;
            case 'number':
                lines.push(param + ': ' + obj[param]);
                break;
            default:
                lines.push(param + ": (" + (typeof obj[param]) + ')');
                break;
            }
        }
    }
    if(obj !== null && obj.length !== undefined){
        str = "[\n" + pad2 + lines.join("\n" + pad2) + "\n" + pad2.slice(pad.length) + "]";
    }
    else{
        str = "{\n" + pad2 + lines.join("\n" + pad2) + "\n" + pad2.slice(pad.length) + "}";
    }
    return str;
};
NNLM.createNamespace = function(ns){
    var spaces = ns.split('.');
    var o = window;
    for(var i = 0; i < spaces.length; i++){
        if(o[spaces[i]] === undefined){
            o[spaces[i]] = {};
        }
        o = o[spaces[i]];
    }
}
jQuery.extend({
    keys:    function(obj){
        var a = [];
        jQuery.each(obj, function(k){ a.push(k) });
        return a;
    },
    isString: function(str){
        return typeof str === 'string';
    }
});
NNLM.dump("\n*************\n*** BEGIN ***\n*************\n");
// Dean Edwards/Matthias Miller/John Resig


/** scriptLoader {singleton}
 *  Provides a means to asynchronously load javascript files.  The primary
 *  method, 'load', also accepts a second function argument that will
 *  defer execution until page load.  This ensures that all expected script
 *  and elements are present and accounted for before script execution begins.
 */
NNLM.ScriptLoader = function(){
    var LNUM = 0,
    googleKey = function(){
        var googleAPIKeys = {
            nnlm_gov: 'ABQIAAAAJknBlaenKCe5l6Nj8UBD-BSuPkKs8fuY3jYx6VEyXVqoolvyFRTMAC6tqsKrWN3LknxxYst7CJU_gQ',
            dev_nnlm_gov: 'ABQIAAAAJknBlaenKCe5l6Nj8UBD-BTUHTvS5PfItlKOWHmTZxhWMejmWxSq9w5T04Wu14swiXYZ-MkZiTfaJw',
            staff_nnlm_gov: 'ABQIAAAAJknBlaenKCe5l6Nj8UBD-BQJNgKKB9VP-O8ygSBP1qlR0E9ZVRTIFMM6Ab0Q3x5WxhiItblmy7T6pw',
            dev_staff_nnlm_gov: 'ABQIAAAAJknBlaenKCe5l6Nj8UBD-BQADrzkbHCkz6e8dA6DBSwFcY6w7hSk20KWepxz4ckxmZwNDCWGewmZUg',
            emergency_nnlm_gov: 'ABQIAAAAJknBlaenKCe5l6Nj8UBD-BSwQv2I8ihwK-I3Nevt6E0wdDnqxxRGJg0pwHPrQajBDB5BbLqtd1d4rA'
        };
        return googleAPIKeys[window.location.host.replace(/\./g, '_')];
    },
    //list of available urls here:
    //http://code.google.com/apis/ajaxlibs/documentation/#AjaxLibraries
    //http://code.google.com/apis/ajax/documentation/#AvailableAPIs
    named = {
        'addthis': 'http://s7.addthis.com/js/250/addthis_widget.js#username=webstoc',
        'debugging' : '/scripts/debugging.js',
        'ext-all': [
            '/scripts/ext/adapter/ext/ext-base.js',
            '/scripts/ext/ext-all.js'],
        'ext-debug': [
            '/scripts/ext/adapter/ext/ext-base-debug.js',
            '/scripts/ext/ext-all-debug.js'],
        'ext-jquery': [
            'http://code.jquery.com/jquery-1.4.4.js',
            '/scripts/ext/adapter/jquery/ext-jquery-adapter.js'],
        'ext-core': 'http://ajax.googleapis.com/ajax/libs/ext-core/3.0.0/ext-core.js',
        'feedmaker': '/scripts/feedMaker.js',
        'general_adv': '/scripts/GenericFunctions.js',
        'general': '/scripts/general.js',
        'google': '/scripts/googlejsapi.min.js',
        'googlefeeds':'/scripts/gfdynamicfeedcontrol.js',
        'jquery': '/scripts/jquery.min.js',
		'jquery-cycle': '/scripts/jquery_cycle/jquery.cycle.min.js',
        'json': '/scripts/json2.js',
        'linkedlist': '/scripts/linkedList.js',
        'modernizr': '/scripts/modernizr-1.6.min.js',
        'mootools': 'http://ajax.googleapis.com/ajax/libs/mootools/1.11/mootools-yui-compressed.js',
        'prototype': 'http://ajax.googleapis.com/ajax/libs/prototype/1.6.1.0/prototype.js',
        'rgbcolor': '/scripts/rgbcolor.js',
        'roundedcorners': '/scripts/rounded_corners_lite.inc.js',
        'scriptaculous': 'http://ajax.googleapis.com/ajax/libs/scriptaculous/1.8.1/scriptaculous.js',
        'urchin': '/scripts/ga.js',
        'validator': [
            'http://code.jquery.com/jquery-1.4.3.min.js',
            'http://ajax.microsoft.com/ajax/jquery.validate/1.6/jquery.validate.min.js'],
        'wordpress': '/scripts/general_wordpress.js',
        'wz_tooltip': '/scripts/wz_tooltip.js',
        'yuieditor': '/scripts/yuieditor.js'
    },
    loaded = [],
    gloaded = [],
    callbacks = {
        ajaxComplete: function(e, xhr, settings){
            var cleanURL = settings.url.substr(0, settings.url.indexOf('?'));
            //NNLM.dump("ajaxComplete: " + cleanURL);
        },
        ajaxSend: function(e, xhr, settings){
            var cleanURL = settings.url.substr(0, settings.url.indexOf('?'));
            NNLM.dump("SL" + settings.lnum + " ajaxSend: " + cleanURL + ", async: " + settings.async);
        },
        ajaxStart: function(){
            //NNLM.dump("ajaxStart");
        },
        ajaxStop: function(){
            status = true;
        },
        ajaxSuccess: function(e, xhr, settings){
            var cleanURL = settings.url.substr(0, settings.url.indexOf('?'));
            if(settings.scripts !== undefined){
                jQuery.each(settings.scripts, function(i, s){
                    NNLM.dump("Script loaded: " + s);
                    loaded[settings.lnum].scripts[s] = true;
                    gloaded.push(s);
                });
            }
            else{
                loaded[settings.lnum].scripts[cleanURL] = true;
                gloaded.push(cleanURL);
            }
            var remaining = [];
            for (var k in loaded[settings.lnum].scripts){
                if(loaded[settings.lnum].scripts[k] === false){
                    remaining.push(k);
                }
            }
            if(remaining.length === 0){
                NNLM.dump("SL" + settings.lnum +
                      " ajaxSuccess: " + cleanURL + ". Callback.");
                jQuery(document).ready(loaded[settings.lnum].callback);
            }
            else{
                NNLM.dump("SL" + settings.lnum +
                      " ajaxSuccess: " + cleanURL);/* +
                      "\nremaining:\n" + NNLM._po(remaining));*/
            }
        },
        ajaxError: function(xhr, text, settings){
            switch(text.status){
            case 404:
                var cleanURL = settings.url.substr(0, settings.url.indexOf('?'));

                NNLM.dump("SL" + settings.lnum + ":" +
                          "script not found :" + cleanURL);
                break;
            default:
                NNLM.dump("General ajaxError: " + xhr.statusText);
            }
        }
    },
    defaultConfig = {
        async: false,
        type: "GET",
        cache: false,
        data: null,
        dataType: 'script',
        timeout: 30000
    },
    _disambiguate = function(url){
        url = jQuery.trim(url);
        if(url.match(/^http/)){
            return url;
        }
        var prefix = document.location.href;
        prefix = prefix.substr(0, prefix.indexOf('/', prefix.indexOf('//')+2));
        if(url.indexOf('/') == 0){
            return prefix + url;
        }
        return prefix + '/' + url;
    },
    _getScript = function(config){
        var finalConfig = {};
        jQuery.extend(finalConfig, defaultConfig, config);
        if(finalConfig.url === undefined){
            NNLM.dump('config url is undefined!');
            return;
        }
        finalConfig.url = _disambiguate(finalConfig.url);
        if(jQuery.inArray(finalConfig.url, gloaded) !== -1){
            NNLM.dump("SL" + finalConfig.lnum + ": script " + finalConfig.url +
                      " already loaded.");
            loaded[finalConfig.lnum].scripts[finalConfig.url] = true;
            var remaining = [];
            for (var k in loaded[finalConfig.lnum].scripts){
                if(loaded[finalConfig.lnum].scripts[k] === false){
                    return;
                }
            }
            if(remaining.length === 0){
                NNLM.dump("SL" + finalConfig.lnum +
                      " last script not needed. Callback.");
                jQuery(document).ready(loaded[finalConfig.lnum].callback);
            }
        }
        //NNLM.dump("SL" + finalConfig.lnum + ": loading script " + finalConfig.url);
        jQuery.ajaxSetup(finalConfig);
        //need to append domain name to front of relative urls.  Jquery
        //loads the script inline otherwise, and does so asynchronously,
        //which is not always desired behavior.
        jQuery.ajax();
    },
    _load = function(arr, _callback){
        if(!jQuery.isArray(arr)){
            arr = [arr];
        }
        gloaded.push(named['jquery']); //script hard-loaded by default
        loaded[LNUM] = {
            scripts: {},
            callback: _callback === undefined ? function(){} : _callback
        };
        for(i = 0; i < arr.length; i++){
            script = arr[i];
            if(named[script] !== undefined){
                script = named[script];
                if(jQuery.isArray(script)){
                    //arrays in the named section are always dependent,
                    //and must be loaded synchronously.
                    for(j = 0; j < script.length; j++){
                        loaded[LNUM].scripts[_disambiguate(script[j])] = false;
                    }
                }
                else{
                    loaded[LNUM].scripts[_disambiguate(script)] = false;
                }
            }
            else{
                loaded[LNUM].scripts[_disambiguate(script)] = false;
            }
        }
        NNLM.dump("SL"+LNUM+": Scripts to be loaded: " + NNLM._po(loaded[LNUM]));
        var script = '';
        for(i = 0; i < arr.length; i++){
            script = arr[i];
            if(named[script] !== undefined){
                script = named[script];
                if(jQuery.isArray(script)){
                    //arrays in the named section are always dependent,
                    //and must be loaded synchronously.
                    for(j = 0; j < script.length-1; j++){
                        _getScript({
                            url: script[j],
                            async: false,
                            lnum: LNUM
                        });
                    }
                    _getScript({
                        url: script[script.length-1],
                        lnum: LNUM
                    });
                }
                else{
                    _getScript({
                        url: script,
                        lnum: LNUM
                    });
                }
            }
            else{
                _getScript({
                    url: script,
                    lnum: LNUM
                });
            }
        }
        LNUM++;
    },
    result = {
        init: function(){
            var doc = jQuery(document);
            jQuery.each(callbacks, function(i, o){
                doc.bind(i, o);
            });
        },
        /** load
         *  loads a named script if defined as one of the supported preloadable
         *  scripts.
         *
         *  @param mixed {array, string} the shorthand name of the script,
         *  a literal script name, or an array of either of those.
         *  @param _callback {function} a function to be executed once:
         *  1) all scripts listed as required by the function are loaded.
         *      a) a list of required scripts is usually passed as an array
         *      for the first argument
         *  2) the window onload() event has fired.
         *  @returns {void}
         */
        load: function (){
            defaultConfig.async = true;
            _load(arguments[0], arguments[1]);
        },
        sload: function (){
            var args = (arguments.slice === undefined) ? Array.prototype.slice.call(arguments) : arguments;  
            if(args.length == 2){
                defaultConfig.async = false;
                _load(args[0], args[1]);
                return;
            }
            defaultConfig.async = true;
            var scriptBatch = args.shift();
            NNLM.dump("Loading batch " + NNLM._po(scriptBatch));
            _load(scriptBatch, function(){
                NNLM.dump("callback");
                NNLM.ScriptLoader.sload.apply(NNLM.ScriptLoader, args);
            });
        },
        err: function(msg){
            alert(msg);
        }
    };
    result.init();
    return result;
}();
window.createValidationTag = function(xhtml){
    NNLM.ScriptLoader.load(["general_adv"], function(){
        NNLM.createValidationTag(xhtml);
    });
};
window.createAddThisButton = function(xhtml){
    NNLM.ScriptLoader.load(["general_adv"], function(){
        NNLM.createAddThisButton(xhtml);
    });
};
window.createLinkCheckTag = function(xhtml){
    NNLM.ScriptLoader.load(["general_adv"], function(){
        NNLM.createLinkCheckTag(xhtml);
    });
};
window.createViewSourceTag = function(xhtml){
    NNLM.ScriptLoader.load(["general_adv"], function(){
        NNLM.createViewSourceTag(xhtml);
    });
};

