(function (m) {

    // Use YUI compressed js in production environment.
    var compress = (m.environment == "production") ? "yc" : "nc";

    var tags = [
        { name: "lib/console" },

        { name: "vendor/showdown." + compress },

        { name: "vendor/mootools-1.2.4-core-" + compress },
        { name: "vendor/mootools-1.2.4.2-more-" + compress },

        { name: "mootools",
          requires: ["vendor/mootools-1.2.4-core-" + compress,
                     "vendor/mootools-1.2.4.2-more-" + compress],
          tagOnly: true
        },
        
        { name: "http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js" },
        { name: "jquery",
          requires: ["http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"],
          tagOnly: true
        },
        { name: m.simile_base + "/simileajax/simileajax-bundle.js",
          requires: ["jquery"]
        },
        { name: m.simile_base + "/timeline/timeline-bundle.js",
          requires: [m.simile_base + "/simileajax/simileajax-bundle.js"]
        },
        { name: "simile-timeline",
          requires: [m.simile_base + "/timeline/timeline-bundle.js"],
          tagOnly: true
        },
        
        { name: "lib/extensions",
          requires: ["mootools"]
        },
        { name: "lib/elementfill",
          requires: ["lib/extensions",
                     "vendor/showdown." + compress] 
        },
        { name: "lib/autoscroller",
          requires: ["mootools"] 
        },
        { name: "lib/spinner",
          requires: ["mootools"]
        },
        { name: "lib/modal",
          requires: ["mootools"]
        },
        { name: "lib/delegator", 
          requires: ["mootools"]
        },
        { name: "lib/moovc",
          requires: ["lib/modal",
                     "lib/spinner",
                     "lib/delegator"]
        },

        { name: "app/models/factlet",
          requires: ["lib/moovc"] 
        },
        { name: "app/models/thread",
          requires: ["lib/moovc"] 
        },

        // Master controllers
        { name: "app/controllers/thread_controller",
          requires: ["app/models/thread", "app/models/factlet"]
        },

        // Components (AKA subcontrollers)
        { name: "app/controllers/factlet_list_controller" },
        { name: "app/controllers/factlet_details_controller",
          requires: ["lib/elementfill", "lib/autoscroller"]
        },
        { name: "app/controllers/timeline_controller",
          requires: ["simile-timeline"]
        },
        { name: "app/controllers/map_controller" },
        { name: "app/controllers/factlet_search_controller" },
        { name: "app/controllers/factlet_edit_controller",
          requires: ["lib/elementfill", 
                     "lib/autoscroller", 
                     "app/models/factlet", 
                     "app/controllers/map_controller"]
        },
        { name: "app/controllers/factlet_create_controller" },


        // Pages
        { name: "app/controllers/thread_read_controller",
          requires: ["app/controllers/thread_controller",
                     "app/controllers/factlet_details_controller",
                     "app/controllers/factlet_list_controller"]
        },
        { name: "app/controllers/thread_chrono_controller",
          requires: ["app/controllers/thread_controller",
                     "app/controllers/factlet_details_controller",
                     "app/controllers/timeline_controller"]
        },
        { name: "app/controllers/thread_geochrono_controller",
          requires: ["app/controllers/thread_controller",
                     "app/controllers/factlet_details_controller",
                     "app/controllers/map_controller",
                     "app/controllers/timeline_controller"]
        },
        { name: "app/controllers/thread_edit_controller",
          requires: ["app/controllers/thread_controller",
                     "app/controllers/factlet_details_controller",
                     "app/controllers/factlet_list_controller",
                     "app/controllers/factlet_search_controller",
                     "app/controllers/factlet_edit_controller",
                     "app/controllers/factlet_create_controller",
                     "app/controllers/map_controller"]
        },

        // Useful for testing, if nothing else.
        { name: "everything",
          requires: ["app/controllers/thread_read_controller",
                     "app/controllers/thread_edit_controller",
                     "app/controllers/thread_chrono_controller",
                     "app/controllers/thread_geochrono_controller"],
          tagOnly: true
        }

    ];

    if (m.environment === 'production') {
        m.loader = new JSLoad(tags, "/behaviour/", m.version, null, '/compressor/js?load=');
    } else {
        m.loader = new JSLoad(tags, "/behaviour/");
    }
})(MF);

MF.loadFn = function () {
    $$('.timeline-simile, .map.geochrono').startSpinner();

    MF.spinner = new Spinner(document.body);
    
    $extend(Request.prototype.options, {
      onRequest: MF.spinner.start,
      onComplete: MF.spinner.stop
    });
    $extend(Request.HTML.prototype.options, {
      onRequest: MF.spinner.start,
      onSuccess: MF.spinner.stop
    });
};

if (MF.environment !== 'test') {
    MF.loader.load( ["lib/console", "lib/spinner"], MF.loadFn );
}
