(function() {

  var lang = YAHOO.lang,
      util = YAHOO.util,
      YUILoader = util.YUILoader;

  var IXL = {

    useIXLBase: {},

    info: {

      root: '2.8.0r4/build/',
      base: '/yui2.8.0/', //'http://yui.yahooapis.com/2.8.0r4/build/',
      ixlBase: '/static/math/',

      comboBase: 'http://yui.yahooapis.com/combo?',

      skin: {
          'defaultSkin': 'sam',
          'base': 'assets/skins/',
          'path': 'skin.css',
          'after': ['reset', 'fonts', 'grids', 'base'],
          'rollup': 3
      },

      moduleInfo: {

        /*********************************************************************
         *                        Common modules                             *
         *********************************************************************/

        "helpfile": {
          type: "js",
          fullpath: "/static/help/helpFile.js",
          varName: "getHelpFileByKey"
        },

        "ixlutils": {
          type: "js",
          path: "common/utils.js",
          requires: ["cookie","dom","event","yahoo"],
          varName: "YAHOO.ixl.topic"
        },

        "flowdialog": {
          type: "js",
          path: "common/flowdialog.js",
          requires: ["animation", "button", "connection", "container",
                     "dragdrop", "ixlutils"],
          optional: ["json"]
        },

        "login": {
          type: "js",
          path: "account/login.js",
          requires: ["cookie", "flowdialog", "ixlutils"],
          varName: "redirectByUserType"
        },

        "marketing": {
          type: "js",
          path: "marketing/marketing.js",
          requires: ["flowdialog"],
          varName: "YAHOO.widget.FlowDialog"
        },

        "profile": {
          type: "js",
          path: "account/profile.js",
          requires: ["carousel", "cookie", "flowdialog", "ixlutils", "json"],
          varName: "profileDialog"
        },

        "accordion": {
          type: "js",
          path: "navigation/accordion.js",
          requires: ["cookie", "flowdialog", "ixlutils"]
        },

        "screenshots": {
          type: "js",
          path: "navigation/skillscreenshots.js",
          requires: ["container"],
          varName: "YAHOO.ixl.widget.ScreenshotTooltip"
        },

        /*********************************************************************
         *                        Specific modules                           *
         *********************************************************************/

        "account": {
          type: "js",
          path: "account/account.js",
          requires: ["connection", "dom", "event", "flowdialog", "json"],
          varName: "printReceipt"
        },

        "labadmin": {
          type: "js",
          path: "admin/admin.js",
          requires: ["datasource", "datatable"],
          varName: "YAHOO.widget.DataTable"
        },

        "awardsgame": {
          type: "js",
          path: "awards/game.js",
          requires: ["datasource", "datatable", "flowdialog",
                     "history", "ixlutils", "json", "tabview"],
          varName: "YAHOO.widget.GameBoard"
        },

        "noaccess": {
          type: "js",
          path: "common/noAccess.js",
          requires: ["flowdialog", "ixlutils"],
          varName: "YAHOO.widget.FlowDialog"
        },

        "comingsoon": {
          type: "js",
          path: "marketing/comingsoon.js",
          requires: ["accordion", "button", "connection", "dom", "event"],
          varName: "csLoaded"
        },

        "playtimer": {
          type: "js",
          path: "practice/playtimer.js",
          requires: ["ixlutils"],
          varName: "YAHOO.ixl.PlayTimer"
        },

        "playevents": {
          type: "js",
          path: "practice/playevents.js",
          requires: ["connection", "cookie", "dom", "event", "flowdialog",
                     "ixlutils", "json"],
          varName: "YAHOO.ixl.correctAccolades"
        },

        "practiceaudio": {
          type: "js",
          path: "practice/practiceaudio.js",
          requires: ["button", "flowdialog", "swf"],
          varName: "YAHOO.ixl.AudioManager"
        },

        "qgtest": {
          type: "js",
          path: "practice/qgtest.js",
          requires: ["autocomplete", "container", "datasource", "dom", "event"],
          varName: "writetxt"
        },

        "multiplestandards": {
          type: "js",
          path: "standards/multiplestandards.js",
          requires: ["connection", "cookie", "dom", "event"],
          varName: "YAHOO.ixl.multiStds"
        },

        "standards": {
          type: "js",
          path: "standards/standards.js",
          requires: ["container", "event"],
          varName: "YAHOO.widget.FlowDialog"
        },

        "roster": {
          type: "js",
          path: "roster/roster.js",
          requires: ["connection", "dom", "event", "flowdialog"],
          varName: "YAHOO.widget.FlowDialog"
        },

        "masterlist": {
          type: "js",
          path: "roster/ixlmasterlist.js",
          requires: ["autocomplete"],
          varName: "YAHOO.widget.RosterAutoComplete"
        },


        // Subscription JS

        "activation": {
          type: "js",
          path: "subscription/activation.js",
          requires: ["connection", "dom", "event", "ixlutils", "json"],
          varName: "YAHOO.util.Connect"
        },

        "classroom": {
          type: "js",
          path: "subscription/classroom.js",
          requires: ["dom", "event"],
          varName: "YAHOO.util.Event"
        },

        "stepone": {
          type: "js",
          path: "subscription/stepone.js",
          requires: ["container", "dom", "event"],
          varName: "YAHOO.util.Event"
        },

        "steptwo": {
          type: "js",
          path: "subscription/steptwo.js",
          requires: ["container", "dom", "event", "json"],
          varName: "YAHOO.util.Event"
        },

        "removechildren": {
          type: "js",
          path: "subscription/removechildren.js",
          requires: ["flowdialog", "ixlutils"],
          varName: "YAHOO.widget.FlowDialog"
        },

        // Reports
        "advreports": {
          type: "js",
          path: "reports/advreports.js",
          requires: ["accordion", "cookie"],
          varName: "YAHOO.widget.AdvancedReport"
        },

        "advreportlanding": {
          type: "js",
          path: "reports/advreportlanding.js",
          requires: ["accordion", "datasource", "dom", "event"],
          varName: "setImage"
        },

        "a8": {
          type: "js",
          path: "reports/usage/a8.js",
          requires: ["datatable", "paginator", "practiceaudio"],
          varName: "YAHOO.ixl.ProblemDetailsDataTable"
        }

      }
    }
  };

  // Populate the useIXLBase field
  for (var name in IXL.info.moduleInfo) {
    IXL.useIXLBase[IXL.info.moduleInfo[name].path] = true;
  }

  var IXLLoader = function(o) {
    IXLLoader.superclass.constructor.call(this, o);

    this.base = IXL.info.base;
    this.ixlBase = IXL.info.ixlBase;
    this.comboBase = IXL.info.comboBase;
    this.root = IXL.info.root;
    this.moduleInfo = lang.merge(this.moduleInfo, IXL.info.moduleInfo);
    this.skin = lang.merge(this.skin, IXL.info.skin);
  };

  YAHOO.extend(IXLLoader, YUILoader, {
    _url: function(path) {
      var base = this.base || "";
      if (IXL.useIXLBase[path]) base = this.ixlBase;
      return this._filter(base + path);
    }
  });

  util.IXLLoader = IXLLoader;

})();
