﻿/**
* $.include - script inclusion jQuery plugin
* Based on idea from http://www.gnucitizen.org/projects/jquery-include/
* @author Tobiasz Cudnik
* @link http://meta20.net/.include_script_inclusion_jQuery_plugin
* @license MIT
*/
// overload jquery's onDomReady
if (jQuery.browser.mozilla || jQuery.browser.opera) {
    document.removeEventListener("DOMContentLoaded", jQuery.ready, false);
    document.addEventListener("DOMContentLoaded", function () { jQuery.ready(); }, false);
}
jQuery.event.remove(window, "load", jQuery.ready);
jQuery.event.add(window, "load", function () { jQuery.ready(); });
jQuery.extend({
    includeStates: {},
    include: function (url, callback, dependency) {
        if (typeof callback != 'function' && !dependency) {
            dependency = callback;
            callback = null;
        }

        //Check if the Script isn't already included

        var head = $(document.getElementsByTagName("head")[0]);
        var exists = false;

        head.find("script").each(function () {
            if ($(this).attr("src") == url) {
                exists = true;

                return;
            }
        });


        url = url.replace('\n', '');
        jQuery.includeStates[url] = false;
        var script = document.createElement('script');
        script.type = 'text/javascript';
        script.onload = function () {
            jQuery.includeStates[url] = true;
            if (callback)
                callback.call(script);
        };
        script.onreadystatechange = function () {
            if (this.readyState != "complete" && this.readyState != "loaded") return;
            jQuery.includeStates[url] = true;
            if (callback)
                callback.call(script);
        };
        script.src = url;
        if (dependency) {
            if (dependency.constructor != Array)
                dependency = [dependency];
            setTimeout(function () {
                var valid = true;
                $.each(dependency, function (k, v) {
                    if (!v()) {
                        valid = false;
                        return false;
                    }
                })

                if (valid) {
                    if (!exists) {
                        document.getElementsByTagName('head')[0].appendChild(script);
                    }
                } else {
                    setTimeout(arguments.callee, 10);
                }
            }, 10);
        }
        else
            document.getElementsByTagName('head')[0].appendChild(script);
        return function () {
            return jQuery.includeStates[url];
        }
    },
    readyOld: jQuery.ready,
    ready: function () {
        if (jQuery.isReady) return;
        imReady = true;
        $.each(jQuery.includeStates, function (url, state) {
            if (!state)
                return imReady = false;
        });
        if (imReady) {
            jQuery.readyOld.apply(jQuery, arguments);
        } else {
            setTimeout(arguments.callee, 10);
        }
    }
});
