]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/chrome/content/util/sprintf.js
LP#1084758 store staff client tpac (etc) zoom pref
[working/Evergreen.git] / Open-ILS / xul / staff_client / chrome / content / util / sprintf.js
1 /* Copyright (c) 2005 Scott S. McCoy
2  * This was originally a non-object oriented interface
3 * Function printf(format_string,arguments...)
4  * Javascript emulation of the C printf function (modifiers and argument types 
5  *    "p" and "n" are not supported due to language restrictions)
6  *
7  * Copyright 2003 K&L Productions. All rights reserved
8  * http://www.klproductions.com 
9  *
10  * Terms of use: This function can be used free of charge IF this header is not
11  *               modified and remains with the function code.
12  * 
13  * Legal: Use this code at your own risk. K&L Productions assumes NO resposibility
14  *        for anything.
15  ********************************************************************************/
16
17 String.prototype.sprintf = function () {
18   var fstring = this.toString();
19
20   var pad = function(str,ch,len) { var ps='';
21       for(var i=0; i<Math.abs(len); i++) {
22           ps+=ch;
23       }
24       return len>0?str+ps:ps+str;
25   };
26   var processFlags = function(flags,width,rs,arg) { 
27       var pn = function(flags,arg,rs) {
28           if(arg>=0) { 
29               if(flags.indexOf(' ')>=0) {
30                   rs = ' ' + rs;
31               } else if(flags.indexOf('+')>=0) {
32                   rs = '+' + rs;
33               }
34           } else {
35               rs = '-' + rs;
36           }
37           return rs;
38       };
39       var iWidth = parseInt(width,10);
40       if(width.charAt(0) == '0') {
41           var ec=0;
42           if(flags.indexOf(' ')>=0 || flags.indexOf('+')>=0) {
43               ec++;
44           }
45           if(rs.length<(iWidth-ec)) {
46               rs = pad(rs,'0',rs.length-(iWidth-ec));
47           }
48           return pn(flags,arg,rs);
49       }
50       rs = pn(flags,arg,rs);
51       if(rs.length<iWidth) {
52           if(flags.indexOf('-')<0) {
53               rs = pad(rs,' ',rs.length-iWidth);
54           } else {
55               rs = pad(rs,' ',iWidth - rs.length);
56           }
57       }    
58       return rs;
59   };
60   var converters = [];
61   converters.c = function(flags,width,precision,arg) { 
62       if (typeof(arg) == 'number') {
63           return String.fromCharCode(arg);
64       } else if (typeof(arg) == 'string') {
65           return arg.charAt(0);
66       } else {
67           return '';
68       }
69   };
70   converters.d = function(flags,width,precision,arg) { 
71       return converters.i(flags,width,precision,arg); 
72   };
73   converters.u = function(flags,width,precision,arg) { 
74       return converters.i(flags,width,precision,Math.abs(arg)); 
75   };
76   converters.i =  function(flags,width,precision,arg) {
77       var iPrecision=parseInt(precision, 10);
78       var rs = ((Math.abs(arg)).toString().split('.'))[0];
79       if(rs.length<iPrecision) {
80           rs=pad(rs,' ',iPrecision - rs.length);
81       }
82       return processFlags(flags,width,rs,arg); 
83   };
84   converters.E = function(flags,width,precision,arg) {
85       return (converters.e(flags,width,precision,arg)).toUpperCase();
86   };
87   converters.e = function(flags,width,precision,arg) {
88       iPrecision = parseInt(precision, 10);
89       if(isNaN(iPrecision)) {
90           iPrecision = 6;
91       }
92       rs = (Math.abs(arg)).toExponential(iPrecision);
93       if(rs.indexOf('.')<0 && flags.indexOf('#')>=0) {
94           rs = rs.replace(/^(.*)(e.*)$/,'$1.$2');
95       }
96       return processFlags(flags,width,rs,arg);        
97   };
98   converters.f = function(flags,width,precision,arg) { 
99       iPrecision = parseInt(precision, 10);
100       if(isNaN(iPrecision)) {
101           iPrecision = 6;
102       }
103       rs = (Math.abs(arg)).toFixed(iPrecision);
104       if(rs.indexOf('.')<0 && flags.indexOf('#')>=0) {
105           rs = rs + '.';
106       }
107       return processFlags(flags,width,rs,arg);
108   };
109   converters.G = function(flags,width,precision,arg) { 
110       return (converters.g(flags,width,precision,arg)).toUpperCase();
111   };
112   converters.g = function(flags,width,precision,arg) {
113       iPrecision = parseInt(precision, 10);
114       absArg = Math.abs(arg);
115       rse = absArg.toExponential();
116       rsf = absArg.toFixed(6);
117       if(!isNaN(iPrecision)) { 
118           rsep = absArg.toExponential(iPrecision);
119           rse = rsep.length < rse.length ? rsep : rse;
120           rsfp = absArg.toFixed(iPrecision);
121           rsf = rsfp.length < rsf.length ? rsfp : rsf;
122       }
123       if(rse.indexOf('.')<0 && flags.indexOf('#')>=0) {
124           rse = rse.replace(/^(.*)(e.*)$/,'$1.$2');
125       }
126       if(rsf.indexOf('.')<0 && flags.indexOf('#')>=0) {
127           rsf = rsf + '.';
128       }
129       rs = rse.length<rsf.length ? rse : rsf;
130       return processFlags(flags,width,rs,arg);        
131   };  
132   converters.o = function(flags,width,precision,arg) { 
133       var iPrecision=parseInt(precision, 10);
134       var rs = Math.round(Math.abs(arg)).toString(8);
135       if(rs.length<iPrecision) {
136           rs=pad(rs,' ',iPrecision - rs.length);
137       }
138       if(flags.indexOf('#')>=0) {
139           rs='0'+rs;
140       }
141       return processFlags(flags,width,rs,arg); 
142   };
143   converters.X = function(flags,width,precision,arg) { 
144       return (converters.x(flags,width,precision,arg)).toUpperCase();
145   };
146   converters.x = function(flags,width,precision,arg) { 
147       var iPrecision=parseInt(precision, 10);
148       arg = Math.abs(arg);
149       var rs = Math.round(arg).toString(16);
150       if(rs.length<iPrecision) {
151           rs=pad(rs,' ',iPrecision - rs.length);
152       }
153       if(flags.indexOf('#')>=0) {
154           rs='0x'+rs;
155       }
156       return processFlags(flags,width,rs,arg); 
157   };
158   converters.s = function(flags,width,precision,arg) { 
159       var iPrecision=parseInt(precision, 10);
160       var rs = arg;
161       if(rs.length > iPrecision) {
162           rs = rs.substring(0,iPrecision);
163       }
164       return processFlags(flags,width,rs,0);
165   };
166
167   farr = fstring.split('%');
168   retstr = farr[0];
169   fpRE = /^([-+ #]*)(?:(\d*)\$|)(\d*)\.?(\d*)([cdieEfFgGosuxX])(.*)$/;
170   for(var i = 1; i<farr.length; i++) { 
171       fps=fpRE.exec(farr[i]);
172       if(!fps) {
173           continue;
174       }
175       var my_i = fps[2] ? fps[2] : i;
176       if(arguments[my_i-1]) {
177           retstr+=converters[fps[5]](fps[1],fps[3],fps[4],arguments[my_i-1]);
178       }
179       retstr += fps[6];
180   }
181   return retstr;
182 };