responsive.js 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242
  1. /*
  2. Plugin Name: amCharts Responsive
  3. Description: This plugin add responsive functionality to JavaScript Charts and Maps.
  4. Author: Martynas Majeris, amCharts
  5. Contributors: Ohad Schneider
  6. Version: 1.0.1
  7. Author URI: http://www.amcharts.com/
  8. Copyright 2015 amCharts
  9. Licensed under the Apache License, Version 2.0 (the "License");
  10. you may not use this file except in compliance with the License.
  11. You may obtain a copy of the License at
  12. http://www.apache.org/licenses/LICENSE-2.0
  13. Unless required by applicable law or agreed to in writing, software
  14. distributed under the License is distributed on an "AS IS" BASIS,
  15. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  16. See the License for the specific language governing permissions and
  17. limitations under the License.
  18. Please note that the above license covers only this plugin. It by all means does
  19. not apply to any other amCharts products that are covered by different licenses.
  20. */
  21. /*global AmCharts*/
  22. AmCharts.addInitHandler( function( chart ) {
  23. "use strict";
  24. if ( chart.responsive === undefined || chart.responsive.ready === true || chart.responsive.enabled !== true )
  25. return;
  26. var version = chart.version.split( '.' );
  27. if ( ( version.length < 2 ) || Number( version[ 0 ] ) < 3 || ( Number( version[ 0 ] ) === 3 && Number( version[ 1 ] ) < 13 ) )
  28. return;
  29. // a short variable for easy reference
  30. var r = chart.responsive;
  31. r.ready = true;
  32. r.currentRules = {};
  33. r.overridden = [];
  34. // defaults per chart type
  35. var defaults = {
  36. /**
  37. * AmPie
  38. */
  39. 'pie': [
  40. /**
  41. * Disable legend in certain cases
  42. */
  43. {
  44. "maxWidth": 550,
  45. "legendPosition": "left",
  46. "overrides": {
  47. "legend": {
  48. "enabled": false
  49. }
  50. }
  51. }, {
  52. "maxWidth": 550,
  53. "legendPosition": "right",
  54. "overrides": {
  55. "legend": {
  56. "enabled": false
  57. }
  58. }
  59. }, {
  60. "maxWidth": 150,
  61. "overrides": {
  62. "legend": {
  63. "enabled": false
  64. }
  65. }
  66. }, {
  67. "maxHeight": 350,
  68. "legendPosition": "top",
  69. "overrides": {
  70. "legend": {
  71. "enabled": false
  72. }
  73. }
  74. }, {
  75. "maxHeight": 350,
  76. "legendPosition": "bottom",
  77. "overrides": {
  78. "legend": {
  79. "enabled": false
  80. }
  81. }
  82. }, {
  83. "maxHeight": 150,
  84. "overrides": {
  85. "legend": {
  86. "enabled": false
  87. }
  88. }
  89. },
  90. /**
  91. * Narrow chart
  92. */
  93. {
  94. "maxWidth": 400,
  95. "overrides": {
  96. "labelsEnabled": false
  97. }
  98. }, {
  99. "maxWidth": 100,
  100. "overrides": {
  101. "legend": {
  102. "enabled": false
  103. }
  104. }
  105. },
  106. /**
  107. * Short chart
  108. */
  109. {
  110. "maxHeight": 350,
  111. "overrides": {
  112. "pullOutRadius": 0
  113. }
  114. }, {
  115. "maxHeight": 200,
  116. "overrides": {
  117. "titles": {
  118. "enabled": false
  119. },
  120. "labelsEnabled": false
  121. }
  122. },
  123. /**
  124. * Supersmall
  125. */
  126. {
  127. "maxWidth": 60,
  128. "overrides": {
  129. "autoMargins": false,
  130. "marginTop": 0,
  131. "marginBottom": 0,
  132. "marginLeft": 0,
  133. "marginRight": 0,
  134. "radius": "50%",
  135. "innerRadius": 0,
  136. "balloon": {
  137. "enabled": false
  138. },
  139. "legend": {
  140. "enabled": false
  141. }
  142. }
  143. }, {
  144. "maxHeight": 60,
  145. "overrides": {
  146. "marginTop": 0,
  147. "marginBottom": 0,
  148. "marginLeft": 0,
  149. "marginRight": 0,
  150. "radius": "50%",
  151. "innerRadius": 0,
  152. "balloon": {
  153. "enabled": false
  154. },
  155. "legend": {
  156. "enabled": false
  157. }
  158. }
  159. }
  160. ],
  161. /**
  162. * AmFunnel
  163. */
  164. 'funnel': [ {
  165. "maxWidth": 550,
  166. "legendPosition": "left",
  167. "overrides": {
  168. "legend": {
  169. "enabled": false
  170. }
  171. }
  172. }, {
  173. "maxWidth": 550,
  174. "legendPosition": "right",
  175. "overrides": {
  176. "legend": {
  177. "enabled": false
  178. }
  179. }
  180. }, {
  181. "maxWidth": 150,
  182. "overrides": {
  183. "legend": {
  184. "enabled": false
  185. }
  186. }
  187. }, {
  188. "maxHeight": 500,
  189. "legendPosition": "top",
  190. "overrides": {
  191. "legend": {
  192. "enabled": false
  193. }
  194. }
  195. }, {
  196. "maxHeight": 500,
  197. "legendPosition": "bottom",
  198. "overrides": {
  199. "legend": {
  200. "enabled": false
  201. }
  202. }
  203. }, {
  204. "maxHeight": 150,
  205. "overrides": {
  206. "legend": {
  207. "enabled": false
  208. }
  209. }
  210. }, {
  211. "maxWidth": 400,
  212. "overrides": {
  213. "labelsEnabled": false,
  214. "marginLeft": 10,
  215. "marginRight": 10,
  216. "legend": {
  217. "enabled": false
  218. }
  219. }
  220. }, {
  221. "maxHeight": 350,
  222. "overrides": {
  223. "pullOutRadius": 0,
  224. "legend": {
  225. "enabled": false
  226. }
  227. }
  228. }, {
  229. "maxHeight": 300,
  230. "overrides": {
  231. "titles": {
  232. "enabled": false
  233. }
  234. }
  235. } ],
  236. /**
  237. * AmRadar
  238. */
  239. "radar": [ {
  240. "maxWidth": 550,
  241. "legendPosition": "left",
  242. "overrides": {
  243. "legend": {
  244. "enabled": false
  245. }
  246. }
  247. }, {
  248. "maxWidth": 550,
  249. "legendPosition": "right",
  250. "overrides": {
  251. "legend": {
  252. "enabled": false
  253. }
  254. }
  255. }, {
  256. "maxWidth": 150,
  257. "overrides": {
  258. "legend": {
  259. "enabled": false
  260. }
  261. }
  262. }, {
  263. "maxHeight": 350,
  264. "legendPosition": "top",
  265. "overrides": {
  266. "legend": {
  267. "enabled": false
  268. }
  269. }
  270. }, {
  271. "maxHeight": 350,
  272. "legendPosition": "bottom",
  273. "overrides": {
  274. "legend": {
  275. "enabled": false
  276. }
  277. }
  278. }, {
  279. "maxHeight": 150,
  280. "overrides": {
  281. "legend": {
  282. "enabled": false
  283. }
  284. }
  285. }, {
  286. "maxWidth": 300,
  287. "overrides": {
  288. "labelsEnabled": false
  289. }
  290. }, {
  291. "maxWidth": 200,
  292. "overrides": {
  293. "autoMargins": false,
  294. "marginTop": 0,
  295. "marginBottom": 0,
  296. "marginLeft": 0,
  297. "marginRight": 0,
  298. "radius": "50%",
  299. "titles": {
  300. "enabled": false
  301. },
  302. "valueAxes": {
  303. "labelsEnabled": false,
  304. "radarCategoriesEnabled": false
  305. }
  306. }
  307. }, {
  308. "maxHeight": 300,
  309. "overrides": {
  310. "labelsEnabled": false
  311. }
  312. }, {
  313. "maxHeight": 200,
  314. "overrides": {
  315. "autoMargins": false,
  316. "marginTop": 0,
  317. "marginBottom": 0,
  318. "marginLeft": 0,
  319. "marginRight": 0,
  320. "radius": "50%",
  321. "titles": {
  322. "enabled": false
  323. },
  324. "valueAxes": {
  325. "radarCategoriesEnabled": false
  326. }
  327. }
  328. }, {
  329. "maxHeight": 100,
  330. "overrides": {
  331. "valueAxes": {
  332. "labelsEnabled": false
  333. }
  334. }
  335. } ],
  336. /**
  337. * AmGauge
  338. */
  339. 'gauge': [ {
  340. "maxWidth": 550,
  341. "legendPosition": "left",
  342. "overrides": {
  343. "legend": {
  344. "enabled": false
  345. }
  346. }
  347. }, {
  348. "maxWidth": 550,
  349. "legendPosition": "right",
  350. "overrides": {
  351. "legend": {
  352. "enabled": false
  353. }
  354. }
  355. }, {
  356. "maxWidth": 150,
  357. "overrides": {
  358. "legend": {
  359. "enabled": false
  360. }
  361. }
  362. }, {
  363. "maxHeight": 500,
  364. "legendPosition": "top",
  365. "overrides": {
  366. "legend": {
  367. "enabled": false
  368. }
  369. }
  370. }, {
  371. "maxHeight": 500,
  372. "legendPosition": "bottom",
  373. "overrides": {
  374. "legend": {
  375. "enabled": false
  376. }
  377. }
  378. }, {
  379. "maxHeight": 150,
  380. "overrides": {
  381. "legend": {
  382. "enabled": false
  383. }
  384. }
  385. }, {
  386. "maxWidth": 200,
  387. "overrides": {
  388. "titles": {
  389. "enabled": false
  390. },
  391. "allLabels": {
  392. "enabled": false
  393. },
  394. "axes": {
  395. "labelsEnabled": false
  396. }
  397. }
  398. }, {
  399. "maxHeight": 200,
  400. "overrides": {
  401. "titles": {
  402. "enabled": false
  403. },
  404. "allLabels": {
  405. "enabled": false
  406. },
  407. "axes": {
  408. "labelsEnabled": false
  409. }
  410. }
  411. } ],
  412. /**
  413. * AmSerial
  414. */
  415. "serial": [
  416. /**
  417. * Disable legend in certain cases
  418. */
  419. {
  420. "maxWidth": 550,
  421. "legendPosition": "left",
  422. "overrides": {
  423. "legend": {
  424. "enabled": false
  425. }
  426. }
  427. }, {
  428. "maxWidth": 550,
  429. "legendPosition": "right",
  430. "overrides": {
  431. "legend": {
  432. "enabled": false
  433. }
  434. }
  435. }, {
  436. "maxWidth": 100,
  437. "overrides": {
  438. "legend": {
  439. "enabled": false
  440. }
  441. }
  442. }, {
  443. "maxHeight": 350,
  444. "legendPosition": "top",
  445. "overrides": {
  446. "legend": {
  447. "enabled": false
  448. }
  449. }
  450. }, {
  451. "maxHeight": 350,
  452. "legendPosition": "bottom",
  453. "overrides": {
  454. "legend": {
  455. "enabled": false
  456. }
  457. }
  458. }, {
  459. "maxHeight": 100,
  460. "overrides": {
  461. "legend": {
  462. "enabled": false
  463. }
  464. }
  465. },
  466. /**
  467. * Narrow chart
  468. */
  469. {
  470. "maxWidth": 350,
  471. "overrides": {
  472. "autoMarginOffset": 0,
  473. "graphs": {
  474. "hideBulletsCount": 10
  475. }
  476. }
  477. }, {
  478. "maxWidth": 350,
  479. "rotate": false,
  480. "overrides": {
  481. "marginLeft": 10,
  482. "marginRight": 10,
  483. "valueAxes": {
  484. "ignoreAxisWidth": true,
  485. "inside": true,
  486. "title": "",
  487. "showFirstLabel": false,
  488. "showLastLabel": false
  489. },
  490. "graphs": {
  491. "bullet": "none"
  492. }
  493. }
  494. }, {
  495. "maxWidth": 350,
  496. "rotate": true,
  497. "overrides": {
  498. "marginLeft": 10,
  499. "marginRight": 10,
  500. "categoryAxis": {
  501. "ignoreAxisWidth": true,
  502. "inside": true,
  503. "title": ""
  504. }
  505. }
  506. }, {
  507. "maxWidth": 200,
  508. "rotate": false,
  509. "overrides": {
  510. "marginLeft": 10,
  511. "marginRight": 10,
  512. "marginTop": 10,
  513. "marginBottom": 10,
  514. "categoryAxis": {
  515. "ignoreAxisWidth": true,
  516. "labelsEnabled": false,
  517. "inside": true,
  518. "title": "",
  519. "guides": {
  520. "inside": true
  521. }
  522. },
  523. "valueAxes": {
  524. "ignoreAxisWidth": true,
  525. "labelsEnabled": false,
  526. "axisAlpha": 0,
  527. "guides": {
  528. "label": ""
  529. }
  530. },
  531. "legend": {
  532. "enabled": false
  533. }
  534. }
  535. }, {
  536. "maxWidth": 200,
  537. "rotate": true,
  538. "overrides": {
  539. "chartScrollbar": {
  540. "scrollbarHeight": 4,
  541. "graph": "",
  542. "resizeEnabled": false
  543. },
  544. "categoryAxis": {
  545. "labelsEnabled": false,
  546. "axisAlpha": 0,
  547. "guides": {
  548. "label": ""
  549. }
  550. },
  551. "legend": {
  552. "enabled": false
  553. }
  554. }
  555. }, {
  556. "maxWidth": 100,
  557. "rotate": false,
  558. "overrides": {
  559. "valueAxes": {
  560. "gridAlpha": 0
  561. }
  562. }
  563. }, {
  564. "maxWidth": 100,
  565. "rotate": true,
  566. "overrides": {
  567. "categoryAxis": {
  568. "gridAlpha": 0
  569. }
  570. }
  571. },
  572. /**
  573. * Short chart
  574. */
  575. {
  576. "maxHeight": 300,
  577. "overrides": {
  578. "autoMarginOffset": 0,
  579. "graphs": {
  580. "hideBulletsCount": 10
  581. }
  582. }
  583. }, {
  584. "maxHeight": 200,
  585. "rotate": false,
  586. "overrides": {
  587. "marginTop": 10,
  588. "marginBottom": 10,
  589. "categoryAxis": {
  590. "ignoreAxisWidth": true,
  591. "inside": true,
  592. "title": "",
  593. "showFirstLabel": false,
  594. "showLastLabel": false
  595. }
  596. }
  597. }, {
  598. "maxHeight": 200,
  599. "rotate": true,
  600. "overrides": {
  601. "marginTop": 10,
  602. "marginBottom": 10,
  603. "valueAxes": {
  604. "ignoreAxisWidth": true,
  605. "inside": true,
  606. "title": "",
  607. "showFirstLabel": false,
  608. "showLastLabel": false
  609. },
  610. "graphs": {
  611. "bullet": "none"
  612. }
  613. }
  614. }, {
  615. "maxHeight": 150,
  616. "rotate": false,
  617. "overrides": {
  618. "titles": {
  619. "enabled": false
  620. },
  621. "chartScrollbar": {
  622. "scrollbarHeight": 4,
  623. "graph": "",
  624. "resizeEnabled": false
  625. },
  626. "categoryAxis": {
  627. "labelsEnabled": false,
  628. "ignoreAxisWidth": true,
  629. "axisAlpha": 0,
  630. "guides": {
  631. "label": ""
  632. }
  633. }
  634. }
  635. }, {
  636. "maxHeight": 150,
  637. "rotate": true,
  638. "overrides": {
  639. "titles": {
  640. "enabled": false
  641. },
  642. "valueAxes": {
  643. "labelsEnabled": false,
  644. "ignoreAxisWidth": true,
  645. "axisAlpha": 0,
  646. "guides": {
  647. "label": ""
  648. }
  649. }
  650. }
  651. }, {
  652. "maxHeight": 100,
  653. "rotate": false,
  654. "overrides": {
  655. "valueAxes": {
  656. "labelsEnabled": false,
  657. "ignoreAxisWidth": true,
  658. "axisAlpha": 0,
  659. "gridAlpha": 0,
  660. "guides": {
  661. "label": ""
  662. }
  663. }
  664. }
  665. }, {
  666. "maxHeight": 100,
  667. "rotate": true,
  668. "overrides": {
  669. "categoryAxis": {
  670. "labelsEnabled": false,
  671. "ignoreAxisWidth": true,
  672. "axisAlpha": 0,
  673. "gridAlpha": 0,
  674. "guides": {
  675. "label": ""
  676. }
  677. }
  678. }
  679. },
  680. /**
  681. * Really small charts: microcharts and sparklines
  682. */
  683. {
  684. "maxWidth": 100,
  685. "overrides": {
  686. "autoMargins": false,
  687. "marginTop": 0,
  688. "marginBottom": 0,
  689. "marginLeft": 0,
  690. "marginRight": 0,
  691. "categoryAxis": {
  692. "labelsEnabled": false
  693. },
  694. "valueAxes": {
  695. "labelsEnabled": false
  696. }
  697. }
  698. }, {
  699. "maxHeight": 100,
  700. "overrides": {
  701. "autoMargins": false,
  702. "marginTop": 0,
  703. "marginBottom": 0,
  704. "marginLeft": 0,
  705. "marginRight": 0,
  706. "categoryAxis": {
  707. "labelsEnabled": false
  708. },
  709. "valueAxes": {
  710. "labelsEnabled": false
  711. }
  712. }
  713. }
  714. ],
  715. /**
  716. * AmXY
  717. */
  718. "xy": [
  719. /**
  720. * Disable legend in certain cases
  721. */
  722. {
  723. "maxWidth": 550,
  724. "legendPosition": "left",
  725. "overrides": {
  726. "legend": {
  727. "enabled": false
  728. }
  729. }
  730. }, {
  731. "maxWidth": 550,
  732. "legendPosition": "right",
  733. "overrides": {
  734. "legend": {
  735. "enabled": false
  736. }
  737. }
  738. }, {
  739. "maxWidth": 100,
  740. "overrides": {
  741. "legend": {
  742. "enabled": false
  743. }
  744. }
  745. }, {
  746. "maxHeight": 350,
  747. "legendPosition": "top",
  748. "overrides": {
  749. "legend": {
  750. "enabled": false
  751. }
  752. }
  753. }, {
  754. "maxHeight": 350,
  755. "legendPosition": "bottom",
  756. "overrides": {
  757. "legend": {
  758. "enabled": false
  759. }
  760. }
  761. }, {
  762. "maxHeight": 100,
  763. "overrides": {
  764. "legend": {
  765. "enabled": false
  766. }
  767. }
  768. },
  769. /**
  770. * Narrow chart
  771. */
  772. {
  773. "maxWidth": 250,
  774. "overrides": {
  775. "autoMarginOffset": 0,
  776. "autoMargins": false,
  777. "marginTop": 0,
  778. "marginBottom": 0,
  779. "marginLeft": 0,
  780. "marginRight": 0,
  781. "valueAxes": {
  782. "inside": true,
  783. "title": "",
  784. "showFirstLabel": false,
  785. "showLastLabel": false
  786. },
  787. "legend": {
  788. "enabled": false
  789. }
  790. }
  791. }, {
  792. "maxWidth": 150,
  793. "overrides": {
  794. "valueyAxes": {
  795. "labelsEnabled": false,
  796. "axisAlpha": 0,
  797. "gridAlpha": 0,
  798. "guides": {
  799. "label": ""
  800. }
  801. }
  802. }
  803. },
  804. /**
  805. * Short chart
  806. */
  807. {
  808. "maxHeight": 250,
  809. "overrides": {
  810. "autoMarginOffset": 0,
  811. "autoMargins": false,
  812. "marginTop": 0,
  813. "marginBottom": 0,
  814. "marginLeft": 0,
  815. "marginRight": 0,
  816. "valueAxes": {
  817. "inside": true,
  818. "title": "",
  819. "showFirstLabel": false,
  820. "showLastLabel": false
  821. },
  822. "legend": {
  823. "enabled": false
  824. }
  825. }
  826. }, {
  827. "maxWidth": 150,
  828. "overrides": {
  829. "valueyAxes": {
  830. "labelsEnabled": false,
  831. "axisAlpha": 0,
  832. "gridAlpha": 0,
  833. "guides": {
  834. "label": ""
  835. }
  836. }
  837. }
  838. }
  839. ],
  840. /**
  841. * AmStock
  842. */
  843. 'stock': [ {
  844. "maxWidth": 500,
  845. "overrides": {
  846. "dataSetSelector": {
  847. "position": "top"
  848. },
  849. "periodSelector": {
  850. "position": "bottom"
  851. }
  852. }
  853. }, {
  854. "maxWidth": 400,
  855. "overrides": {
  856. "dataSetSelector": {
  857. "selectText": "",
  858. "compareText": ""
  859. },
  860. "periodSelector": {
  861. "periodsText": "",
  862. "inputFieldsEnabled": false
  863. }
  864. }
  865. } ],
  866. /**
  867. * AmMap
  868. */
  869. 'map': [ {
  870. "maxWidth": 200,
  871. "overrides": {
  872. "zoomControl": {
  873. "zoomControlEnabled": false
  874. },
  875. "smallMap": {
  876. "enabled": false
  877. },
  878. "valueLegend": {
  879. "enabled": false
  880. },
  881. "dataProvider": {
  882. "areas": {
  883. "descriptionWindowWidth": 160,
  884. "descriptionWindowRight": 10,
  885. "descriptionWindowTop": 10
  886. },
  887. "images": {
  888. "descriptionWindowWidth": 160,
  889. "descriptionWindowRight": 10,
  890. "descriptionWindowTop": 10
  891. },
  892. "lines": {
  893. "descriptionWindowWidth": 160,
  894. "descriptionWindowRight": 10,
  895. "descriptionWindowTop": 10
  896. }
  897. }
  898. }
  899. }, {
  900. "maxWidth": 150,
  901. "overrides": {
  902. "dataProvider": {
  903. "areas": {
  904. "descriptionWindowWidth": 110,
  905. "descriptionWindowRight": 10,
  906. "descriptionWindowTop": 10
  907. },
  908. "images": {
  909. "descriptionWindowWidth": 110,
  910. "descriptionWindowRight": 10,
  911. "descriptionWindowTop": 10
  912. },
  913. "lines": {
  914. "descriptionWindowWidth": 110,
  915. "descriptionWindowLeft": 10,
  916. "descriptionWindowRight": 10
  917. }
  918. }
  919. }
  920. }, {
  921. "maxHeight": 200,
  922. "overrides": {
  923. "zoomControl": {
  924. "zoomControlEnabled": false
  925. },
  926. "smallMap": {
  927. "enabled": false
  928. },
  929. "valueLegend": {
  930. "enabled": false
  931. },
  932. "dataProvider": {
  933. "areas": {
  934. "descriptionWindowHeight": 160,
  935. "descriptionWindowRight": 10,
  936. "descriptionWindowTop": 10
  937. },
  938. "images": {
  939. "descriptionWindowHeight": 160,
  940. "descriptionWindowRight": 10,
  941. "descriptionWindowTop": 10
  942. },
  943. "lines": {
  944. "descriptionWindowHeight": 160,
  945. "descriptionWindowRight": 10,
  946. "descriptionWindowTop": 10
  947. }
  948. }
  949. }
  950. }, {
  951. "maxHeight": 150,
  952. "overrides": {
  953. "dataProvider": {
  954. "areas": {
  955. "descriptionWindowHeight": 110,
  956. "descriptionWindowRight": 10,
  957. "descriptionWindowTop": 10
  958. },
  959. "images": {
  960. "descriptionWindowHeight": 110,
  961. "descriptionWindowRight": 10,
  962. "descriptionWindowTop": 10
  963. },
  964. "lines": {
  965. "descriptionWindowHeight": 110,
  966. "descriptionWindowLeft": 10,
  967. "descriptionWindowRight": 10
  968. }
  969. }
  970. }
  971. } ]
  972. };
  973. var isNullOrUndefined = function( obj ) {
  974. return ( obj === null ) || ( obj === undefined );
  975. };
  976. var isArray = function( obj ) {
  977. return ( !isNullOrUndefined( obj ) && Object.prototype.toString.call( obj ) === '[object Array]' );
  978. };
  979. var isObject = function( obj ) {
  980. return ( obj !== null && typeof obj === 'object' ); //the null check is necessary - recall that typeof null === 'object' !
  981. };
  982. var findArrayObjectById = function( arr, id ) {
  983. for ( var i = 0; i < arr.length; i++ ) {
  984. if ( isObject( arr[ i ] ) && arr[ i ].id === id )
  985. return arr[ i ];
  986. }
  987. return undefined; //we can use undefined as it doesn't have an Id property and so will never be the desired object from the array
  988. };
  989. var cloneWithoutPrototypes = function( obj ) {
  990. if ( !isObject( obj ) ) {
  991. return obj;
  992. }
  993. if ( isArray( obj ) ) {
  994. return obj.slice(); //effectively clones the array
  995. }
  996. var clone = {}; //here is where we lose the prototype
  997. for ( var property in obj ) {
  998. if ( Object.prototype.hasOwnProperty.call( obj, property ) ) {
  999. clone[ property ] = cloneWithoutPrototypes( obj[ property ] );
  1000. }
  1001. }
  1002. return clone;
  1003. };
  1004. var originalValueRetainerPrefix = '{F0578839-A214-4E2D-8D1B-44941ECE8332}_';
  1005. var noOriginalPropertyStub = {};
  1006. var overrideProperty = function( object, property, overrideValue ) {
  1007. var originalValueRetainerProperty = originalValueRetainerPrefix + property;
  1008. if ( !( originalValueRetainerProperty in object ) ) {
  1009. object[ originalValueRetainerProperty ] = ( property in object ) ? object[ property ] : noOriginalPropertyStub;
  1010. }
  1011. object[ property ] = cloneWithoutPrototypes( overrideValue );
  1012. r.overridden.push( {
  1013. object: object,
  1014. property: property
  1015. } );
  1016. };
  1017. var restoreOriginalProperty = function( object, property ) {
  1018. var originalValue = object[ originalValueRetainerPrefix + property ];
  1019. if ( originalValue === noOriginalPropertyStub ) {
  1020. delete object[ property ];
  1021. } else {
  1022. object[ property ] = originalValue;
  1023. }
  1024. };
  1025. var restoreOriginals = function() {
  1026. while ( r.overridden.length > 0 ) {
  1027. var override = r.overridden.pop();
  1028. restoreOriginalProperty( override.object, override.property );
  1029. }
  1030. };
  1031. var redrawChart = function() {
  1032. chart.dataChanged = true;
  1033. if ( chart.type !== 'xy' ) {
  1034. chart.marginsUpdated = false;
  1035. }
  1036. chart.zoomOutOnDataUpdate = false;
  1037. chart.validateNow( true );
  1038. restoreOriginalProperty( chart, 'zoomOutOnDataUpdate' );
  1039. };
  1040. var applyConfig = function( current, override ) {
  1041. if ( isNullOrUndefined( override ) ) {
  1042. return;
  1043. }
  1044. for ( var property in override ) {
  1045. if ( !Object.prototype.hasOwnProperty.call( override, property ) ) {
  1046. continue;
  1047. }
  1048. var currentValue = current[ property ];
  1049. var overrideValue = override[ property ];
  1050. //property doesn't exist on current object or it exists as null/undefined => completely override it
  1051. if ( isNullOrUndefined( currentValue ) ) {
  1052. overrideProperty( current, property, overrideValue );
  1053. continue;
  1054. }
  1055. //current value is an array => override method depends on override form
  1056. if ( isArray( currentValue ) ) {
  1057. //override value is an array => override method depends on array elements
  1058. if ( isArray( overrideValue ) ) {
  1059. //current value is an array of non-objects => override the entire array
  1060. //we assume a uniformly-typed array, so checking the first value should suffice
  1061. if ( ( currentValue.length > 0 && !isObject( currentValue[ 0 ] ) ) || ( overrideValue.length > 0 && !isObject( overrideValue[ 0 ] ) ) ) {
  1062. overrideProperty( current, property, overrideValue );
  1063. continue;
  1064. }
  1065. var idPresentOnAllOverrideElements = true;
  1066. for ( var k = 0; k < overrideValue.length; k++ ) {
  1067. if ( isNullOrUndefined( overrideValue[ k ] ) || isNullOrUndefined( overrideValue[ k ].id ) ) {
  1068. idPresentOnAllOverrideElements = false;
  1069. break;
  1070. }
  1071. }
  1072. //Id property is present on all override elements => override elements by ID
  1073. if ( idPresentOnAllOverrideElements ) {
  1074. for ( var i = 0; i < overrideValue.length; i++ ) {
  1075. var correspondingCurrentElement = findArrayObjectById( currentValue, overrideValue[ i ].id );
  1076. if ( correspondingCurrentElement === undefined ) {
  1077. throw ( 'could not find element to override in "' + property + '" with ID: ' + overrideValue[ i ].id );
  1078. }
  1079. applyConfig( correspondingCurrentElement, overrideValue[ i ] );
  1080. }
  1081. continue;
  1082. }
  1083. //Id property is not set on all override elements and there aren't too many overrides => override objects by their index
  1084. if ( overrideValue.length <= currentValue.length ) {
  1085. for ( var l = 0; l < overrideValue.length; l++ ) {
  1086. applyConfig( currentValue[ l ], overrideValue[ l ] );
  1087. }
  1088. continue;
  1089. }
  1090. throw 'too many index-based overrides specified for object array property: ' + property;
  1091. }
  1092. // override value is a single object => override all current array objects with that object
  1093. if ( isObject( overrideValue ) ) {
  1094. for ( var j = 0; j < currentValue.length; j++ ) {
  1095. applyConfig( currentValue[ j ], overrideValue );
  1096. }
  1097. continue;
  1098. }
  1099. throw ( 'non-object override detected for array property: ' + property );
  1100. }
  1101. if ( isObject( currentValue ) ) {
  1102. applyConfig( currentValue, overrideValue );
  1103. continue;
  1104. }
  1105. //if we reached this point, the property is defined on the current object but is not an object => override it
  1106. overrideProperty( current, property, overrideValue );
  1107. }
  1108. };
  1109. var checkRules = function() {
  1110. console.log('x');
  1111. var width = chart.divRealWidth;
  1112. var height = chart.divRealHeight;
  1113. // update current rules
  1114. var rulesChanged = false;
  1115. for ( var i = 0; i < r.rules.length; i++ ) {
  1116. var rule = r.rules[ i ];
  1117. var ruleMatches =
  1118. ( rule.minWidth === undefined || ( rule.minWidth <= width ) ) && ( rule.maxWidth === undefined || ( rule.maxWidth >= width ) ) &&
  1119. ( rule.minHeight === undefined || ( rule.minHeight <= height ) ) && ( rule.maxHeight === undefined || ( rule.maxHeight >= height ) ) &&
  1120. ( rule.rotate === undefined || ( rule.rotate === true && chart.rotate === true ) || ( rule.rotate === false && ( chart.rotate === undefined || chart.rotate === false ) ) ) &&
  1121. ( rule.legendPosition === undefined || ( chart.legend !== undefined && chart.legend.position !== undefined && chart.legend.position === rule.legendPosition ) );
  1122. if ( ruleMatches ) {
  1123. if ( r.currentRules[ i ] === undefined ) {
  1124. r.currentRules[ i ] = true;
  1125. rulesChanged = true;
  1126. }
  1127. } else if ( r.currentRules[ i ] !== undefined ) {
  1128. r.currentRules[ i ] = undefined;
  1129. rulesChanged = true;
  1130. }
  1131. }
  1132. if ( !rulesChanged )
  1133. return;
  1134. restoreOriginals();
  1135. for ( var key in r.currentRules ) {
  1136. if ( !Object.prototype.hasOwnProperty.call( r.currentRules, key ) ) {
  1137. continue;
  1138. }
  1139. if ( r.currentRules[ key ] !== undefined ) {
  1140. if ( isNullOrUndefined( r.rules[ key ] ) ) {
  1141. throw 'null or undefined rule in index: ' + key;
  1142. }
  1143. applyConfig( chart, r.rules[ key ].overrides );
  1144. }
  1145. }
  1146. // TODO - re-apply zooms/slices as necessary
  1147. redrawChart();
  1148. };
  1149. defaults.gantt = defaults.serial;
  1150. if ( !isArray( r.rules ) ) {
  1151. r.rules = defaults[ chart.type ];
  1152. } else if ( r.addDefaultRules !== false ) {
  1153. r.rules = defaults[ chart.type ].concat( r.rules );
  1154. }
  1155. //retain original zoomOutOnDataUpdate value
  1156. overrideProperty( chart, 'zoomOutOnDataUpdate', chart.zoomOutOnDataUpdate );
  1157. chart.addListener( 'resized', checkRules );
  1158. chart.addListener( 'init', checkRules );
  1159. }, [ 'pie', 'serial', 'xy', 'funnel', 'radar', 'gauge', 'gantt', 'stock', 'map' ] );