author | Giulio Cesare Solaroli <giulio.cesare@solaroli.it> | 2011-10-03 16:04:12 (UTC) |
---|---|---|
committer | Giulio Cesare Solaroli <giulio.cesare@solaroli.it> | 2011-10-03 16:04:12 (UTC) |
commit | 541bb378ddece2eab135a8066a16994e94436dea (patch) (unidiff) | |
tree | ff160ea3e26f7fe07fcfd401387c5a0232ca715e /frontend/gamma/js/MochiKit/Format.js | |
parent | 1bf431fd3d45cbdf4afa3e12afefe5d24f4d3bc7 (diff) | |
parent | ecad5e895831337216544e81f1a467e0c68c4a6a (diff) | |
download | clipperz-541bb378ddece2eab135a8066a16994e94436dea.zip clipperz-541bb378ddece2eab135a8066a16994e94436dea.tar.gz clipperz-541bb378ddece2eab135a8066a16994e94436dea.tar.bz2 |
Merge pull request #1 from gcsolaroli/master
First version of the restructured repository
Diffstat (limited to 'frontend/gamma/js/MochiKit/Format.js') (more/less context) (ignore whitespace changes)
-rw-r--r-- | frontend/gamma/js/MochiKit/Format.js | 309 |
1 files changed, 309 insertions, 0 deletions
diff --git a/frontend/gamma/js/MochiKit/Format.js b/frontend/gamma/js/MochiKit/Format.js new file mode 100644 index 0000000..122845e --- a/dev/null +++ b/frontend/gamma/js/MochiKit/Format.js | |||
@@ -0,0 +1,309 @@ | |||
1 | /*** | ||
2 | |||
3 | MochiKit.Format 1.5 | ||
4 | |||
5 | See <http://mochikit.com/> for documentation, downloads, license, etc. | ||
6 | |||
7 | (c) 2005 Bob Ippolito. All rights Reserved. | ||
8 | |||
9 | ***/ | ||
10 | |||
11 | MochiKit.Base._module('Format', '1.5', ['Base']); | ||
12 | |||
13 | MochiKit.Format._numberFormatter = function (placeholder, header, footer, locale, isPercent, precision, leadingZeros, separatorAt, trailingZeros) { | ||
14 | return function (num) { | ||
15 | num = parseFloat(num); | ||
16 | if (typeof(num) == "undefined" || num === null || isNaN(num)) { | ||
17 | return placeholder; | ||
18 | } | ||
19 | var curheader = header; | ||
20 | var curfooter = footer; | ||
21 | if (num < 0) { | ||
22 | num = -num; | ||
23 | } else { | ||
24 | curheader = curheader.replace(/-/, ""); | ||
25 | } | ||
26 | var me = arguments.callee; | ||
27 | var fmt = MochiKit.Format.formatLocale(locale); | ||
28 | if (isPercent) { | ||
29 | num = num * 100.0; | ||
30 | curfooter = fmt.percent + curfooter; | ||
31 | } | ||
32 | num = MochiKit.Format.roundToFixed(num, precision); | ||
33 | var parts = num.split(/\./); | ||
34 | var whole = parts[0]; | ||
35 | var frac = (parts.length == 1) ? "" : parts[1]; | ||
36 | var res = ""; | ||
37 | while (whole.length < leadingZeros) { | ||
38 | whole = "0" + whole; | ||
39 | } | ||
40 | if (separatorAt) { | ||
41 | while (whole.length > separatorAt) { | ||
42 | var i = whole.length - separatorAt; | ||
43 | //res = res + fmt.separator + whole.substring(i, whole.length); | ||
44 | res = fmt.separator + whole.substring(i, whole.length) + res; | ||
45 | whole = whole.substring(0, i); | ||
46 | } | ||
47 | } | ||
48 | res = whole + res; | ||
49 | if (precision > 0) { | ||
50 | while (frac.length < trailingZeros) { | ||
51 | frac = frac + "0"; | ||
52 | } | ||
53 | res = res + fmt.decimal + frac; | ||
54 | } | ||
55 | return curheader + res + curfooter; | ||
56 | }; | ||
57 | }; | ||
58 | |||
59 | /** @id MochiKit.Format.numberFormatter */ | ||
60 | MochiKit.Format.numberFormatter = function (pattern, placeholder/* = "" */, locale/* = "default" */) { | ||
61 | // http://java.sun.com/docs/books/tutorial/i18n/format/numberpattern.html | ||
62 | // | 0 | leading or trailing zeros | ||
63 | // | # | just the number | ||
64 | // | , | separator | ||
65 | // | . | decimal separator | ||
66 | // | % | Multiply by 100 and format as percent | ||
67 | if (typeof(placeholder) == "undefined") { | ||
68 | placeholder = ""; | ||
69 | } | ||
70 | var match = pattern.match(/((?:[0#]+,)?[0#]+)(?:\.([0#]+))?(%)?/); | ||
71 | if (!match) { | ||
72 | throw TypeError("Invalid pattern"); | ||
73 | } | ||
74 | var header = pattern.substr(0, match.index); | ||
75 | var footer = pattern.substr(match.index + match[0].length); | ||
76 | if (header.search(/-/) == -1) { | ||
77 | header = header + "-"; | ||
78 | } | ||
79 | var whole = match[1]; | ||
80 | var frac = (typeof(match[2]) == "string" && match[2] != "") ? match[2] : ""; | ||
81 | var isPercent = (typeof(match[3]) == "string" && match[3] != ""); | ||
82 | var tmp = whole.split(/,/); | ||
83 | var separatorAt; | ||
84 | if (typeof(locale) == "undefined") { | ||
85 | locale = "default"; | ||
86 | } | ||
87 | if (tmp.length == 1) { | ||
88 | separatorAt = null; | ||
89 | } else { | ||
90 | separatorAt = tmp[1].length; | ||
91 | } | ||
92 | var leadingZeros = whole.length - whole.replace(/0/g, "").length; | ||
93 | var trailingZeros = frac.length - frac.replace(/0/g, "").length; | ||
94 | var precision = frac.length; | ||
95 | var rval = MochiKit.Format._numberFormatter( | ||
96 | placeholder, header, footer, locale, isPercent, precision, | ||
97 | leadingZeros, separatorAt, trailingZeros | ||
98 | ); | ||
99 | var m = MochiKit.Base; | ||
100 | if (m) { | ||
101 | var fn = arguments.callee; | ||
102 | var args = m.concat(arguments); | ||
103 | rval.repr = function () { | ||
104 | return [ | ||
105 | self.NAME, | ||
106 | "(", | ||
107 | map(m.repr, args).join(", "), | ||
108 | ")" | ||
109 | ].join(""); | ||
110 | }; | ||
111 | } | ||
112 | return rval; | ||
113 | }; | ||
114 | |||
115 | /** @id MochiKit.Format.formatLocale */ | ||
116 | MochiKit.Format.formatLocale = function (locale) { | ||
117 | if (typeof(locale) == "undefined" || locale === null) { | ||
118 | locale = "default"; | ||
119 | } | ||
120 | if (typeof(locale) == "string") { | ||
121 | var rval = MochiKit.Format.LOCALE[locale]; | ||
122 | if (typeof(rval) == "string") { | ||
123 | rval = arguments.callee(rval); | ||
124 | MochiKit.Format.LOCALE[locale] = rval; | ||
125 | } | ||
126 | return rval; | ||
127 | } else { | ||
128 | return locale; | ||
129 | } | ||
130 | }; | ||
131 | |||
132 | /** @id MochiKit.Format.twoDigitAverage */ | ||
133 | MochiKit.Format.twoDigitAverage = function (numerator, denominator) { | ||
134 | if (denominator) { | ||
135 | var res = numerator / denominator; | ||
136 | if (!isNaN(res)) { | ||
137 | return MochiKit.Format.twoDigitFloat(res); | ||
138 | } | ||
139 | } | ||
140 | return "0"; | ||
141 | }; | ||
142 | |||
143 | /** @id MochiKit.Format.twoDigitFloat */ | ||
144 | MochiKit.Format.twoDigitFloat = function (aNumber) { | ||
145 | var res = roundToFixed(aNumber, 2); | ||
146 | if (res.indexOf(".00") > 0) { | ||
147 | return res.substring(0, res.length - 3); | ||
148 | } else if (res.charAt(res.length - 1) == "0") { | ||
149 | return res.substring(0, res.length - 1); | ||
150 | } else { | ||
151 | return res; | ||
152 | } | ||
153 | }; | ||
154 | |||
155 | /** @id MochiKit.Format.lstrip */ | ||
156 | MochiKit.Format.lstrip = function (str, /* optional */chars) { | ||
157 | str = str + ""; | ||
158 | if (typeof(str) != "string") { | ||
159 | return null; | ||
160 | } | ||
161 | if (!chars) { | ||
162 | return str.replace(/^\s+/, ""); | ||
163 | } else { | ||
164 | return str.replace(new RegExp("^[" + chars + "]+"), ""); | ||
165 | } | ||
166 | }; | ||
167 | |||
168 | /** @id MochiKit.Format.rstrip */ | ||
169 | MochiKit.Format.rstrip = function (str, /* optional */chars) { | ||
170 | str = str + ""; | ||
171 | if (typeof(str) != "string") { | ||
172 | return null; | ||
173 | } | ||
174 | if (!chars) { | ||
175 | return str.replace(/\s+$/, ""); | ||
176 | } else { | ||
177 | return str.replace(new RegExp("[" + chars + "]+$"), ""); | ||
178 | } | ||
179 | }; | ||
180 | |||
181 | /** @id MochiKit.Format.strip */ | ||
182 | MochiKit.Format.strip = function (str, /* optional */chars) { | ||
183 | var self = MochiKit.Format; | ||
184 | return self.rstrip(self.lstrip(str, chars), chars); | ||
185 | }; | ||
186 | |||
187 | /** @id MochiKit.Format.truncToFixed */ | ||
188 | MochiKit.Format.truncToFixed = function (aNumber, precision) { | ||
189 | var fixed = MochiKit.Format._numberToFixed(aNumber, precision); | ||
190 | var fracPos = fixed.indexOf("."); | ||
191 | if (fracPos > 0 && fracPos + precision + 1 < fixed.length) { | ||
192 | fixed = fixed.substring(0, fracPos + precision + 1); | ||
193 | fixed = MochiKit.Format._shiftNumber(fixed, 0); | ||
194 | } | ||
195 | return fixed; | ||
196 | } | ||
197 | |||
198 | /** @id MochiKit.Format.roundToFixed */ | ||
199 | MochiKit.Format.roundToFixed = function (aNumber, precision) { | ||
200 | var fixed = MochiKit.Format._numberToFixed(aNumber, precision); | ||
201 | var fracPos = fixed.indexOf("."); | ||
202 | if (fracPos > 0 && fracPos + precision + 1 < fixed.length) { | ||
203 | var str = MochiKit.Format._shiftNumber(fixed, precision); | ||
204 | str = MochiKit.Format._numberToFixed(Math.round(parseFloat(str)), 0); | ||
205 | fixed = MochiKit.Format._shiftNumber(str, -precision); | ||
206 | } | ||
207 | return fixed; | ||
208 | } | ||
209 | |||
210 | /** | ||
211 | * Converts a number to a fixed format string. This function handles | ||
212 | * conversion of exponents by shifting the decimal point to the left | ||
213 | * or the right. It also guarantees a specified minimum number of | ||
214 | * fractional digits (but no maximum). | ||
215 | * | ||
216 | * @param {Number} aNumber the number to convert | ||
217 | * @param {Number} precision the minimum number of decimal digits | ||
218 | * | ||
219 | * @return {String} the fixed format number string | ||
220 | */ | ||
221 | MochiKit.Format._numberToFixed = function (aNumber, precision) { | ||
222 | var str = aNumber.toString(); | ||
223 | var parts = str.split(/[eE]/); | ||
224 | var exp = (parts.length === 1) ? 0 : parseInt(parts[1]) || 0; | ||
225 | var fixed = MochiKit.Format._shiftNumber(parts[0], exp); | ||
226 | parts = fixed.split(/\./); | ||
227 | var whole = parts[0]; | ||
228 | var frac = (parts.length === 1) ? "" : parts[1]; | ||
229 | while (frac.length < precision) { | ||
230 | frac += "0"; | ||
231 | } | ||
232 | if (frac.length > 0) { | ||
233 | return whole + "." + frac; | ||
234 | } else { | ||
235 | return whole; | ||
236 | } | ||
237 | } | ||
238 | |||
239 | /** | ||
240 | * Shifts the decimal dot location in a fixed format number string. | ||
241 | * This function handles negative values and will add and remove | ||
242 | * leading and trailing zeros as needed. | ||
243 | * | ||
244 | * @param {String} num the fixed format number string | ||
245 | * @param {Number} exp the base-10 exponent to apply | ||
246 | * | ||
247 | * @return {String} the new fixed format number string | ||
248 | */ | ||
249 | MochiKit.Format._shiftNumber = function (num, exp) { | ||
250 | var pos = num.indexOf("."); | ||
251 | if (pos < 0) { | ||
252 | pos = num.length; | ||
253 | } else { | ||
254 | num = num.substring(0, pos) + num.substring(pos + 1); | ||
255 | } | ||
256 | pos += exp; | ||
257 | while (pos <= 0 || (pos <= 1 && num.charAt(0) === "-")) { | ||
258 | if (num.charAt(0) === "-") { | ||
259 | num = "-0" + num.substring(1); | ||
260 | } else { | ||
261 | num = "0" + num; | ||
262 | } | ||
263 | pos++; | ||
264 | } | ||
265 | while (pos > num.length) { | ||
266 | num += "0"; | ||
267 | } | ||
268 | if (pos < num.length) { | ||
269 | num = num.substring(0, pos) + "." + num.substring(pos); | ||
270 | } | ||
271 | while (/^0[^.]/.test(num)) { | ||
272 | num = num.substring(1); | ||
273 | } | ||
274 | while (/^-0[^.]/.test(num)) { | ||
275 | num = "-" + num.substring(2); | ||
276 | } | ||
277 | return num; | ||
278 | } | ||
279 | |||
280 | /** @id MochiKit.Format.percentFormat */ | ||
281 | MochiKit.Format.percentFormat = function (aNumber) { | ||
282 | return MochiKit.Format.twoDigitFloat(100 * aNumber) + '%'; | ||
283 | }; | ||
284 | |||
285 | MochiKit.Format.LOCALE = { | ||
286 | en_US: {separator: ",", decimal: ".", percent: "%"}, | ||
287 | de_DE: {separator: ".", decimal: ",", percent: "%"}, | ||
288 | pt_BR: {separator: ".", decimal: ",", percent: "%"}, | ||
289 | fr_FR: {separator: " ", decimal: ",", percent: "%"}, | ||
290 | "default": "en_US", | ||
291 | __export__: false | ||
292 | }; | ||
293 | |||
294 | MochiKit.Format.__new__ = function () { | ||
295 | MochiKit.Base.nameFunctions(this); | ||
296 | var base = this.NAME + "."; | ||
297 | var k, v, o; | ||
298 | for (k in this.LOCALE) { | ||
299 | o = this.LOCALE[k]; | ||
300 | if (typeof(o) == "object") { | ||
301 | o.repr = function () { return this.NAME; }; | ||
302 | o.NAME = base + "LOCALE." + k; | ||
303 | } | ||
304 | } | ||
305 | }; | ||
306 | |||
307 | MochiKit.Format.__new__(); | ||
308 | |||
309 | MochiKit.Base._exportSymbols(this, MochiKit.Format); | ||