jgcharts.js 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779
  1. /*
  2. *
  3. * jQuery Google Charts plugin 0.9
  4. *
  5. * $Date: 2009/09/02 23:28:33 $
  6. * $Rev: 46 $
  7. *
  8. * @requires
  9. * Sugar Arrays - Dustin Diaz | http://www.dustindiaz.com
  10. *
  11. * Copyright (c) 2008 Massimiliano Balestrieri
  12. * Examples and docs at: http://maxb.net/blog/
  13. * Licensed GPL licenses:
  14. * http://www.gnu.org/licenses/gpl.html
  15. *
  16. */
  17. if(!window.jGCharts)
  18. jGCharts = {};
  19. jGCharts.Api = function(){
  20. // -------------- PRIVATE ATTR ----------------
  21. var _serie = 0;
  22. var _per_serie = 0;
  23. var _max = 0;
  24. var _min = 0;
  25. var _api = "http://chart.apis.google.com/chart?";
  26. var _params = {
  27. type : "cht",
  28. size : "chs",
  29. data : "chd",
  30. colors : "chco",
  31. scaling : "chds",
  32. axis_type : "chxt",
  33. axis_range : "chxr",
  34. axis_labels : "chxl",
  35. legend : "chdl",
  36. bar_width : "chbh",
  37. background : "chf",
  38. fillarea : "chm",//TODO : marker range & marker shape
  39. title : "chtt",
  40. title_style : "chts",
  41. grid : "chg",
  42. line_style : "chls",
  43. agent : "agent"
  44. };
  45. // chart type flags
  46. var _is_stacked = false;
  47. var _is_horizontal = false;
  48. var _is_vertical = false;
  49. var _is_fillarea = false;
  50. var _is_bar = false;
  51. var _is_line = false;
  52. var _is_pie = false;
  53. // defaults attr
  54. // type default value
  55. var _type = "bvg";
  56. // size default value
  57. var _size = "300x200";//WxH
  58. // title default value
  59. var _title = false;
  60. // title_style default value
  61. var _title_style = false;
  62. // data default value
  63. var _data = false;
  64. // legend default value
  65. var _legend = false;
  66. // axis labels default value
  67. var _axis_labels = [];
  68. var _axis_step = 1;
  69. // axis type default value
  70. var _axis_type = "x,y";
  71. // background default value
  72. var _bg = false;
  73. var _chbg = false;
  74. // background offset default value
  75. var _bg_offset = false;
  76. var _chbg_offset = false;
  77. // background type default value
  78. var _bg_type = "solid";
  79. var _chbg_type = "solid";
  80. // background angle default value
  81. var _bg_angle = 90;
  82. var _chbg_angle = 90;
  83. // background width default value
  84. var _bg_width = 10;
  85. var _chbg_width = 10;
  86. // background trasparency default value
  87. var _bg_trasparency = false;
  88. var _chbg_trasparency = false;
  89. // fillarea default value
  90. var _fillarea = false;
  91. // fillbottom default value
  92. var _fillbottom = false;
  93. // filltop default value
  94. var _filltop = false;
  95. // Bar width and spacing [only bar] default value
  96. var _bar_width = 20;
  97. var _bar_spacing = 1;
  98. //grid
  99. var _grid = false;
  100. var _grid_y = 10;
  101. var _grid_x = 10;
  102. var _grid_line = 10;
  103. var _grid_blank = 0;
  104. //lines
  105. var _lines = false;
  106. // ------------------------------------------------
  107. // Chart colors [all] chco OK
  108. var _palette = [ "5131C9","FFCC00","DA1B1B","FF9900","FF6600","CCFFFF","CCFF00",
  109. "CCCCCC","FF99CC","999900","999999","66FF00","66CC00","669900","660099",
  110. "33CC00","333399","000000"];
  111. var simpleEncoding = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  112. // -------------- PRIVATE METHODS ----------------
  113. // JavaScript snippet for encoding data
  114. // http://code.google.com/apis/chart/#encoding_data
  115. function simpleEncode(valueArray,maxValue) {
  116. //var chartData = ['s:'];
  117. var chartData = [];
  118. for (var i = 0; i < valueArray.length; i++) {
  119. var currentValue = valueArray[i];
  120. if (!isNaN(currentValue) && currentValue >= 0) {
  121. chartData.push(simpleEncoding.charAt(Math.round((simpleEncoding.length-1) * currentValue / maxValue)));
  122. }else {
  123. chartData.push('_');
  124. }
  125. }
  126. return chartData.join('');
  127. }
  128. // ------------------------------------------------
  129. // TYPE OPTIONS
  130. // Bar chart
  131. // chbh (opzioni: chbh=10 -> altezza 10)
  132. function _bar_options(){
  133. var _ret = _bar_width;
  134. if(_bar_spacing)
  135. _ret += "," + _bar_spacing;
  136. return _ret;
  137. }
  138. // Chart legend [bar, line, radar, scatter, venn]
  139. function _eval_legend(){
  140. if(!_legend.constructor == Array)
  141. throw new Error("Legend must be Array");
  142. var _ret = "";
  143. for(var x=0;x < _legend.length;x++)
  144. _ret += _legend[x] + "|";
  145. _ret = _rlasttrim(_ret,"|");
  146. //console.log("legend:" + _ret);
  147. return _ret;
  148. }
  149. // Chart data
  150. // chd=t:<chart data string>
  151. // If you have more than one set of data,
  152. // separate each set with a pipe character (|).
  153. // For example: chd=t:10.0,58.0,95.0|30.0,8.0,63.0
  154. function _eval_data(){
  155. //console.log(data);
  156. if(!_data.constructor == Array)
  157. throw new Error("Data must be Array");
  158. var _ret = '';
  159. // i dati mi arrivano per riga. gcharts li vuole per colonna!
  160. var _cols = [];
  161. for(var x=0;x < _data.length;x++){
  162. if(_data[x].constructor != Array)
  163. _data[x] = [_data[x]];
  164. //inverto i dati
  165. for(var y = 0;y < _data[x].length;y++){
  166. if(!_cols[y])
  167. _cols[y] = [];
  168. _cols[y].push((_data[x][y]));
  169. // setto quante serie ci sono nei dataset
  170. if(_cols[y].length > _per_serie){
  171. //if(_is_line)
  172. _per_serie = _cols[y].length;
  173. _serie = _data[x].length;
  174. }
  175. }
  176. // setto quante serie ci sono nei dataset
  177. // in teria potrei farlo una volta sola
  178. // per un qualche grafico devo farlo qui
  179. //if((_is_bar || _is_pie) && _data[x].length > _per_serie)
  180. // _per_serie = _data[x].length;
  181. //console.log(_per_serie);
  182. // setto il max e il min
  183. if(_is_stacked){
  184. _set_max(sum(_data[x]));
  185. _set_min(sum(_data[x]));
  186. }else{
  187. _set_max(_data[x]);
  188. _set_min(_data[x]);
  189. }
  190. }
  191. //console.log("X: " + _per_serie);
  192. //console.log("s: " + _serie);
  193. //TODO : check type
  194. //TODO : options
  195. // add fill top
  196. if(_is_fillarea && _filltop)
  197. _cols = _fill_top(_cols);
  198. // add fill bottom
  199. if(_is_fillarea && _fillbottom)
  200. _cols = _fill_bottom(_cols);
  201. // inverto le serie come se le aspetta google api
  202. // per colonna e non per riga.
  203. // io me li aspetto per riga
  204. for(var y=0;y < _cols.length;y++){
  205. //_ret += _cols[y].join(",") + "|";
  206. _ret += simpleEncode(_cols[y],_max) + ",";
  207. // console.log(_cols[y].join(",") + "|");
  208. }
  209. //console.log(_cols);
  210. //_ret = _rlasttrim(_ret,"|");
  211. _ret = _rlasttrim(_ret,",");
  212. //console.log(_ret);
  213. //_ret = "cefhjkqwrlgYcfgc,QSSVXXdkfZUMRTUQ,HJJMOOUbVPKDHKLH";
  214. return "s:" + _ret;
  215. }
  216. function _fill_bottom(_data){
  217. var _min_serie = [];
  218. for(var x = 1;x <= _per_serie;x++)
  219. _min_serie.push(0);
  220. _data.push(_min_serie);
  221. //console.log(_min_serie)
  222. return _data;
  223. }
  224. function _fill_top(_data){
  225. var _max_serie = [];
  226. for(var x = 1;x <= _per_serie;x++)
  227. _max_serie.push(_max);
  228. _data.unshift(_max_serie);
  229. return _data;
  230. }
  231. //after _data()
  232. function _color(){
  233. //console.log(colors);
  234. var _ret = "";var _t = "";var i = _serie;
  235. // add color (fake serie)
  236. if(_is_fillarea && _filltop)
  237. i++;
  238. for(var x = 0; x < i; x++){
  239. _t = _colors[x] || _palette[x];
  240. _ret += _t + ",";
  241. }
  242. _ret = _rlasttrim(_ret,",");
  243. //console.log(_ret);
  244. return _ret;
  245. }
  246. // ------------------------------------------------
  247. // Data scaling [all - no: Maps] OK chds
  248. // chds=<data set 1 minimum value>,<data set 1 maximum value>,<data set n minimum value>,<data set n maximum value>
  249. // maximum : omit to specify 100
  250. function _scaling(){
  251. return _min + "," + _max;
  252. }
  253. // call by _data()
  254. function _set_max(val){
  255. if(val.constructor == Array)
  256. val.forEach(function(nr){
  257. //if(nr)
  258. _set_max(nr);
  259. });
  260. else
  261. if(_max < val)
  262. _max = val;
  263. }
  264. function _set_min(val){
  265. if(val.constructor == Array)
  266. val.forEach(function(nr){
  267. //if(nr)
  268. _set_min(nr);
  269. });
  270. else
  271. if(_min > val)
  272. _min = val;
  273. }
  274. function _axis_range(){
  275. return "0,"+_min+","+ _max +"|1,"+_min+"," + _max;//?
  276. }
  277. // ------------------------------------------------
  278. // TODO: Pie chart and Google-o-meter labels [only bar e g-o-m]
  279. // Multiple axis labels [bar, line, radar, scatter]
  280. function _eval_labels(){
  281. var _ret = "";
  282. //le labels vanno invertite se il grafico è orizontale
  283. if(_axis_labels.length == 0 && _per_serie > 10)
  284. _axis_step = parseInt(_per_serie / 10);
  285. if(_is_horizontal){
  286. var _temp = [];
  287. for(var x= _axis_labels.length; x > 0; x--)
  288. _temp.push(_axis_labels[(x - 1)]);
  289. _axis_labels = _temp;
  290. }
  291. //console.log(labels);
  292. for(var x=0;x < _per_serie;x++){
  293. //console.log((x % _axis_step) == 0);
  294. var _val = (x % _axis_step) == 0 ? (_axis_labels[x] || x) : '' ;
  295. _ret += _val + "|";
  296. }
  297. //console.log(_ret);
  298. _ret = _rlasttrim(_ret,"|");
  299. //_ret = "first|second";
  300. //console.log("axis_labels: " + o);
  301. var _a = (_is_horizontal) ? 1 : 0;
  302. return _a + ":|" + _ret;// "&chxs=0,0000dd,10|3,0000dd,12,1";//TODO?"0:|gen|feb|
  303. }
  304. // ------------------------------------------------
  305. // Solid fill [all - bgcolor only: Google-o-meter | Maps]
  306. // chf=<bg or c or a>,s,<color>|<bg or c or a>,s,<color>
  307. // * <bg or c or a> is:
  308. // - bg for background fill
  309. // - c for chart area fill
  310. // - a to apply transparency to the whole chart.
  311. // * <s> indicates solid fill.
  312. // * <color> is an RRGGBB format hexadecimal number.
  313. // * the pipe character (|) separates fill definitions.
  314. // No pipe character is required after the second definition.
  315. // ------------------------------------------------
  316. // Linear gradient [all - bgcolor only: pie - no: Google-o-meter | Maps]
  317. // ------------------------------------------------
  318. // Linear stripes [all - bgcolor only: pie - no: Google-o-meter | Maps]
  319. function _background(){//bg, ch, type, bgkey, bgval, bgo, cho, bg_t, ch_t){
  320. var _type = _background_type(_bg_type);
  321. var _chtype = _background_type(_chbg_type);
  322. var _ret = "";
  323. if(_bg && _bg_trasparency)
  324. _bg += parseInt(_bg_trasparency);
  325. if(_bg && _type == "s")
  326. _ret = "bg,s," + _bg;
  327. if(_bg && _type == "lg")
  328. _ret = "bg,lg," + _bg_angle + "," + _bg + ",0," + _bg_offset +",1";
  329. if(_bg && _type == "ls")
  330. _ret = "bg,ls," + _bg_angle + "," + _bg + ",0." + parseInt(_bg_width/10) + "," + _bg_offset + ",0." + parseInt(_bg_width/10) ;
  331. //chart area
  332. if(_chbg && _chbg_trasparency)
  333. _chbg += parseInt(_chbg_trasparency);
  334. if(_chbg && _bg)
  335. _ret += '|';
  336. if(_chbg && _chtype == "s")
  337. _ret += "c,s," + _chbg;
  338. if(_chbg && _chtype == "lg")
  339. _ret += "c,lg," + _chbg_angle + "," + _chbg + ",0," + _chbg_offset +",1";
  340. if(_chbg && _chtype == "ls")
  341. _ret += "c,ls," + _chbg_angle + "," + _chbg + ",0." + parseInt(_chbg_width/10) + "," + _chbg_offset + ",0." + parseInt(_chbg_width/10) ;
  342. //console.log(_ret);
  343. // TODO : chbg è sempre vero?
  344. return _ret;
  345. }
  346. function _background_type(type){
  347. if(type == "solid")
  348. return "s";
  349. if(type == "gradient")
  350. return "lg";
  351. if(type == "stripes")
  352. return "ls";
  353. return type;
  354. }
  355. // TODO :
  356. // ------------------------------------------------
  357. // Shape markers [bar, line, radar, scatter]
  358. // ------------------------------------------------
  359. // Horizontal range markers [bar, line, radar, scatter]
  360. // ------------------------------------------------
  361. // Vertical range markers [bar, line, radar, scatter]
  362. // Fill area [bar, line, radar]
  363. // chm=b,<color>,<start line index>,<end line index>,<any value>|b,<color>,<start line index>,<end line index>,<any value>
  364. // * <color> is an RRGGBB format hexadecimal number.
  365. // * <start line index> is the index of the line at which the fill starts. This is determined by the order in which data sets are specified with chd. The first data set specified has an index of zero (0), the second 1, and so on.
  366. // * <end line index> is the index of the line at which the fill ends. This is determined by the order in which data sets are specified with chd. The first data set specified has an index of zero (0), the second 1, and so on.
  367. // * <any value> is ignored.
  368. // after _data()
  369. function _fill_area(){
  370. var _arr = [];var _ret = '';
  371. if(_is_fillarea){
  372. _arr = _color(_colors, _filltop).split(",");
  373. //console.log(_arr);
  374. _arr.forEach(function(val,index){
  375. _ret += 'b,' + val + ',' + index + ',' +(index + 1) + ',' + '0' + '|';
  376. });
  377. _ret = _rlasttrim(_ret,"|");
  378. }
  379. return _ret;
  380. }
  381. // ------------------------------------------------
  382. // Grid lines [bar, line, radar, scatter]
  383. function _eval_grid(){
  384. var _ret = '';
  385. if(_grid_x >= 0)
  386. _ret += _grid_x;
  387. if(_grid_y >= 0)
  388. _ret += "," + _grid_y;
  389. if(_grid_line >= 0)
  390. _ret += "," + _grid_line;
  391. if(_grid_blank >= 0)
  392. _ret += "," + _grid_blank;
  393. //console.log(_ret);
  394. return _ret;
  395. }
  396. // ------------------------------------------------
  397. // Line styles [bar, line, radar]
  398. function _line_style(){
  399. var _ret = "";
  400. _lines.forEach(function(val){
  401. //console.log(val);
  402. _ret += val.join(",") + "|";
  403. });
  404. _ret = _rlasttrim(_ret,"|");
  405. //console.log(_ret);
  406. return _ret;
  407. }
  408. //helpers
  409. function _options(options){
  410. if(jGCharts.Api.type.indexOf(options.type) !== -1)
  411. _type = options.type;
  412. // Chart size
  413. // chs=<width in pixels>x<height in pixels>
  414. // 1000x300, 300x1000, 600x500, 500x600, 800x375, and 375x800
  415. // maximum 300,000 pixels
  416. if(options.size)
  417. _size = options.size;
  418. if(options.data)
  419. _data = options.data;
  420. if(options.legend)
  421. _legend = options.legend;
  422. if(options.axis_labels)
  423. _axis_labels = options.axis_labels;
  424. if(options.axis_step)
  425. _axis_step = options.axis_step;
  426. if(options.colors)
  427. _colors = options.colors;
  428. else
  429. _colors = [];
  430. //lines
  431. if(options.lines)
  432. _lines = options.lines;
  433. // ------------------------------------------------
  434. // Chart title [bar, line, radar, scatter, venn, pie]
  435. if(options.title)
  436. _title = options.title;
  437. if(options.title_color && options.title_size)
  438. _title_style = options.title_color + "," + options.title_size;
  439. //bar
  440. if(options.bar_width)
  441. _bar_width = options.bar_width;
  442. if(options.bar_spacing >= 0)
  443. _bar_spacing = options.bar_spacing;
  444. //line
  445. if(options.fillarea)
  446. _fillarea = options.fillarea;
  447. if(options.fillbottom)
  448. _fillbottom = options.fillbottom;
  449. if(options.filltop)
  450. _filltop = options.filltop;
  451. //axis - TODO?
  452. if(options.axis_type)
  453. _axis_type = options.axis_type;
  454. //style
  455. if(options.bg)
  456. _bg = options.bg;
  457. if(options.bg_type)
  458. _bg_type = options.bg_type;
  459. if(options.bg_offset)
  460. _bg_offset = options.bg_offset;
  461. if(options.bg_width)
  462. _bg_width = options.bg_width;
  463. if(options.bg_angle >= 0)
  464. _bg_angle = options.bg_angle;
  465. if(options.bg_trasparency)
  466. _bg_trasparency = options.bg_trasparency;
  467. if(options.chbg)
  468. _chbg = options.chbg;
  469. if(options.chbg_type)
  470. _chbg_type = options.chbg_type;
  471. if(options.chbg_offset)
  472. _chbg_offset = options.chbg_offset;
  473. if(options.chbg_width)
  474. _chbg_width = options.chbg_width;
  475. if(options.chbg_angle >= 0)
  476. _chbg_angle = options.chbg_angle;
  477. if(options.chbg_trasparency)
  478. _chbg_trasparency = options.chbg_trasparency;
  479. //grid
  480. if(options.grid){
  481. _grid = options.grid;
  482. if(options.grid_x >= 0)
  483. _grid_x = options.grid_x;
  484. if(options.grid_y >= 0)
  485. _grid_y = options.grid_y;
  486. if(options.grid_line >= 0)
  487. _grid_line = options.grid_line;
  488. if(options.grid_blank >= 0)
  489. _grid_blank = options.grid_blank;
  490. }
  491. }
  492. function _param(index,data, last){
  493. var l = last ? "" : "&";
  494. return _params[index] + "=" + data + l;
  495. }
  496. function _flags(){
  497. //attr chart flag type
  498. _is_vertical = _type.indexOf("v") !== -1;
  499. _is_horizontal = _type.indexOf("h") !== -1;
  500. _is_stacked = _type.indexOf("s") !== -1 &&
  501. _type != "ls" &&
  502. _type != "lc";
  503. _is_line = (_type == "ls" || _type == "lc");
  504. _is_pie = (_type == "p" || _type == "p3");
  505. _is_fillarea = _is_line && _fillarea;
  506. _is_bar = _type.indexOf("b") !== -1;
  507. }
  508. //utils
  509. function _rlasttrim(str, search){
  510. return (str.lastIndexOf(search) !== -1) ? str.substr(0, str.lastIndexOf(search)) : str;
  511. }
  512. // -------------- PUBLIC METHODS ----------------
  513. return {
  514. /* PUBLIC ATTRS */
  515. /* PUBLIC METHODS */
  516. make : function(options){
  517. //console.log(options);
  518. //var options = _defaults(options);
  519. var url = _api;
  520. _options(options);
  521. _flags();
  522. url += _param("type", _type);
  523. url += _param("size", _size);
  524. if(_title)
  525. url += _param("title", _title);
  526. if(_title_style)
  527. url += _param("title_style", _title_style);
  528. if(_is_bar){
  529. url += _param("bar_width", _bar_options());
  530. }
  531. url += _param("axis_type", _axis_type);
  532. if(!_is_pie && _legend.length > 0)
  533. url += _param("legend", _eval_legend());
  534. url += _param("data", _eval_data());
  535. url += _param("scaling", _scaling());
  536. url += _param("axis_range", _axis_range());
  537. url += _param("axis_labels", _eval_labels());
  538. url += _param("background", _background());
  539. url += _param("colors", _color());
  540. if(_is_line && _lines)
  541. url += _param("line_style", _line_style());
  542. if(_grid)
  543. url += _param("grid", _eval_grid());
  544. if(_is_line && _is_fillarea)
  545. url += _param("fillarea", _fill_area());
  546. url += _param("agent", "jgcharts", true);
  547. //console.log(options.colors);
  548. return url;
  549. }
  550. }
  551. };
  552. // -------------- STATIC ATTRS ----------------
  553. // Chart type
  554. // Bar chart (bhs, bvs, bhg, bvg)
  555. // Line and Sparkline chart (lc, lxy, ls)
  556. // TODO: ------------------------------------------
  557. // Radar chart (r)
  558. // Scatter plot (s)
  559. // Venn diagram (v)
  560. // Google-o-meter (gom)
  561. // Maps (t)
  562. // cht=<line chart type>
  563. jGCharts.Api.type = ["bhs", "bvs", "bhg", "bvg", "lc", "ls","p","p3"];//TODO: "r","v","s","t","gom","lxy"
  564. // -------------- GLOBAL FUNCTIONS ----------------
  565. //lib - from iterators.js
  566. // [number] -> number
  567. function sum( arr ) { return foldl( arr, 0, function(acc,x){ return acc + x } ) }
  568. // [a] a (a -> a) -> a
  569. function foldl( arr, acc, folder_fn ){
  570. for(var i=0; i < arr.length; i++){
  571. acc = folder_fn( acc, arr[i] );
  572. }
  573. return acc;
  574. }
  575. // -------------- GLOBAL FUNCTIONS - SUGAR ARRAYS ----------------
  576. /*
  577. * Sugar Arrays (c) Creative Commons 2006
  578. * http://creativecommons.org/licenses/by-sa/2.5/
  579. * Author: Dustin Diaz | http://www.dustindiaz.com
  580. * Reference: http://www.dustindiaz.com/basement/sugar-arrays.html
  581. */
  582. Function.prototype.method = function (name, fn) {
  583. this.prototype[name] = fn;
  584. return this;
  585. };
  586. if ( !Array.prototype.forEach ) {
  587. Array.
  588. method(
  589. 'forEach',
  590. function(fn, thisObj) {
  591. var scope = thisObj || window;
  592. for ( var i=0, j=this.length; i < j; ++i ) {
  593. fn.call(scope, this[i], i, this);
  594. }
  595. }
  596. ).
  597. method(
  598. 'every',
  599. function(fn, thisObj) {
  600. var scope = thisObj || window;
  601. for ( var i=0, j=this.length; i < j; ++i ) {
  602. if ( !fn.call(scope, this[i], i, this) ) {
  603. return false;
  604. }
  605. }
  606. return true;
  607. }
  608. ).
  609. method(
  610. 'some',
  611. function(fn, thisObj) {
  612. var scope = thisObj || window;
  613. for ( var i=0, j=this.length; i < j; ++i ) {
  614. if ( fn.call(scope, this[i], i, this) ) {
  615. return true;
  616. }
  617. }
  618. return false;
  619. }
  620. ).
  621. method(
  622. 'map',
  623. function(fn, thisObj) {
  624. var scope = thisObj || window;
  625. var a = [];
  626. for ( var i=0, j=this.length; i < j; ++i ) {
  627. a.push(fn.call(scope, this[i], i, this));
  628. }
  629. return a;
  630. }
  631. ).
  632. method(
  633. 'filter',
  634. function(fn, thisObj) {
  635. var scope = thisObj || window;
  636. var a = [];
  637. for ( var i=0, j=this.length; i < j; ++i ) {
  638. if ( !fn.call(scope, this[i], i, this) ) {
  639. continue;
  640. }
  641. a.push(this[i]);
  642. }
  643. return a;
  644. }
  645. ).
  646. method(
  647. 'indexOf',
  648. function(el, start) {
  649. var start = start || 0;
  650. for ( var i=start, j=this.length; i < j; ++i ) {
  651. if ( this[i] === el ) {
  652. return i;
  653. }
  654. }
  655. return -1;
  656. }
  657. ).
  658. method(
  659. 'lastIndexOf',
  660. function(el, start) {
  661. var start = start || this.length;
  662. if ( start >= this.length ) {
  663. start = this.length;
  664. }
  665. if ( start < 0 ) {
  666. start = this.length + start;
  667. }
  668. for ( var i=start; i >= 0; --i ) {
  669. if ( this[i] === el ) {
  670. return i;
  671. }
  672. }
  673. return -1;
  674. }
  675. );
  676. }
  677. // -------------- JQUERY PLUGIN ----------------
  678. jGCharts.Base = {
  679. init : function(options){
  680. options = jQuery.extend({}, options);
  681. return this.each(function(){
  682. if(!options.data)
  683. throw new Error("No Data");
  684. var api = new jGCharts.Api();
  685. var url = api.make(options);
  686. jQuery('<img>').attr("src",url).appendTo(this);
  687. jQuery('<p>' + url + '</p>').appendTo(this);
  688. });
  689. }
  690. };
  691. jQuery.fn.jgcharts = jGCharts.Base.init;