    /*!
     * Ext JS Library 3.3.0
     * Copyright(c) 2006-2010 Ext JS, Inc.
     * licensing@extjs.com
     * http://www.extjs.com/license
     */
    Ext.ns('Ext.ux');

    Ext.ux.JSONP = (function(){
        var _queue = [],
            _current = null,
            _nextRequest = function() {
                _current = null;
                if(_queue.length) {
                    _current = _queue.shift();
        			_current.script.src = _current.url + '?' + _current.params;
        			document.getElementsByTagName('head')[0].appendChild(_current.script);
                }
            };

        return {
            request: function(url, o) {
                if(!url) {
                    return;
                }
                var me = this;

                o.params = o.params || {};
                if(o.callbackKey) {
                    o.params[o.callbackKey] = 'Ext.ux.JSONP.callback';
                }
                var params = Ext.urlEncode(o.params);

                var script = document.createElement('script');
    			script.type = 'text/javascript';

                if(o.isRawJSON) {
                    if(Ext.isIE) {
                        Ext.fly(script).on('readystatechange', function() {
                            if(script.readyState == 'complete') {
                                var data = script.innerHTML;
                                if(data.length) {
                                    me.callback(Ext.decode(data));
                                }
                            }
                        });
                    }
                    else {
                         Ext.fly(script).on('load', function() {
                            var data = script.innerHTML;
                            if(data.length) {
                                me.callback(Ext.decode(data));
                            }
                        });
                    }
                }

                _queue.push({
                    url: url,
                    script: script,
                    callback: o.callback || function(){},
                    scope: o.scope || window,
                    params: params || null
                });

                if(!_current) {
                    _nextRequest();
                }
            },

            callback: function(json) {
                _current.callback.apply(_current.scope, [json]);
                Ext.fly(_current.script).removeAllListeners();
                document.getElementsByTagName('head')[0].removeChild(_current.script);
                _nextRequest();
            }
        }
    })();