(function(base) {
    var VERSION = "1.4";

    var _STATUS='staging';
    var _REVISION='14085';


    var ISIE6 = /msie|MSIE 6/.test(base.navigator.userAgent);
    if (ISIE6)
        return; // disable linker for IE6

    if ((/mobile|phone|mini|windows ce/i).test(base.navigator.userAgent))
        return; // disable linker for mobile



    var button_process =    false;
    var button_parse =      false;
    var button_loaded =     false;
    var page_loaded =       false;
    var scripts_loaded =    false;


    // base linker object
    var linker = base.linker = {
        runTime: new Date(),
        startTime: null,
        loadTime: null,
        loadedTime: null,

        loadModuleScript: function(name) {
            // /etc/settings.php is incorrect
            return false;
        },

        utils: {
            addEvent: function(element, type, listener) {
                if (element.attachEvent) {
                    return element.attachEvent("on" + type, listener);
                } else if (element.addEventListener) {
                    element.addEventListener(type, listener, true);
                    return true;
                }

                return false;
            },
            removeEvent: function(element, type, listener) {
                if (element.detachEvent) {
                    element.detachEvent("on" + type, listener);
                } else if (element.removeEventListener) {
                    element.removeEventListener(type, listener, true);
                }

                return true;
            }
        }
    };


    // getting information functions

    function getParam(url, name, value) {
        name += '=';

        var pos = url.lastIndexOf(name);
        if (-1 === pos)
            return value || '';

        value = url.substr(pos+name.length);
        pos = value.indexOf('&');
        if (-1 === pos)
            return value.replace(/%20/g, ' ');

        return value.substr(0, pos).replace(/%20/g, ' ');
    }

    var thisScriptNode = (function() {
        var list = base.document.getElementsByTagName("script");

        for (var i=0; list[i]; ++i) {
            if (!list[i].getAttribute)
                continue;

            var src = list[i].getAttribute("src");

            if ("string" === typeof src && src.match(/knownow\.js/))
                return list[i];
        }

        return null;
    })();
    if (!thisScriptNode)
        return;

    var thisScript = thisScriptNode.getAttribute("src") || "";
    if (!thisScript)
        return;


    // main constants
    var BUTTONAPPLICATION = getParam(top.location.href, 'wikify_root') || thisScript.substring(0,thisScript.lastIndexOf('/')+1);
    var APPLICATION = linker.APPLICATION = getParam(top.location.href, 'wikify_id') || getParam(thisScript, 'id').replace(/\s/g, '');


    // get other parameters
    var params = (thisScript.split("?", 2)[1] || "").split("&");

    (function() {
        // add page params
        var page_params = (top.location.href.split("?", 2)[1] || "").split("&");
        for (var i=0, n=page_params.length; i<n; ++i) {
            if (!page_params[i])
                continue;

            if (page_params[i].match(/^wikify__/))
                params[params.length] = page_params[i].substr(7);
        }
    })();

    function applyParams() {
        for (var i=0, n=params.length; i<n; ++i) {
            if (!params[i])
                continue;

            var pair = params[i].split("=", 2);
            if ('_' === pair[0].charAt(0)) {
                if ('false' === pair[1])
                    pair[1] = false;
                else if ('true' === pair[1])
                    pair[1] = true;

                base[pair[0].substr(1)] = pair[1];
            }
        }
    }


    // script loading functions

    var requests = {};

    function loadxhr(url, callback, force) {
        if (!force && undefined !== requests[url])
            return;

        requests[url] = false;

        var script = base.document.createElement('script');
        script.setAttribute('src', url);
        script.setAttribute('type','text/javascript');

        script.onload = script.onreadystatechange = function() {
            if (!requests[url] && (!script.readyState || "loaded" === script.readyState || "complete" === script.readyState)) {
                requests[url] = true;
                callback && callback();
            }
        };

        base.document.getElementsByTagName("head")[0].appendChild(script);
    }

    function WaitForScripts(callback) {
        (function() {
            for (var url in requests) {
                if (!requests.hasOwnProperty(url))
                    continue;

                if (!requests[url]) {
                    base.setTimeout(arguments.callee, 50);
                    return;
                }
            }

            if (!linker.isLoaded || linker.isLoaded())
                callback();
            else
                base.setTimeout(arguments.callee, 50);
        })();
    }


    // linker loading functions

    function loadJavascript(parse) {
        linker.startTime = linker.startTime || new Date();

        if (parse) {
            if (scripts_loaded) {
                button_enrich();
                return;
            }

            button_parse = true;
        }

        if (button_process || scripts_loaded)
            return;

        button_process = true;

        linker.base_url = HOST = BUTTONAPPLICATION.replace(/\/?$/, "");

        loadxhr("http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js");

        if (base.GOOGLE_ANALYTICS && (!base._gat || !base._gat._getTracker))
            try {
                var gaJsHost = (("https:" == base.document.location.protocol) ? "https://ssl." : "http://www.");
                loadxhr(gaJsHost + "google-analytics.com/ga.js");
            } catch (e) { }

        if (DEBUG)
            loadxhr(BUTTONAPPLICATION + "log4javascript.js");

        WaitForScripts(function() {
            linker.jQuery = jQuery.noConflict();

            if (base.GOOGLE_ANALYTICS && base._gat)
                try {
                    (linker.pageTracker = base._gat._getTracker(base.GOOGLE_ANALYTICS))._trackPageview();
                } catch (e) { }

            var commonScriptName = "bin/js/common";
            _STATUS && _STATUS !== "undefined" && (commonScriptName += "_" + _STATUS);
            _REVISION && _REVISION !== "undefined" && (commonScriptName += "_" + _REVISION);
            commonScriptName += ".js";

            loadxhr(BUTTONAPPLICATION + commonScriptName);

            WaitForScripts(function() {
                if (DEBUG) {
                    var log = log4javascript.getLogger();
                    popUpAppender = new log4javascript.PopUpAppender();
                    popUpAppender.setFocusPopUp(true);
                    popUpAppender.setNewestMessageAtTop(false);
                    log.addAppender(popUpAppender);

                    linker.utils.fireLinkerEvent("linkerLogInit", [log]);
                }

                ('undefined' === typeof linker.indexing) && (linker.indexing = {});
                linker.indexing.queryLength = Math.min(linker.indexing.queryLength, (linker.browser.is_ie6 || linker.browser.is_ie7) ? 1800 : 3072);

                scripts_loaded = true;
                button_process = false;

                if (button_parse)
                    button_enrich();
            });
        });
    }


    // enrich function
    function button_enrich(){
        linker.loadedTime || (linker.loadedTime = new Date());

        if (!linker.utils.data(base, "initialized")) {
            linker.initpage(base, "button_" + _REVISION, APPLICATION);
            linker.parsing.SiteSpecificHandling();
        }
    }


    // preload functions
    function button_load() {
        button_loaded = true;

        if (page_loaded)
            loadJavascript(true);
    }

    function page_load() {
        linker.loadTime || (linker.loadTime = new Date());
        page_loaded = true;

        if (button_loaded)
            loadJavascript(true);
    }

    linker.utils.addEvent(base, "load", page_load);


    // load loader script
    var loaderScriptName = "bin/js/loader_" + (APPLICATION || "Default");
    _STATUS && _STATUS !== "undefined" && (loaderScriptName += "_" + _STATUS);
    _REVISION && _REVISION !== "undefined" && (loaderScriptName += "_" + _REVISION);
    loaderScriptName += ".js";

    loadxhr(BUTTONAPPLICATION + loaderScriptName, function() {
        applyParams();

        if (base.BUTTON_PRELOAD)
            loadJavascript();

	// if one of the two options is false, there should be no indexing
	if (!(base.BUTTON_AUTOSTART == false || base.ENABLE_KNOWNOW == false))
	   button_load();

    });
})(window);
