Bug 435739 Poor performance of Firefox 3 with no X RENDER extension
[wine-gecko.git] / testing / mochitest / MochiKit / Format.js
blob8890bd573a6cbfe47fdbef1d056cf422ee3cdaa9
1 /***
3 MochiKit.Format 1.4
5 See <http://mochikit.com/> for documentation, downloads, license, etc.
7 (c) 2005 Bob Ippolito.  All rights Reserved.
9 ***/
11 if (typeof(dojo) != 'undefined') {
12     dojo.provide('MochiKit.Format');
15 if (typeof(MochiKit) == 'undefined') {
16     MochiKit = {};
19 if (typeof(MochiKit.Format) == 'undefined') {
20     MochiKit.Format = {};
23 MochiKit.Format.NAME = "MochiKit.Format";
24 MochiKit.Format.VERSION = "1.4";
25 MochiKit.Format.__repr__ = function () {
26     return "[" + this.NAME + " " + this.VERSION + "]";
28 MochiKit.Format.toString = function () {
29     return this.__repr__();
32 MochiKit.Format._numberFormatter = function (placeholder, header, footer, locale, isPercent, precision, leadingZeros, separatorAt, trailingZeros) {
33     return function (num) {
34         num = parseFloat(num);
35         if (typeof(num) == "undefined" || num === null || isNaN(num)) {
36             return placeholder;
37         }
38         var curheader = header;
39         var curfooter = footer;
40         if (num < 0) {
41             num = -num;
42         } else {
43             curheader = curheader.replace(/-/, "");
44         }
45         var me = arguments.callee;
46         var fmt = MochiKit.Format.formatLocale(locale);
47         if (isPercent) {
48             num = num * 100.0;
49             curfooter = fmt.percent + curfooter;
50         }
51         num = MochiKit.Format.roundToFixed(num, precision);
52         var parts = num.split(/\./);
53         var whole = parts[0];
54         var frac = (parts.length == 1) ? "" : parts[1];
55         var res = "";
56         while (whole.length < leadingZeros) {
57             whole = "0" + whole;
58         }
59         if (separatorAt) {
60             while (whole.length > separatorAt) {
61                 var i = whole.length - separatorAt;
62                 //res = res + fmt.separator + whole.substring(i, whole.length);
63                 res = fmt.separator + whole.substring(i, whole.length) + res;
64                 whole = whole.substring(0, i);
65             }
66         }
67         res = whole + res;
68         if (precision > 0) {
69             while (frac.length < trailingZeros) {
70                 frac = frac + "0";
71             }
72             res = res + fmt.decimal + frac;
73         }
74         return curheader + res + curfooter;
75     };
78 /** @id MochiKit.Format.numberFormatter */
79 MochiKit.Format.numberFormatter = function (pattern, placeholder/* = "" */, locale/* = "default" */) {
80     // http://java.sun.com/docs/books/tutorial/i18n/format/numberpattern.html
81     // | 0 | leading or trailing zeros
82     // | # | just the number
83     // | , | separator
84     // | . | decimal separator
85     // | % | Multiply by 100 and format as percent
86     if (typeof(placeholder) == "undefined") {
87         placeholder = "";
88     }
89     var match = pattern.match(/((?:[0#]+,)?[0#]+)(?:\.([0#]+))?(%)?/);
90     if (!match) {
91         throw TypeError("Invalid pattern");
92     }
93     var header = pattern.substr(0, match.index);
94     var footer = pattern.substr(match.index + match[0].length);
95     if (header.search(/-/) == -1) {
96         header = header + "-";
97     }
98     var whole = match[1];
99     var frac = (typeof(match[2]) == "string" && match[2] != "") ? match[2] : "";
100     var isPercent = (typeof(match[3]) == "string" && match[3] != "");
101     var tmp = whole.split(/,/);
102     var separatorAt;
103     if (typeof(locale) == "undefined") {
104         locale = "default";
105     }
106     if (tmp.length == 1) {
107         separatorAt = null;
108     } else {
109         separatorAt = tmp[1].length;
110     }
111     var leadingZeros = whole.length - whole.replace(/0/g, "").length;
112     var trailingZeros = frac.length - frac.replace(/0/g, "").length;
113     var precision = frac.length;
114     var rval = MochiKit.Format._numberFormatter(
115         placeholder, header, footer, locale, isPercent, precision,
116         leadingZeros, separatorAt, trailingZeros
117     );
118     var m = MochiKit.Base;
119     if (m) {
120         var fn = arguments.callee;
121         var args = m.concat(arguments);
122         rval.repr = function () {
123             return [
124                 self.NAME,
125                 "(",
126                 map(m.repr, args).join(", "),
127                 ")"
128             ].join("");
129         };
130     }
131     return rval;
134 /** @id MochiKit.Format.formatLocale */
135 MochiKit.Format.formatLocale = function (locale) {
136     if (typeof(locale) == "undefined" || locale === null) {
137         locale = "default";
138     }
139     if (typeof(locale) == "string") {
140         var rval = MochiKit.Format.LOCALE[locale];
141         if (typeof(rval) == "string") {
142             rval = arguments.callee(rval);
143             MochiKit.Format.LOCALE[locale] = rval;
144         }
145         return rval;
146     } else {
147         return locale;
148     }
151 /** @id MochiKit.Format.twoDigitAverage */
152 MochiKit.Format.twoDigitAverage = function (numerator, denominator) {
153     if (denominator) {
154         var res = numerator / denominator;
155         if (!isNaN(res)) {
156             return MochiKit.Format.twoDigitFloat(numerator / denominator);
157         }
158     }
159     return "0";
162 /** @id MochiKit.Format.twoDigitFloat */
163 MochiKit.Format.twoDigitFloat = function (someFloat) {
164     var sign = (someFloat < 0 ? '-' : '');
165     var s = Math.floor(Math.abs(someFloat) * 100).toString();
166     if (s == '0') {
167         return s;
168     }
169     if (s.length < 3) {
170         while (s.charAt(s.length - 1) == '0') {
171             s = s.substring(0, s.length - 1);
172         }
173         return sign + '0.' + s;
174     }
175     var head = sign + s.substring(0, s.length - 2);
176     var tail = s.substring(s.length - 2, s.length);
177     if (tail == '00') {
178         return head;
179     } else if (tail.charAt(1) == '0') {
180         return head + '.' + tail.charAt(0);
181     } else {
182         return head + '.' + tail;
183     }
186 /** @id MochiKit.Format.lstrip */
187 MochiKit.Format.lstrip = function (str, /* optional */chars) {
188     str = str + "";
189     if (typeof(str) != "string") {
190         return null;
191     }
192     if (!chars) {
193         return str.replace(/^\s+/, "");
194     } else {
195         return str.replace(new RegExp("^[" + chars + "]+"), "");
196     }
199 /** @id MochiKit.Format.rstrip */
200 MochiKit.Format.rstrip = function (str, /* optional */chars) {
201     str = str + "";
202     if (typeof(str) != "string") {
203         return null;
204     }
205     if (!chars) {
206         return str.replace(/\s+$/, "");
207     } else {
208         return str.replace(new RegExp("[" + chars + "]+$"), "");
209     }
212 /** @id MochiKit.Format.strip */
213 MochiKit.Format.strip = function (str, /* optional */chars) {
214     var self = MochiKit.Format;
215     return self.rstrip(self.lstrip(str, chars), chars);
218 /** @id MochiKit.Format.truncToFixed */
219 MochiKit.Format.truncToFixed = function (aNumber, precision) {
220     aNumber = Math.floor(aNumber * Math.pow(10, precision));
221     var res = (aNumber * Math.pow(10, -precision)).toFixed(precision);
222     if (res.charAt(0) == ".") {
223         res = "0" + res;
224     }
225     return res;
228 /** @id MochiKit.Format.roundToFixed */
229 MochiKit.Format.roundToFixed = function (aNumber, precision) {
230     return MochiKit.Format.truncToFixed(
231         aNumber + 0.5 * Math.pow(10, -precision),
232         precision
233     );
236 /** @id MochiKit.Format.percentFormat */
237 MochiKit.Format.percentFormat = function (someFloat) {
238     return MochiKit.Format.twoDigitFloat(100 * someFloat) + '%';
241 MochiKit.Format.EXPORT = [
242     "truncToFixed",
243     "roundToFixed",
244     "numberFormatter",
245     "formatLocale",
246     "twoDigitAverage",
247     "twoDigitFloat",
248     "percentFormat",
249     "lstrip",
250     "rstrip",
251     "strip"
254 MochiKit.Format.LOCALE = {
255     en_US: {separator: ",", decimal: ".", percent: "%"},
256     de_DE: {separator: ".", decimal: ",", percent: "%"},
257     fr_FR: {separator: " ", decimal: ",", percent: "%"},
258     "default": "en_US"
261 MochiKit.Format.EXPORT_OK = [];
262 MochiKit.Format.EXPORT_TAGS = {
263     ':all': MochiKit.Format.EXPORT,
264     ':common': MochiKit.Format.EXPORT
267 MochiKit.Format.__new__ = function () {
268     // MochiKit.Base.nameFunctions(this);
269     var base = this.NAME + ".";
270     var k, v, o;
271     for (k in this.LOCALE) {
272         o = this.LOCALE[k];
273         if (typeof(o) == "object") {
274             o.repr = function () { return this.NAME; };
275             o.NAME = base + "LOCALE." + k;
276         }
277     }
278     for (k in this) {
279         o = this[k];
280         if (typeof(o) == 'function' && typeof(o.NAME) == 'undefined') {
281             try {
282                 o.NAME = base + k;
283             } catch (e) {
284                 // pass
285             }
286         }
287     }
290 MochiKit.Format.__new__();
292 if (typeof(MochiKit.Base) != "undefined") {
293     MochiKit.Base._exportSymbols(this, MochiKit.Format);
294 } else {
295     (function (globals, module) {
296         if ((typeof(JSAN) == 'undefined' && typeof(dojo) == 'undefined')
297             || (MochiKit.__export__ === false)) {
298             var all = module.EXPORT_TAGS[":all"];
299             for (var i = 0; i < all.length; i++) {
300                 globals[all[i]] = module[all[i]]; 
301             }
302         }   
303     })(this, MochiKit.Format);