76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav GlassYUI.add('loader-rollup', function(Y) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass/**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Optional automatic rollup logic for reducing http connections
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * when not using a combo service.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @module loader
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @submodule rollup
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass/**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Look for rollup packages to determine if all of the modules a
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * rollup supersedes are required. If so, include the rollup to
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * help reduce the total number of connections required. Called
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * by calculate(). This is an optional feature, and requires the
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * appropriate submodule to function.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _rollup
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @for Loader
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @private
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav GlassY.Loader.prototype._rollup = function() {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var i, j, m, s, r = this.required, roll,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass info = this.moduleInfo, rolled, c, smod;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // find and cache rollup modules
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (this.dirty || !this.rollups) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.rollups = {};
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass for (i in info) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (info.hasOwnProperty(i)) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass m = this.getModule(i);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // if (m && m.rollup && m.supersedes) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (m && m.rollup) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.rollups[i] = m;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // make as many passes as needed to pick up rollup rollups
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass for (;;) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass rolled = false;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // go through the rollup candidates
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass for (i in this.rollups) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (this.rollups.hasOwnProperty(i)) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // there can be only one, unless forced
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (!r[i] && ((!this.loaded[i]) || this.forceMap[i])) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass m = this.getModule(i);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass s = m.supersedes || [];
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass roll = false;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // @TODO remove continue
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (!m.rollup) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass continue;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass c = 0;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // check the threshold
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass for (j = 0; j < s.length; j++) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass smod = info[s[j]];
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // if the superseded module is loaded, we can't
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // load the rollup unless it has been forced.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (this.loaded[s[j]] && !this.forceMap[s[j]]) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass roll = false;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass break;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // increment the counter if this module is required.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // if we are beyond the rollup threshold, we will
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // use the rollup module
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass } else if (r[s[j]] && m.type == smod.type) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass c++;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // Y.log("adding to thresh: " + c + ", " + s[j]);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass roll = (c >= m.rollup);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (roll) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // Y.log("over thresh " + c + ", " + s[j]);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass break;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (roll) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // Y.log("adding rollup: " + i);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // add the rollup
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass r[i] = true;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass rolled = true;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // expand the rollup's dependencies
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.getRequires(m);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // if we made it here w/o rolling up something, we are done
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (!rolled) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass break;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass};
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass}, '@VERSION@' ,{requires:['loader-base']});