
if (typeof MW == "undefined" || !MW) {
	var MW = {};
}

/**
 * Returns the namespace specified and creates it if it doesn't exist
 * <pre>
 * MW.namespace("property.package");
 * MW.namespace("MW.property.package");
 * </pre>
 * Either of the above would create MW.property, then
 * MW.property.package
 *
 * This method is copied from YUI's global YAHOO object.
 *
 * @method namespace
 * @static
 * @param  {String*} arguments 1-n namespaces to create 
 * @return {Object}  A reference to the last namespace object created
 */
MW.namespace = function() {
    var a=arguments, o=null, i, j, d;
    for (i=0; i<a.length; i=i+1) {
        d=(""+a[i]).split(".");
        o=MW;

        // MW is implied, so it is ignored if it is included
        for (j=(d[0] == "MW") ? 1 : 0; j<d.length; j=j+1) {
            o[d[j]]=o[d[j]] || {};
            o=o[d[j]];
        }
    }

    return o;
};

MW.namespace("util");

/**
 * String manipulation methods.
 */
MW.util.String = {
	/**
	 * sprintf() for JavaScript v.0.4
	 *
	 * Copyright (c) 2007 Alexandru Marasteanu <http://alexei.417.ro/>
	 * Thanks to David Baird (unit test and patch).
	 *
	 * This program is free software; you can redistribute it and/or modify it under
	 * the terms of the GNU General Public License as published by the Free Software
	 * Foundation; either version 2 of the License, or (at your option) any later
	 * version.
	 *
	 * This program is distributed in the hope that it will be useful, but WITHOUT
	 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
	 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
	 * details.
	 *
	 * You should have received a copy of the GNU General Public License along with
	 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
	 * Place, Suite 330, Boston, MA 02111-1307 USA
	 */
	repeat: function (i, m) { for (var o = []; m > 0; o[--m] = i); return(o.join("")); },
	format: function() {
		var i = 0, a, f = arguments[i++], o = [], m, p, c, x;
		while (f) {
			if (m = /^[^\x25]+/.exec(f)) o.push(m[0]);
			else if (m = /^\x25{2}/.exec(f)) o.push("%");
			else if (m = /^\x25(?:(\d+)\$)?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(f)) {
				if (((a = arguments[m[1] || i++]) == null) || (a == undefined)) throw("Too few arguments.");
				if (/[^s]/.test(m[7]) && (typeof(a) != "number"))
					throw("Expecting number but found " + typeof(a));
				switch (m[7]) {
					case "b": a = a.toString(2); break;
					case "c": a = String.fromCharCode(a); break;
					case "d": a = parseInt(a); break;
					case "e": a = m[6] ? a.toExponential(m[6]) : a.toExponential(); break;
					case "f": a = m[6] ? parseFloat(a).toFixed(m[6]) : parseFloat(a); break;
					case "o": a = a.toString(8); break;
					case "s": a = ((a = String(a)) && m[6] ? a.substring(0, m[6]) : a); break;
					case "u": a = Math.abs(a); break;
					case "x": a = a.toString(16); break;
					case "X": a = a.toString(16).toUpperCase(); break;
				}
				a = (/[def]/.test(m[7]) && m[2] && a > 0 ? "+" + a : a);
				c = m[3] ? m[3] == "0" ? "0" : m[3].charAt(1) : " ";
				x = m[5] - String(a).length;
				p = m[5] ? this.repeat(c, x) : "";
				o.push(m[4] ? a + p : p + a);
			}
			else throw ("Huh ?!");
			f = f.substring(m[0].length);
		}
		return o.join("");
	}
}
