source: trunk/web/addons/job_monarch/lib/extjs-30/pkgs/pkg-charts-debug.js @ 647

Last change on this file since 647 was 625, checked in by ramonb, 15 years ago

lib/extjs-30:

  • new ExtJS 3.0
File size: 55.1 KB
Line 
1/*!
2 * Ext JS Library 3.0.0
3 * Copyright(c) 2006-2009 Ext JS, LLC
4 * licensing@extjs.com
5 * http://www.extjs.com/license
6 */
7/*! SWFObject v2.2 <http://code.google.com/p/swfobject/>
8    is released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
9*/
10
11var swfobject = function() {
12   
13    var UNDEF = "undefined",
14        OBJECT = "object",
15        SHOCKWAVE_FLASH = "Shockwave Flash",
16        SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash",
17        FLASH_MIME_TYPE = "application/x-shockwave-flash",
18        EXPRESS_INSTALL_ID = "SWFObjectExprInst",
19        ON_READY_STATE_CHANGE = "onreadystatechange",
20       
21        win = window,
22        doc = document,
23        nav = navigator,
24       
25        plugin = false,
26        domLoadFnArr = [main],
27        regObjArr = [],
28        objIdArr = [],
29        listenersArr = [],
30        storedAltContent,
31        storedAltContentId,
32        storedCallbackFn,
33        storedCallbackObj,
34        isDomLoaded = false,
35        isExpressInstallActive = false,
36        dynamicStylesheet,
37        dynamicStylesheetMedia,
38        autoHideShow = true,
39   
40    /* Centralized function for browser feature detection
41        - User agent string detection is only used when no good alternative is possible
42        - Is executed directly for optimal performance
43    */ 
44    ua = function() {
45        var w3cdom = typeof doc.getElementById != UNDEF && typeof doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF,
46            u = nav.userAgent.toLowerCase(),
47            p = nav.platform.toLowerCase(),
48            windows = p ? /win/.test(p) : /win/.test(u),
49            mac = p ? /mac/.test(p) : /mac/.test(u),
50            webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, // returns either the webkit version or false if not webkit
51            ie = !+"\v1", // feature detection based on Andrea Giammarchi's solution: http://webreflection.blogspot.com/2009/01/32-bytes-to-know-if-your-browser-is-ie.html
52            playerVersion = [0,0,0],
53            d = null;
54        if (typeof nav.plugins != UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] == OBJECT) {
55            d = nav.plugins[SHOCKWAVE_FLASH].description;
56            if (d && !(typeof nav.mimeTypes != UNDEF && nav.mimeTypes[FLASH_MIME_TYPE] && !nav.mimeTypes[FLASH_MIME_TYPE].enabledPlugin)) { // navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin indicates whether plug-ins are enabled or disabled in Safari 3+
57                plugin = true;
58                ie = false; // cascaded feature detection for Internet Explorer
59                d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
60                playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10);
61                playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10);
62                playerVersion[2] = /[a-zA-Z]/.test(d) ? parseInt(d.replace(/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0;
63            }
64        }
65        else if (typeof win.ActiveXObject != UNDEF) {
66            try {
67                var a = new ActiveXObject(SHOCKWAVE_FLASH_AX);
68                if (a) { // a will return null when ActiveX is disabled
69                    d = a.GetVariable("$version");
70                    if (d) {
71                        ie = true; // cascaded feature detection for Internet Explorer
72                        d = d.split(" ")[1].split(",");
73                        playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
74                    }
75                }
76            }
77            catch(e) {}
78        }
79        return { w3:w3cdom, pv:playerVersion, wk:webkit, ie:ie, win:windows, mac:mac };
80    }(),
81   
82    /* Cross-browser onDomLoad
83        - Will fire an event as soon as the DOM of a web page is loaded
84        - Internet Explorer workaround based on Diego Perini's solution: http://javascript.nwbox.com/IEContentLoaded/
85        - Regular onload serves as fallback
86    */ 
87    onDomLoad = function() {
88        if (!ua.w3) { return; }
89        if ((typeof doc.readyState != UNDEF && doc.readyState == "complete") || (typeof doc.readyState == UNDEF && (doc.getElementsByTagName("body")[0] || doc.body))) { // function is fired after onload, e.g. when script is inserted dynamically
90            callDomLoadFunctions();
91        }
92        if (!isDomLoaded) {
93            if (typeof doc.addEventListener != UNDEF) {
94                doc.addEventListener("DOMContentLoaded", callDomLoadFunctions, false);
95            }       
96            if (ua.ie && ua.win) {
97                doc.attachEvent(ON_READY_STATE_CHANGE, function() {
98                    if (doc.readyState == "complete") {
99                        doc.detachEvent(ON_READY_STATE_CHANGE, arguments.callee);
100                        callDomLoadFunctions();
101                    }
102                });
103                if (win == top) { // if not inside an iframe
104                    (function(){
105                        if (isDomLoaded) { return; }
106                        try {
107                            doc.documentElement.doScroll("left");
108                        }
109                        catch(e) {
110                            setTimeout(arguments.callee, 0);
111                            return;
112                        }
113                        callDomLoadFunctions();
114                    })();
115                }
116            }
117            if (ua.wk) {
118                (function(){
119                    if (isDomLoaded) { return; }
120                    if (!/loaded|complete/.test(doc.readyState)) {
121                        setTimeout(arguments.callee, 0);
122                        return;
123                    }
124                    callDomLoadFunctions();
125                })();
126            }
127            addLoadEvent(callDomLoadFunctions);
128        }
129    }();
130   
131    function callDomLoadFunctions() {
132        if (isDomLoaded) { return; }
133        try { // test if we can really add/remove elements to/from the DOM; we don't want to fire it too early
134            var t = doc.getElementsByTagName("body")[0].appendChild(createElement("span"));
135            t.parentNode.removeChild(t);
136        }
137        catch (e) { return; }
138        isDomLoaded = true;
139        var dl = domLoadFnArr.length;
140        for (var i = 0; i < dl; i++) {
141            domLoadFnArr[i]();
142        }
143    }
144   
145    function addDomLoadEvent(fn) {
146        if (isDomLoaded) {
147            fn();
148        }
149        else { 
150            domLoadFnArr[domLoadFnArr.length] = fn; // Array.push() is only available in IE5.5+
151        }
152    }
153   
154    /* Cross-browser onload
155        - Based on James Edwards' solution: http://brothercake.com/site/resources/scripts/onload/
156        - Will fire an event as soon as a web page including all of its assets are loaded
157     */
158    function addLoadEvent(fn) {
159        if (typeof win.addEventListener != UNDEF) {
160            win.addEventListener("load", fn, false);
161        }
162        else if (typeof doc.addEventListener != UNDEF) {
163            doc.addEventListener("load", fn, false);
164        }
165        else if (typeof win.attachEvent != UNDEF) {
166            addListener(win, "onload", fn);
167        }
168        else if (typeof win.onload == "function") {
169            var fnOld = win.onload;
170            win.onload = function() {
171                fnOld();
172                fn();
173            };
174        }
175        else {
176            win.onload = fn;
177        }
178    }
179   
180    /* Main function
181        - Will preferably execute onDomLoad, otherwise onload (as a fallback)
182    */
183    function main() { 
184        if (plugin) {
185            testPlayerVersion();
186        }
187        else {
188            matchVersions();
189        }
190    }
191   
192    /* Detect the Flash Player version for non-Internet Explorer browsers
193        - Detecting the plug-in version via the object element is more precise than using the plugins collection item's description:
194          a. Both release and build numbers can be detected
195          b. Avoid wrong descriptions by corrupt installers provided by Adobe
196          c. Avoid wrong descriptions by multiple Flash Player entries in the plugin Array, caused by incorrect browser imports
197        - Disadvantage of this method is that it depends on the availability of the DOM, while the plugins collection is immediately available
198    */
199    function testPlayerVersion() {
200        var b = doc.getElementsByTagName("body")[0];
201        var o = createElement(OBJECT);
202        o.setAttribute("type", FLASH_MIME_TYPE);
203        var t = b.appendChild(o);
204        if (t) {
205            var counter = 0;
206            (function(){
207                if (typeof t.GetVariable != UNDEF) {
208                    var d = t.GetVariable("$version");
209                    if (d) {
210                        d = d.split(" ")[1].split(",");
211                        ua.pv = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
212                    }
213                }
214                else if (counter < 10) {
215                    counter++;
216                    setTimeout(arguments.callee, 10);
217                    return;
218                }
219                b.removeChild(o);
220                t = null;
221                matchVersions();
222            })();
223        }
224        else {
225            matchVersions();
226        }
227    }
228   
229    /* Perform Flash Player and SWF version matching; static publishing only
230    */
231    function matchVersions() {
232        var rl = regObjArr.length;
233        if (rl > 0) {
234            for (var i = 0; i < rl; i++) { // for each registered object element
235                var id = regObjArr[i].id;
236                var cb = regObjArr[i].callbackFn;
237                var cbObj = {success:false, id:id};
238                if (ua.pv[0] > 0) {
239                    var obj = getElementById(id);
240                    if (obj) {
241                        if (hasPlayerVersion(regObjArr[i].swfVersion) && !(ua.wk && ua.wk < 312)) { // Flash Player version >= published SWF version: Houston, we have a match!
242                            setVisibility(id, true);
243                            if (cb) {
244                                cbObj.success = true;
245                                cbObj.ref = getObjectById(id);
246                                cb(cbObj);
247                            }
248                        }
249                        else if (regObjArr[i].expressInstall && canExpressInstall()) { // show the Adobe Express Install dialog if set by the web page author and if supported
250                            var att = {};
251                            att.data = regObjArr[i].expressInstall;
252                            att.width = obj.getAttribute("width") || "0";
253                            att.height = obj.getAttribute("height") || "0";
254                            if (obj.getAttribute("class")) { att.styleclass = obj.getAttribute("class"); }
255                            if (obj.getAttribute("align")) { att.align = obj.getAttribute("align"); }
256                            // parse HTML object param element's name-value pairs
257                            var par = {};
258                            var p = obj.getElementsByTagName("param");
259                            var pl = p.length;
260                            for (var j = 0; j < pl; j++) {
261                                if (p[j].getAttribute("name").toLowerCase() != "movie") {
262                                    par[p[j].getAttribute("name")] = p[j].getAttribute("value");
263                                }
264                            }
265                            showExpressInstall(att, par, id, cb);
266                        }
267                        else { // Flash Player and SWF version mismatch or an older Webkit engine that ignores the HTML object element's nested param elements: display alternative content instead of SWF
268                            displayAltContent(obj);
269                            if (cb) { cb(cbObj); }
270                        }
271                    }
272                }
273                else {  // if no Flash Player is installed or the fp version cannot be detected we let the HTML object element do its job (either show a SWF or alternative content)
274                    setVisibility(id, true);
275                    if (cb) {
276                        var o = getObjectById(id); // test whether there is an HTML object element or not
277                        if (o && typeof o.SetVariable != UNDEF) { 
278                            cbObj.success = true;
279                            cbObj.ref = o;
280                        }
281                        cb(cbObj);
282                    }
283                }
284            }
285        }
286    }
287   
288    function getObjectById(objectIdStr) {
289        var r = null;
290        var o = getElementById(objectIdStr);
291        if (o && o.nodeName == "OBJECT") {
292            if (typeof o.SetVariable != UNDEF) {
293                r = o;
294            }
295            else {
296                var n = o.getElementsByTagName(OBJECT)[0];
297                if (n) {
298                    r = n;
299                }
300            }
301        }
302        return r;
303    }
304   
305    /* Requirements for Adobe Express Install
306        - only one instance can be active at a time
307        - fp 6.0.65 or higher
308        - Win/Mac OS only
309        - no Webkit engines older than version 312
310    */
311    function canExpressInstall() {
312        return !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac) && !(ua.wk && ua.wk < 312);
313    }
314   
315    /* Show the Adobe Express Install dialog
316        - Reference: http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=6a253b75
317    */
318    function showExpressInstall(att, par, replaceElemIdStr, callbackFn) {
319        isExpressInstallActive = true;
320        storedCallbackFn = callbackFn || null;
321        storedCallbackObj = {success:false, id:replaceElemIdStr};
322        var obj = getElementById(replaceElemIdStr);
323        if (obj) {
324            if (obj.nodeName == "OBJECT") { // static publishing
325                storedAltContent = abstractAltContent(obj);
326                storedAltContentId = null;
327            }
328            else { // dynamic publishing
329                storedAltContent = obj;
330                storedAltContentId = replaceElemIdStr;
331            }
332            att.id = EXPRESS_INSTALL_ID;
333            if (typeof att.width == UNDEF || (!/%$/.test(att.width) && parseInt(att.width, 10) < 310)) { att.width = "310"; }
334            if (typeof att.height == UNDEF || (!/%$/.test(att.height) && parseInt(att.height, 10) < 137)) { att.height = "137"; }
335            doc.title = doc.title.slice(0, 47) + " - Flash Player Installation";
336            var pt = ua.ie && ua.win ? "ActiveX" : "PlugIn",
337                fv = "MMredirectURL=" + win.location.toString().replace(/&/g,"%26") + "&MMplayerType=" + pt + "&MMdoctitle=" + doc.title;
338            if (typeof par.flashvars != UNDEF) {
339                par.flashvars += "&" + fv;
340            }
341            else {
342                par.flashvars = fv;
343            }
344            // IE only: when a SWF is loading (AND: not available in cache) wait for the readyState of the object element to become 4 before removing it,
345            // because you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work
346            if (ua.ie && ua.win && obj.readyState != 4) {
347                var newObj = createElement("div");
348                replaceElemIdStr += "SWFObjectNew";
349                newObj.setAttribute("id", replaceElemIdStr);
350                obj.parentNode.insertBefore(newObj, obj); // insert placeholder div that will be replaced by the object element that loads expressinstall.swf
351                obj.style.display = "none";
352                (function(){
353                    if (obj.readyState == 4) {
354                        obj.parentNode.removeChild(obj);
355                    }
356                    else {
357                        setTimeout(arguments.callee, 10);
358                    }
359                })();
360            }
361            createSWF(att, par, replaceElemIdStr);
362        }
363    }
364   
365    /* Functions to abstract and display alternative content
366    */
367    function displayAltContent(obj) {
368        if (ua.ie && ua.win && obj.readyState != 4) {
369            // IE only: when a SWF is loading (AND: not available in cache) wait for the readyState of the object element to become 4 before removing it,
370            // because you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work
371            var el = createElement("div");
372            obj.parentNode.insertBefore(el, obj); // insert placeholder div that will be replaced by the alternative content
373            el.parentNode.replaceChild(abstractAltContent(obj), el);
374            obj.style.display = "none";
375            (function(){
376                if (obj.readyState == 4) {
377                    obj.parentNode.removeChild(obj);
378                }
379                else {
380                    setTimeout(arguments.callee, 10);
381                }
382            })();
383        }
384        else {
385            obj.parentNode.replaceChild(abstractAltContent(obj), obj);
386        }
387    } 
388
389    function abstractAltContent(obj) {
390        var ac = createElement("div");
391        if (ua.win && ua.ie) {
392            ac.innerHTML = obj.innerHTML;
393        }
394        else {
395            var nestedObj = obj.getElementsByTagName(OBJECT)[0];
396            if (nestedObj) {
397                var c = nestedObj.childNodes;
398                if (c) {
399                    var cl = c.length;
400                    for (var i = 0; i < cl; i++) {
401                        if (!(c[i].nodeType == 1 && c[i].nodeName == "PARAM") && !(c[i].nodeType == 8)) {
402                            ac.appendChild(c[i].cloneNode(true));
403                        }
404                    }
405                }
406            }
407        }
408        return ac;
409    }
410   
411    /* Cross-browser dynamic SWF creation
412    */
413    function createSWF(attObj, parObj, id) {
414        var r, el = getElementById(id);
415        if (ua.wk && ua.wk < 312) { return r; }
416        if (el) {
417            if (typeof attObj.id == UNDEF) { // if no 'id' is defined for the object element, it will inherit the 'id' from the alternative content
418                attObj.id = id;
419            }
420            if (ua.ie && ua.win) { // Internet Explorer + the HTML object element + W3C DOM methods do not combine: fall back to outerHTML
421                var att = "";
422                for (var i in attObj) {
423                    if (attObj[i] != Object.prototype[i]) { // filter out prototype additions from other potential libraries
424                        if (i.toLowerCase() == "data") {
425                            parObj.movie = attObj[i];
426                        }
427                        else if (i.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
428                            att += ' class="' + attObj[i] + '"';
429                        }
430                        else if (i.toLowerCase() != "classid") {
431                            att += ' ' + i + '="' + attObj[i] + '"';
432                        }
433                    }
434                }
435                var par = "";
436                for (var j in parObj) {
437                    if (parObj[j] != Object.prototype[j]) { // filter out prototype additions from other potential libraries
438                        par += '<param name="' + j + '" value="' + parObj[j] + '" />';
439                    }
440                }
441                el.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + att + '>' + par + '</object>';
442                objIdArr[objIdArr.length] = attObj.id; // stored to fix object 'leaks' on unload (dynamic publishing only)
443                r = getElementById(attObj.id); 
444            }
445            else { // well-behaving browsers
446                var o = createElement(OBJECT);
447                o.setAttribute("type", FLASH_MIME_TYPE);
448                for (var m in attObj) {
449                    if (attObj[m] != Object.prototype[m]) { // filter out prototype additions from other potential libraries
450                        if (m.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
451                            o.setAttribute("class", attObj[m]);
452                        }
453                        else if (m.toLowerCase() != "classid") { // filter out IE specific attribute
454                            o.setAttribute(m, attObj[m]);
455                        }
456                    }
457                }
458                for (var n in parObj) {
459                    if (parObj[n] != Object.prototype[n] && n.toLowerCase() != "movie") { // filter out prototype additions from other potential libraries and IE specific param element
460                        createObjParam(o, n, parObj[n]);
461                    }
462                }
463                el.parentNode.replaceChild(o, el);
464                r = o;
465            }
466        }
467        return r;
468    }
469   
470    function createObjParam(el, pName, pValue) {
471        var p = createElement("param");
472        p.setAttribute("name", pName); 
473        p.setAttribute("value", pValue);
474        el.appendChild(p);
475    }
476   
477    /* Cross-browser SWF removal
478        - Especially needed to safely and completely remove a SWF in Internet Explorer
479    */
480    function removeSWF(id) {
481        var obj = getElementById(id);
482        if (obj && obj.nodeName == "OBJECT") {
483            if (ua.ie && ua.win) {
484                obj.style.display = "none";
485                (function(){
486                    if (obj.readyState == 4) {
487                        removeObjectInIE(id);
488                    }
489                    else {
490                        setTimeout(arguments.callee, 10);
491                    }
492                })();
493            }
494            else {
495                obj.parentNode.removeChild(obj);
496            }
497        }
498    }
499   
500    function removeObjectInIE(id) {
501        var obj = getElementById(id);
502        if (obj) {
503            for (var i in obj) {
504                if (typeof obj[i] == "function") {
505                    obj[i] = null;
506                }
507            }
508            obj.parentNode.removeChild(obj);
509        }
510    }
511   
512    /* Functions to optimize JavaScript compression
513    */
514    function getElementById(id) {
515        var el = null;
516        try {
517            el = doc.getElementById(id);
518        }
519        catch (e) {}
520        return el;
521    }
522   
523    function createElement(el) {
524        return doc.createElement(el);
525    }
526   
527    /* Updated attachEvent function for Internet Explorer
528        - Stores attachEvent information in an Array, so on unload the detachEvent functions can be called to avoid memory leaks
529    */ 
530    function addListener(target, eventType, fn) {
531        target.attachEvent(eventType, fn);
532        listenersArr[listenersArr.length] = [target, eventType, fn];
533    }
534   
535    /* Flash Player and SWF content version matching
536    */
537    function hasPlayerVersion(rv) {
538        var pv = ua.pv, v = rv.split(".");
539        v[0] = parseInt(v[0], 10);
540        v[1] = parseInt(v[1], 10) || 0; // supports short notation, e.g. "9" instead of "9.0.0"
541        v[2] = parseInt(v[2], 10) || 0;
542        return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false;
543    }
544   
545    /* Cross-browser dynamic CSS creation
546        - Based on Bobby van der Sluis' solution: http://www.bobbyvandersluis.com/articles/dynamicCSS.php
547    */ 
548    function createCSS(sel, decl, media, newStyle) {
549        if (ua.ie && ua.mac) { return; }
550        var h = doc.getElementsByTagName("head")[0];
551        if (!h) { return; } // to also support badly authored HTML pages that lack a head element
552        var m = (media && typeof media == "string") ? media : "screen";
553        if (newStyle) {
554            dynamicStylesheet = null;
555            dynamicStylesheetMedia = null;
556        }
557        if (!dynamicStylesheet || dynamicStylesheetMedia != m) { 
558            // create dynamic stylesheet + get a global reference to it
559            var s = createElement("style");
560            s.setAttribute("type", "text/css");
561            s.setAttribute("media", m);
562            dynamicStylesheet = h.appendChild(s);
563            if (ua.ie && ua.win && typeof doc.styleSheets != UNDEF && doc.styleSheets.length > 0) {
564                dynamicStylesheet = doc.styleSheets[doc.styleSheets.length - 1];
565            }
566            dynamicStylesheetMedia = m;
567        }
568        // add style rule
569        if (ua.ie && ua.win) {
570            if (dynamicStylesheet && typeof dynamicStylesheet.addRule == OBJECT) {
571                dynamicStylesheet.addRule(sel, decl);
572            }
573        }
574        else {
575            if (dynamicStylesheet && typeof doc.createTextNode != UNDEF) {
576                dynamicStylesheet.appendChild(doc.createTextNode(sel + " {" + decl + "}"));
577            }
578        }
579    }
580   
581    function setVisibility(id, isVisible) {
582        if (!autoHideShow) { return; }
583        var v = isVisible ? "visible" : "hidden";
584        if (isDomLoaded && getElementById(id)) {
585            getElementById(id).style.visibility = v;
586        }
587        else {
588            createCSS("#" + id, "visibility:" + v);
589        }
590    }
591
592    /* Filter to avoid XSS attacks
593    */
594    function urlEncodeIfNecessary(s) {
595        var regex = /[\\\"<>\.;]/;
596        var hasBadChars = regex.exec(s) != null;
597        return hasBadChars && typeof encodeURIComponent != UNDEF ? encodeURIComponent(s) : s;
598    }
599   
600    /* Release memory to avoid memory leaks caused by closures, fix hanging audio/video threads and force open sockets/NetConnections to disconnect (Internet Explorer only)
601    */
602    var cleanup = function() {
603        if (ua.ie && ua.win) {
604            window.attachEvent("onunload", function() {
605                // remove listeners to avoid memory leaks
606                var ll = listenersArr.length;
607                for (var i = 0; i < ll; i++) {
608                    listenersArr[i][0].detachEvent(listenersArr[i][1], listenersArr[i][2]);
609                }
610                // cleanup dynamically embedded objects to fix audio/video threads and force open sockets and NetConnections to disconnect
611                var il = objIdArr.length;
612                for (var j = 0; j < il; j++) {
613                    removeSWF(objIdArr[j]);
614                }
615                // cleanup library's main closures to avoid memory leaks
616                for (var k in ua) {
617                    ua[k] = null;
618                }
619                ua = null;
620                for (var l in swfobject) {
621                    swfobject[l] = null;
622                }
623                swfobject = null;
624            });
625        }
626    }();
627   
628    return {
629        /* Public API
630            - Reference: http://code.google.com/p/swfobject/wiki/documentation
631        */ 
632        registerObject: function(objectIdStr, swfVersionStr, xiSwfUrlStr, callbackFn) {
633            if (ua.w3 && objectIdStr && swfVersionStr) {
634                var regObj = {};
635                regObj.id = objectIdStr;
636                regObj.swfVersion = swfVersionStr;
637                regObj.expressInstall = xiSwfUrlStr;
638                regObj.callbackFn = callbackFn;
639                regObjArr[regObjArr.length] = regObj;
640                setVisibility(objectIdStr, false);
641            }
642            else if (callbackFn) {
643                callbackFn({success:false, id:objectIdStr});
644            }
645        },
646       
647        getObjectById: function(objectIdStr) {
648            if (ua.w3) {
649                return getObjectById(objectIdStr);
650            }
651        },
652       
653        embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, xiSwfUrlStr, flashvarsObj, parObj, attObj, callbackFn) {
654            var callbackObj = {success:false, id:replaceElemIdStr};
655            if (ua.w3 && !(ua.wk && ua.wk < 312) && swfUrlStr && replaceElemIdStr && widthStr && heightStr && swfVersionStr) {
656                setVisibility(replaceElemIdStr, false);
657                addDomLoadEvent(function() {
658                    widthStr += ""; // auto-convert to string
659                    heightStr += "";
660                    var att = {};
661                    if (attObj && typeof attObj === OBJECT) {
662                        for (var i in attObj) { // copy object to avoid the use of references, because web authors often reuse attObj for multiple SWFs
663                            att[i] = attObj[i];
664                        }
665                    }
666                    att.data = swfUrlStr;
667                    att.width = widthStr;
668                    att.height = heightStr;
669                    var par = {}; 
670                    if (parObj && typeof parObj === OBJECT) {
671                        for (var j in parObj) { // copy object to avoid the use of references, because web authors often reuse parObj for multiple SWFs
672                            par[j] = parObj[j];
673                        }
674                    }
675                    if (flashvarsObj && typeof flashvarsObj === OBJECT) {
676                        for (var k in flashvarsObj) { // copy object to avoid the use of references, because web authors often reuse flashvarsObj for multiple SWFs
677                            if (typeof par.flashvars != UNDEF) {
678                                par.flashvars += "&" + k + "=" + flashvarsObj[k];
679                            }
680                            else {
681                                par.flashvars = k + "=" + flashvarsObj[k];
682                            }
683                        }
684                    }
685                    if (hasPlayerVersion(swfVersionStr)) { // create SWF
686                        var obj = createSWF(att, par, replaceElemIdStr);
687                        if (att.id == replaceElemIdStr) {
688                            setVisibility(replaceElemIdStr, true);
689                        }
690                        callbackObj.success = true;
691                        callbackObj.ref = obj;
692                    }
693                    else if (xiSwfUrlStr && canExpressInstall()) { // show Adobe Express Install
694                        att.data = xiSwfUrlStr;
695                        showExpressInstall(att, par, replaceElemIdStr, callbackFn);
696                        return;
697                    }
698                    else { // show alternative content
699                        setVisibility(replaceElemIdStr, true);
700                    }
701                    if (callbackFn) { callbackFn(callbackObj); }
702                });
703            }
704            else if (callbackFn) { callbackFn(callbackObj); }
705        },
706       
707        switchOffAutoHideShow: function() {
708            autoHideShow = false;
709        },
710       
711        ua: ua,
712       
713        getFlashPlayerVersion: function() {
714            return { major:ua.pv[0], minor:ua.pv[1], release:ua.pv[2] };
715        },
716       
717        hasFlashPlayerVersion: hasPlayerVersion,
718       
719        createSWF: function(attObj, parObj, replaceElemIdStr) {
720            if (ua.w3) {
721                return createSWF(attObj, parObj, replaceElemIdStr);
722            }
723            else {
724                return undefined;
725            }
726        },
727       
728        showExpressInstall: function(att, par, replaceElemIdStr, callbackFn) {
729            if (ua.w3 && canExpressInstall()) {
730                showExpressInstall(att, par, replaceElemIdStr, callbackFn);
731            }
732        },
733       
734        removeSWF: function(objElemIdStr) {
735            if (ua.w3) {
736                removeSWF(objElemIdStr);
737            }
738        },
739       
740        createCSS: function(selStr, declStr, mediaStr, newStyleBoolean) {
741            if (ua.w3) {
742                createCSS(selStr, declStr, mediaStr, newStyleBoolean);
743            }
744        },
745       
746        addDomLoadEvent: addDomLoadEvent,
747       
748        addLoadEvent: addLoadEvent,
749       
750        getQueryParamValue: function(param) {
751            var q = doc.location.search || doc.location.hash;
752            if (q) {
753                if (/\?/.test(q)) { q = q.split("?")[1]; } // strip question mark
754                if (param == null) {
755                    return urlEncodeIfNecessary(q);
756                }
757                var pairs = q.split("&");
758                for (var i = 0; i < pairs.length; i++) {
759                    if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) {
760                        return urlEncodeIfNecessary(pairs[i].substring((pairs[i].indexOf("=") + 1)));
761                    }
762                }
763            }
764            return "";
765        },
766       
767        // For internal usage only
768        expressInstallCallback: function() {
769            if (isExpressInstallActive) {
770                var obj = getElementById(EXPRESS_INSTALL_ID);
771                if (obj && storedAltContent) {
772                    obj.parentNode.replaceChild(storedAltContent, obj);
773                    if (storedAltContentId) {
774                        setVisibility(storedAltContentId, true);
775                        if (ua.ie && ua.win) { storedAltContent.style.display = "block"; }
776                    }
777                    if (storedCallbackFn) { storedCallbackFn(storedCallbackObj); }
778                }
779                isExpressInstallActive = false;
780            } 
781        }
782    };
783}();
784/**
785 * @class Ext.FlashComponent
786 * @extends Ext.BoxComponent
787 * @constructor
788 * @xtype flash
789 */
790Ext.FlashComponent = Ext.extend(Ext.BoxComponent, {
791    /**
792     * @cfg {String} flashVersion
793     * Indicates the version the flash content was published for. Defaults to <tt>'9.0.45'</tt>.
794     */
795    flashVersion : '9.0.45',
796
797    /**
798     * @cfg {String} backgroundColor
799     * The background color of the chart. Defaults to <tt>'#ffffff'</tt>.
800     */
801    backgroundColor: '#ffffff',
802
803    /**
804     * @cfg {String} wmode
805     * The wmode of the flash object. This can be used to control layering. Defaults to <tt>'opaque'</tt>.
806     */
807    wmode: 'opaque',
808
809    /**
810     * @cfg {String} url
811     * The URL of the chart to include. Defaults to <tt>undefined</tt>.
812     */
813    url: undefined,
814    swfId : undefined,
815    swfWidth: '100%',
816    swfHeight: '100%',
817
818    /**
819     * @cfg {Boolean} expressInstall
820     * True to prompt the user to install flash if not installed. Note that this uses
821     * Ext.FlashComponent.EXPRESS_INSTALL_URL, which should be set to the local resource. Defaults to <tt>false</tt>.
822     */
823    expressInstall: false,
824
825    initComponent : function(){
826        Ext.FlashComponent.superclass.initComponent.call(this);
827
828        this.addEvents('initialize');
829    },
830
831    onRender : function(){
832        Ext.FlashComponent.superclass.onRender.apply(this, arguments);
833
834        var params = {
835            allowScriptAccess: 'always',
836            bgcolor: this.backgroundColor,
837            wmode: this.wmode
838        }, vars = {
839            allowedDomain: document.location.hostname,
840            elementID: this.getId(),
841            eventHandler: 'Ext.FlashEventProxy.onEvent'
842        };
843
844        new swfobject.embedSWF(this.url, this.id, this.swfWidth, this.swfHeight, this.flashVersion,
845            this.expressInstall ? Ext.FlashComponent.EXPRESS_INSTALL_URL : undefined, vars, params);
846
847        this.swf = Ext.getDom(this.id);
848        this.el = Ext.get(this.swf);
849    },
850
851    getSwfId : function(){
852        return this.swfId || (this.swfId = "extswf" + (++Ext.Component.AUTO_ID));
853    },
854
855    getId : function(){
856        return this.id || (this.id = "extflashcmp" + (++Ext.Component.AUTO_ID));
857    },
858
859    onFlashEvent : function(e){
860        switch(e.type){
861            case "swfReady":
862                this.initSwf();
863                return;
864            case "log":
865                return;
866        }
867        e.component = this;
868        this.fireEvent(e.type.toLowerCase().replace(/event$/, ''), e);
869    },
870
871    initSwf : function(){
872        this.onSwfReady(!!this.isInitialized);
873        this.isInitialized = true;
874        this.fireEvent('initialize', this);
875    },
876
877    beforeDestroy: function(){
878        if(this.rendered){
879            swfobject.removeSWF(this.swf.id);
880        }
881        Ext.FlashComponent.superclass.beforeDestroy.call(this);
882    },
883
884    onSwfReady : Ext.emptyFn
885});
886
887/**
888 * Sets the url for installing flash if it doesn't exist. This should be set to a local resource.
889 * @static
890 * @type String
891 */
892Ext.FlashComponent.EXPRESS_INSTALL_URL = 'http:/' + '/swfobject.googlecode.com/svn/trunk/swfobject/expressInstall.swf';
893
894Ext.reg('flash', Ext.FlashComponent);/**
895 * @class Ext.FlashProxy
896 * @singleton
897 */
898Ext.FlashEventProxy = {
899    onEvent : function(id, e){
900        var fp = Ext.getCmp(id);
901        if(fp){
902            fp.onFlashEvent(e);
903        }else{
904            arguments.callee.defer(10, this, [id, e]);
905        }
906    }
907}/**
908 * @class Ext.chart.Chart
909 * @extends Ext.FlashComponent
910 * The Ext.chart package provides the capability to visualize data with flash based charting.
911 * Each chart binds directly to an Ext.data.Store enabling automatic updates of the chart.
912 * @constructor
913 * @xtype chart
914 */
915 
916 Ext.chart.Chart = Ext.extend(Ext.FlashComponent, {
917    refreshBuffer: 100,
918
919    /**
920     * @cfg {Object} chartStyle
921     * Sets styles for this chart. Contains a number of default values. Modifying this property will override
922     * the base styles on the chart.
923     */
924    chartStyle: {
925        padding: 10,
926        animationEnabled: true,
927        font: {
928            name: 'Tahoma',
929            color: 0x444444,
930            size: 11
931        },
932        dataTip: {
933            padding: 5,
934            border: {
935                color: 0x99bbe8,
936                size:1
937            },
938            background: {
939                color: 0xDAE7F6,
940                alpha: .9
941            },
942            font: {
943                name: 'Tahoma',
944                color: 0x15428B,
945                size: 10,
946                bold: true
947            }
948        }
949    },
950   
951    /**
952     * @cfg {String} url
953     * The url to load the chart from. This defaults to Ext.chart.Chart.CHART_URL, which should
954     * be modified to point to the local charts resource.
955     */
956   
957    /**
958     * @cfg {Object} extraStyle
959     * Contains extra styles that will be added or overwritten to the default chartStyle. Defaults to <tt>null</tt>.
960     */
961    extraStyle: null,
962   
963    /**
964     * @cfg {Boolean} disableCaching
965     * True to add a "cache buster" to the end of the chart url. Defaults to true for Opera and IE.
966     */
967    disableCaching: Ext.isIE || Ext.isOpera,
968    disableCacheParam: '_dc',
969
970    initComponent : function(){
971        Ext.chart.Chart.superclass.initComponent.call(this);
972        if(!this.url){
973            this.url = Ext.chart.Chart.CHART_URL;
974        }
975        if(this.disableCaching){
976            this.url = Ext.urlAppend(this.url, String.format('{0}={1}', this.disableCacheParam, new Date().getTime()));
977        }
978        this.addEvents(
979            'itemmouseover',
980            'itemmouseout',
981            'itemclick',
982            'itemdoubleclick',
983            'itemdragstart',
984            'itemdrag',
985            'itemdragend'
986        );
987        this.store = Ext.StoreMgr.lookup(this.store);
988    },
989
990    /**
991     * Sets a single style value on the Chart instance.
992     *
993     * @param name {String} Name of the Chart style value to change.
994     * @param value {Object} New value to pass to the Chart style.
995     */
996     setStyle: function(name, value){
997         this.swf.setStyle(name, Ext.encode(value));
998     },
999
1000    /**
1001     * Resets all styles on the Chart instance.
1002     *
1003     * @param styles {Object} Initializer for all Chart styles.
1004     */
1005    setStyles: function(styles){
1006        this.swf.setStyles(Ext.encode(styles));
1007    },
1008
1009    /**
1010     * Sets the styles on all series in the Chart.
1011     *
1012     * @param styles {Array} Initializer for all Chart series styles.
1013     */
1014    setSeriesStyles: function(styles){
1015        var s = [];
1016        Ext.each(styles, function(style){
1017            s.push(Ext.encode(style));
1018        });
1019        this.swf.setSeriesStyles(s);
1020    },
1021
1022    setCategoryNames : function(names){
1023        this.swf.setCategoryNames(names);
1024    },
1025
1026    setTipRenderer : function(fn){
1027        var chart = this;
1028        this.tipFnName = this.createFnProxy(function(item, index, series){
1029            var record = chart.store.getAt(index);
1030            return fn(chart, record, index, series);
1031        }, this.tipFnName);
1032        this.swf.setDataTipFunction(this.tipFnName);
1033    },
1034
1035    setSeries : function(series){
1036        this.series = series;
1037        this.refresh();
1038    },
1039
1040    /**
1041     * Changes the data store bound to this chart and refreshes it.
1042     * @param {Store} store The store to bind to this chart
1043     */
1044    bindStore : function(store, initial){
1045        if(!initial && this.store){
1046            this.store.un("datachanged", this.refresh, this);
1047            this.store.un("add", this.delayRefresh, this);
1048            this.store.un("remove", this.delayRefresh, this);
1049            this.store.un("update", this.delayRefresh, this);
1050            this.store.un("clear", this.refresh, this);
1051            if(store !== this.store && this.store.autoDestroy){
1052                this.store.destroy();
1053            }
1054        }
1055        if(store){
1056            store = Ext.StoreMgr.lookup(store);
1057            store.on({
1058                scope: this,
1059                datachanged: this.refresh,
1060                add: this.delayRefresh,
1061                remove: this.delayRefresh,
1062                update: this.delayRefresh,
1063                clear: this.refresh
1064            });
1065        }
1066        this.store = store;
1067        if(store && !initial){
1068            this.refresh();
1069        }
1070    },
1071
1072    onSwfReady : function(isReset){
1073        Ext.chart.Chart.superclass.onSwfReady.call(this, isReset);
1074        this.swf.setType(this.type);
1075
1076        if(this.chartStyle){
1077            this.setStyles(Ext.apply(this.extraStyle || {}, this.chartStyle));
1078        }
1079
1080        if(this.categoryNames){
1081            this.setCategoryNames(this.categoryNames);
1082        }
1083
1084        if(this.tipRenderer){
1085            this.setTipRenderer(this.tipRenderer);
1086        }
1087        if(!isReset){
1088            this.bindStore(this.store, true);
1089        }
1090        this.refresh.defer(10, this);
1091    },
1092
1093    delayRefresh : function(){
1094        if(!this.refreshTask){
1095            this.refreshTask = new Ext.util.DelayedTask(this.refresh, this);
1096        }
1097        this.refreshTask.delay(this.refreshBuffer);
1098    },
1099
1100    refresh : function(){
1101        var styleChanged = false;
1102        // convert the store data into something YUI charts can understand
1103        var data = [], rs = this.store.data.items;
1104        for(var j = 0, len = rs.length; j < len; j++){
1105            data[j] = rs[j].data;
1106        }
1107        //make a copy of the series definitions so that we aren't
1108        //editing them directly.
1109        var dataProvider = [];
1110        var seriesCount = 0;
1111        var currentSeries = null;
1112        var i = 0;
1113        if(this.series){
1114            seriesCount = this.series.length;
1115            for(i = 0; i < seriesCount; i++){
1116                currentSeries = this.series[i];
1117                var clonedSeries = {};
1118                for(var prop in currentSeries){
1119                    if(prop == "style" && currentSeries.style !== null){
1120                        clonedSeries.style = Ext.encode(currentSeries.style);
1121                        styleChanged = true;
1122                        //we don't want to modify the styles again next time
1123                        //so null out the style property.
1124                        // this causes issues
1125                        // currentSeries.style = null;
1126                    } else{
1127                        clonedSeries[prop] = currentSeries[prop];
1128                    }
1129                }
1130                dataProvider.push(clonedSeries);
1131            }
1132        }
1133
1134        if(seriesCount > 0){
1135            for(i = 0; i < seriesCount; i++){
1136                currentSeries = dataProvider[i];
1137                if(!currentSeries.type){
1138                    currentSeries.type = this.type;
1139                }
1140                currentSeries.dataProvider = data;
1141            }
1142        } else{
1143            dataProvider.push({type: this.type, dataProvider: data});
1144        }
1145        this.swf.setDataProvider(dataProvider);
1146    },
1147
1148    createFnProxy : function(fn, old){
1149        if(old){
1150            delete window[old];
1151        }
1152        var fnName = "extFnProxy" + (++Ext.chart.Chart.PROXY_FN_ID);
1153        window[fnName] = fn;
1154        return fnName;
1155    },
1156   
1157    onDestroy: function(){
1158        Ext.chart.Chart.superclass.onDestroy.call(this);
1159        delete window[this.tipFnName];
1160    }
1161});
1162Ext.reg('chart', Ext.chart.Chart);
1163Ext.chart.Chart.PROXY_FN_ID = 0;
1164
1165/**
1166 * Sets the url to load the chart from. This should be set to a local resource.
1167 * @static
1168 * @type String
1169 */
1170Ext.chart.Chart.CHART_URL = 'http:/' + '/yui.yahooapis.com/2.7.0/build/charts/assets/charts.swf';
1171
1172/**
1173 * @class Ext.chart.PieChart
1174 * @extends Ext.chart.Chart
1175 * @constructor
1176 * @xtype piechart
1177 */
1178Ext.chart.PieChart = Ext.extend(Ext.chart.Chart, {
1179    type: 'pie',
1180
1181    onSwfReady : function(isReset){
1182        Ext.chart.PieChart.superclass.onSwfReady.call(this, isReset);
1183
1184        this.setDataField(this.dataField);
1185        this.setCategoryField(this.categoryField);
1186    },
1187
1188    setDataField : function(field){
1189        this.dataField = field;
1190        this.swf.setDataField(field);
1191    },
1192
1193    setCategoryField : function(field){
1194        this.categoryField = field;
1195        this.swf.setCategoryField(field);
1196    }
1197});
1198Ext.reg('piechart', Ext.chart.PieChart);
1199
1200/**
1201 * @class Ext.chart.CartesianChart
1202 * @extends Ext.chart.Chart
1203 * @constructor
1204 * @xtype cartesianchart
1205 */
1206Ext.chart.CartesianChart = Ext.extend(Ext.chart.Chart, {
1207    onSwfReady : function(isReset){
1208        Ext.chart.CartesianChart.superclass.onSwfReady.call(this, isReset);
1209
1210        if(this.xField){
1211            this.setXField(this.xField);
1212        }
1213        if(this.yField){
1214            this.setYField(this.yField);
1215        }
1216        if(this.xAxis){
1217            this.setXAxis(this.xAxis);
1218        }
1219        if(this.yAxis){
1220            this.setYAxis(this.yAxis);
1221        }
1222    },
1223
1224    setXField : function(value){
1225        this.xField = value;
1226        this.swf.setHorizontalField(value);
1227    },
1228
1229    setYField : function(value){
1230        this.yField = value;
1231        this.swf.setVerticalField(value);
1232    },
1233
1234    setXAxis : function(value){
1235        this.xAxis = this.createAxis('xAxis', value);
1236        this.swf.setHorizontalAxis(this.xAxis);
1237    },
1238
1239    setYAxis : function(value){
1240        this.yAxis = this.createAxis('yAxis', value);
1241        this.swf.setVerticalAxis(this.yAxis);
1242    },
1243
1244    createAxis : function(axis, value){
1245        var o = Ext.apply({}, value), oldFn = null;
1246        if(this[axis]){
1247            oldFn = this[axis].labelFunction;
1248        }
1249        if(o.labelRenderer){
1250            var fn = o.labelRenderer;
1251            o.labelFunction = this.createFnProxy(function(v){
1252                return fn(v);
1253            }, oldFn);
1254            delete o.labelRenderer;
1255        }
1256        return o;
1257    }
1258});
1259Ext.reg('cartesianchart', Ext.chart.CartesianChart);
1260
1261/**
1262 * @class Ext.chart.LineChart
1263 * @extends Ext.chart.CartesianChart
1264 * @constructor
1265 * @xtype linechart
1266 */
1267Ext.chart.LineChart = Ext.extend(Ext.chart.CartesianChart, {
1268    type: 'line'
1269});
1270Ext.reg('linechart', Ext.chart.LineChart);
1271
1272/**
1273 * @class Ext.chart.ColumnChart
1274 * @extends Ext.chart.CartesianChart
1275 * @constructor
1276 * @xtype columnchart
1277 */
1278Ext.chart.ColumnChart = Ext.extend(Ext.chart.CartesianChart, {
1279    type: 'column'
1280});
1281Ext.reg('columnchart', Ext.chart.ColumnChart);
1282
1283/**
1284 * @class Ext.chart.StackedColumnChart
1285 * @extends Ext.chart.CartesianChart
1286 * @constructor
1287 * @xtype stackedcolumnchart
1288 */
1289Ext.chart.StackedColumnChart = Ext.extend(Ext.chart.CartesianChart, {
1290    type: 'stackcolumn'
1291});
1292Ext.reg('stackedcolumnchart', Ext.chart.StackedColumnChart);
1293
1294/**
1295 * @class Ext.chart.BarChart
1296 * @extends Ext.chart.CartesianChart
1297 * @constructor
1298 * @xtype barchart
1299 */
1300Ext.chart.BarChart = Ext.extend(Ext.chart.CartesianChart, {
1301    type: 'bar'
1302});
1303Ext.reg('barchart', Ext.chart.BarChart);
1304
1305/**
1306 * @class Ext.chart.StackedBarChart
1307 * @extends Ext.chart.CartesianChart
1308 * @constructor
1309 * @xtype stackedbarchart
1310 */
1311Ext.chart.StackedBarChart = Ext.extend(Ext.chart.CartesianChart, {
1312    type: 'stackbar'
1313});
1314Ext.reg('stackedbarchart', Ext.chart.StackedBarChart);
1315
1316
1317
1318/**
1319 * @class Ext.chart.Axis
1320 * Defines a CartesianChart's vertical or horizontal axis.
1321 * @constructor
1322 */
1323Ext.chart.Axis = function(config){
1324    Ext.apply(this, config);
1325};
1326
1327Ext.chart.Axis.prototype =
1328{
1329    /**
1330     * The type of axis.
1331     *
1332     * @property type
1333     * @type String
1334     */
1335    type: null,
1336
1337    /**
1338     * The direction in which the axis is drawn. May be "horizontal" or "vertical".
1339     *
1340     * @property orientation
1341     * @type String
1342     */
1343    orientation: "horizontal",
1344
1345    /**
1346     * If true, the items on the axis will be drawn in opposite direction.
1347     *
1348     * @property reverse
1349     * @type Boolean
1350     */
1351    reverse: false,
1352
1353    /**
1354     * A string reference to the globally-accessible function that may be called to
1355     * determine each of the label values for this axis.
1356     *
1357     * @property labelFunction
1358     * @type String
1359     */
1360    labelFunction: null,
1361
1362    /**
1363     * If true, labels that overlap previously drawn labels on the axis will be hidden.
1364     *
1365     * @property hideOverlappingLabels
1366     * @type Boolean
1367     */
1368    hideOverlappingLabels: true
1369};
1370
1371/**
1372 * @class Ext.chart.NumericAxis
1373 * @extends Ext.chart.Axis
1374 * A type of axis whose units are measured in numeric values.
1375 * @constructor
1376 */
1377Ext.chart.NumericAxis = Ext.extend(Ext.chart.Axis, {
1378    type: "numeric",
1379
1380    /**
1381     * The minimum value drawn by the axis. If not set explicitly, the axis minimum
1382     * will be calculated automatically.
1383     *
1384     * @property minimum
1385     * @type Number
1386     */
1387    minimum: NaN,
1388
1389    /**
1390     * The maximum value drawn by the axis. If not set explicitly, the axis maximum
1391     * will be calculated automatically.
1392     *
1393     * @property maximum
1394     * @type Number
1395     */
1396    maximum: NaN,
1397
1398    /**
1399     * The spacing between major intervals on this axis.
1400     *
1401     * @property majorUnit
1402     * @type Number
1403     */
1404    majorUnit: NaN,
1405
1406    /**
1407     * The spacing between minor intervals on this axis.
1408     *
1409     * @property minorUnit
1410     * @type Number
1411     */
1412    minorUnit: NaN,
1413
1414    /**
1415     * If true, the labels, ticks, gridlines, and other objects will snap to
1416     * the nearest major or minor unit. If false, their position will be based
1417     * on the minimum value.
1418     *
1419     * @property snapToUnits
1420     * @type Boolean
1421     */
1422    snapToUnits: true,
1423
1424    /**
1425     * If true, and the bounds are calculated automatically, either the minimum or
1426     * maximum will be set to zero.
1427     *
1428     * @property alwaysShowZero
1429     * @type Boolean
1430     */
1431    alwaysShowZero: true,
1432
1433    /**
1434     * The scaling algorithm to use on this axis. May be "linear" or "logarithmic".
1435     *
1436     * @property scale
1437     * @type String
1438     */
1439    scale: "linear"
1440});
1441
1442/**
1443 * @class Ext.chart.TimeAxis
1444 * @extends Ext.chart.Axis
1445 * A type of axis whose units are measured in time-based values.
1446 * @constructor
1447 */
1448Ext.chart.TimeAxis = Ext.extend(Ext.chart.Axis, {
1449    type: "time",
1450
1451    /**
1452     * The minimum value drawn by the axis. If not set explicitly, the axis minimum
1453     * will be calculated automatically.
1454     *
1455     * @property minimum
1456     * @type Date
1457     */
1458    minimum: null,
1459
1460    /**
1461     * The maximum value drawn by the axis. If not set explicitly, the axis maximum
1462     * will be calculated automatically.
1463     *
1464     * @property maximum
1465     * @type Number
1466     */
1467    maximum: null,
1468
1469    /**
1470     * The spacing between major intervals on this axis.
1471     *
1472     * @property majorUnit
1473     * @type Number
1474     */
1475    majorUnit: NaN,
1476
1477    /**
1478     * The time unit used by the majorUnit.
1479     *
1480     * @property majorTimeUnit
1481     * @type String
1482     */
1483    majorTimeUnit: null,
1484
1485    /**
1486     * The spacing between minor intervals on this axis.
1487     *
1488     * @property majorUnit
1489     * @type Number
1490     */
1491    minorUnit: NaN,
1492
1493    /**
1494     * The time unit used by the minorUnit.
1495     *
1496     * @property majorTimeUnit
1497     * @type String
1498     */
1499    minorTimeUnit: null,
1500
1501    /**
1502     * If true, the labels, ticks, gridlines, and other objects will snap to
1503     * the nearest major or minor unit. If false, their position will be based
1504     * on the minimum value.
1505     *
1506     * @property snapToUnits
1507     * @type Boolean
1508     */
1509    snapToUnits: true
1510});
1511
1512/**
1513 * @class Ext.chart.CategoryAxis
1514 * @extends Ext.chart.Axis
1515 * A type of axis that displays items in categories.
1516 * @constructor
1517 */
1518Ext.chart.CategoryAxis = Ext.extend(Ext.chart.Axis, {
1519    type: "category",
1520
1521    /**
1522     * A list of category names to display along this axis.
1523     *
1524     * @property categoryNames
1525     * @type Array
1526     */
1527    categoryNames: null
1528});
1529
1530/**
1531 * @class Ext.chart.Series
1532 * Series class for the charts widget.
1533 * @constructor
1534 */
1535Ext.chart.Series = function(config) { Ext.apply(this, config); };
1536
1537Ext.chart.Series.prototype =
1538{
1539    /**
1540     * The type of series.
1541     *
1542     * @property type
1543     * @type String
1544     */
1545    type: null,
1546
1547    /**
1548     * The human-readable name of the series.
1549     *
1550     * @property displayName
1551     * @type String
1552     */
1553    displayName: null
1554};
1555
1556/**
1557 * @class Ext.chart.CartesianSeries
1558 * @extends Ext.chart.Series
1559 * CartesianSeries class for the charts widget.
1560 * @constructor
1561 */
1562Ext.chart.CartesianSeries = Ext.extend(Ext.chart.Series, {
1563    /**
1564     * The field used to access the x-axis value from the items from the data source.
1565     *
1566     * @property xField
1567     * @type String
1568     */
1569    xField: null,
1570
1571    /**
1572     * The field used to access the y-axis value from the items from the data source.
1573     *
1574     * @property yField
1575     * @type String
1576     */
1577    yField: null
1578});
1579
1580/**
1581 * @class Ext.chart.ColumnSeries
1582 * @extends Ext.chart.CartesianSeries
1583 * ColumnSeries class for the charts widget.
1584 * @constructor
1585 */
1586Ext.chart.ColumnSeries = Ext.extend(Ext.chart.CartesianSeries, {
1587    type: "column"
1588});
1589
1590/**
1591 * @class Ext.chart.LineSeries
1592 * @extends Ext.chart.CartesianSeries
1593 * LineSeries class for the charts widget.
1594 * @constructor
1595 */
1596Ext.chart.LineSeries = Ext.extend(Ext.chart.CartesianSeries, {
1597    type: "line"
1598});
1599
1600/**
1601 * @class Ext.chart.BarSeries
1602 * @extends Ext.chart.CartesianSeries
1603 * BarSeries class for the charts widget.
1604 * @constructor
1605 */
1606Ext.chart.BarSeries = Ext.extend(Ext.chart.CartesianSeries, {
1607    type: "bar"
1608});
1609
1610
1611/**
1612 * @class Ext.chart.PieSeries
1613 * @extends Ext.chart.Series
1614 * PieSeries class for the charts widget.
1615 * @constructor
1616 */
1617Ext.chart.PieSeries = Ext.extend(Ext.chart.Series, {
1618    type: "pie",
1619    dataField: null,
1620    categoryField: null
1621});
Note: See TracBrowser for help on using the repository browser.