/*
This file is part of Ext JS 5.1.1.451
Copyright (c) 2011-2015 Sencha Inc
Contact: http://www.sencha.com/contact
GNU General Public License Usage
This file may be used under the terms of the GNU General Public License version 3.0 as
published by the Free Software Foundation and appearing in the file LICENSE included in the
packaging of this file.
Please review the following information to ensure the GNU General Public License version 3.0
requirements will be met: http://www.gnu.org/copyleft/gpl.html.
If you are unsure which license is appropriate for your use, please contact the sales department
at http://www.sencha.com/contact.
Version: 5.1.1.451 Build date: 2015-05-06 21:53:32 (130b7b8a6334f33aee5c2952cefb768cadb3bf78)
*/
var Ext = Ext || {};
Ext.Boot = Ext.Boot || (function (emptyFn) {
var doc = document,
apply = function (dest, src, defaults) {
if (defaults) {
apply(dest, defaults);
}
if (dest && src && typeof src == 'object') {
for (var key in src) {
dest[key] = src[key];
}
}
return dest;
},
_config = {
disableCaching: (/[?&](?:cache|disableCacheBuster)\b/i.test(location.search) ||
!(/http[s]?\:/i.test(location.href)) ||
/(^|[ ;])ext-cache=1/.test(doc.cookie)) ? false :
true,
disableCachingParam: '_dc',
loadDelay: false,
preserveScripts: true,
charset: undefined
},
cssRe = /\.css(?:\?|$)/i,
resolverEl = doc.createElement('a'),
isBrowser = typeof window !== 'undefined',
_environment = {
browser: isBrowser,
node: !isBrowser && (typeof require === 'function'),
phantom: (typeof phantom !== 'undefined' && phantom.fs)
},
_tags = (Ext.platformTags = {}),
_debug = function (message) {
},
_apply = function (object, config, defaults) {
if (defaults) {
_apply(object, defaults);
}
if (object && config && typeof config === 'object') {
for (var i in config) {
object[i] = config[i];
}
}
return object;
},
Boot = {
loading: 0,
loaded: 0,
env: _environment,
config: _config,
scripts: {
},
currentFile: null,
suspendedQueue: [],
currentRequest: null,
syncMode: false,
debug: _debug,
useElements: true,
listeners: [],
Request: Request,
Entry: Entry,
detectPlatformTags: function () {
var ua = navigator.userAgent,
isMobile = _tags.isMobile = /Mobile(\/|\s)/.test(ua),
isPhone, isDesktop, isTablet, touchSupported, isIE10, isBlackberry,
element = document.createElement('div'),
uaTagChecks = [
'iPhone',
'iPod',
'Android',
'Silk',
'Android 2',
'BlackBerry',
'BB',
'iPad',
'RIM Tablet OS',
'MSIE 10',
'Trident',
'Chrome',
'Tizen',
'Firefox',
'Safari',
'Windows Phone'
],
isEventSupported = function(name, tag) {
if (tag === undefined) {
tag = window;
}
var eventName = 'on' + name.toLowerCase(),
isSupported = (eventName in element);
if (!isSupported) {
if (element.setAttribute && element.removeAttribute) {
element.setAttribute(eventName, '');
isSupported = typeof element[eventName] === 'function';
if (typeof element[eventName] !== 'undefined') {
element[eventName] = undefined;
}
element.removeAttribute(eventName);
}
}
return isSupported;
},
uaTags = {},
len = uaTagChecks.length, check, c;
for (c = 0; c < len; c++) {
check = uaTagChecks[c];
uaTags[check] = new RegExp(check).test(ua);
}
isPhone =
(uaTags.iPhone || uaTags.iPod) ||
(!uaTags.Silk && (uaTags.Android && (uaTags['Android 2'] || isMobile))) ||
((uaTags.BlackBerry || uaTags.BB) && uaTags.isMobile) ||
(uaTags['Windows Phone']);
isTablet =
(!_tags.isPhone) && (
uaTags.iPad ||
uaTags.Android ||
uaTags.Silk ||
uaTags['RIM Tablet OS'] ||
(uaTags['MSIE 10'] && /; Touch/.test(ua))
);
touchSupported =
isEventSupported('touchend') ||
navigator.maxTouchPoints ||
navigator.msMaxTouchPoints;
isDesktop = !isPhone && !isTablet;
isIE10 = uaTags['MSIE 10'];
isBlackberry = uaTags.Blackberry || uaTags.BB;
apply(_tags, Boot.loadPlatformsParam(), {
phone: isPhone,
tablet: isTablet,
desktop: isDesktop,
touch: touchSupported,
ios: (uaTags.iPad || uaTags.iPhone || uaTags.iPod),
android: uaTags.Android || uaTags.Silk,
blackberry: isBlackberry,
safari: uaTags.Safari && !isBlackberry,
chrome: uaTags.Chrome,
ie10: isIE10,
windows: isIE10 || uaTags.Trident,
tizen: uaTags.Tizen,
firefox: uaTags.Firefox
});
},
loadPlatformsParam: function () {
var paramsString = window.location.search.substr(1),
paramsArray = paramsString.split("&"),
params = {}, i,
platforms = {},
tmpArray, tmplen, platform, name, enabled;
for (i = 0; i < paramsArray.length; i++) {
tmpArray = paramsArray[i].split("=");
params[tmpArray[0]] = tmpArray[1];
}
if (params.platformTags) {
tmpArray = params.platform.split(/\W/);
for (tmplen = tmpArray.length, i = 0; i < tmplen; i++) {
platform = tmpArray[i].split(":");
name = platform[0];
if (platform.length > 1) {
enabled = platform[1];
if (enabled === 'false' || enabled === '0') {
enabled = false;
} else {
enabled = true;
}
}
platforms[name] = enabled;
}
}
return platform;
},
filterPlatform: function (platform) {
platform = [].concat(platform);
var len, p, tag;
for (len = platform.length, p = 0; p < len; p++) {
tag = platform[p];
if (_tags.hasOwnProperty(tag)) {
return !!_tags[tag];
}
}
return false;
},
init: function () {
var scriptEls = doc.getElementsByTagName('script'),
len = scriptEls.length,
re = /\/ext(\-[a-z\-]+)?\.js$/,
entry, script, src, state, baseUrl, key, n, origin;
for (n = 0; n < len; n++) {
src = (script = scriptEls[n]).src;
if (!src) {
continue;
}
state = script.readyState || null;
if (!baseUrl) {
if (re.test(src)) {
Boot.hasReadyState = ("readyState" in script);
Boot.hasAsync = ("async" in script) || !Boot.hasReadyState;
baseUrl = src;
}
}
if (!Boot.scripts[key = Boot.canonicalUrl(src)]) {
_debug("creating entry " + key + " in Boot.init");
entry = new Entry({
key: key,
url: src,
done: state === null ||
state === 'loaded' || state === 'complete',
el: script,
prop: 'src'
});
}
}
if (!baseUrl) {
script = scriptEls[scriptEls.length - 1];
baseUrl = script.src;
Boot.hasReadyState = ('readyState' in script);
Boot.hasAsync = ("async" in script) || !Boot.hasReadyState;
}
Boot.baseUrl = baseUrl.substring(0, baseUrl.lastIndexOf('/') + 1);
origin = window.location.origin ||
window.location.protocol +
"//" +
window.location.hostname +
(window.location.port ? ':' + window.location.port: '');
Boot.origin = origin;
Boot.detectPlatformTags();
Ext.filterPlatform = Boot.filterPlatform;
},
canonicalUrl: function (url) {
resolverEl.href = url;
var ret = resolverEl.href,
dc = _config.disableCachingParam,
pos = dc ? ret.indexOf(dc + '=') : -1,
c, end;
if (pos > 0 && ((c = ret.charAt(pos - 1)) === '?' || c === '&')) {
end = ret.indexOf('&', pos);
end = (end < 0) ? '' : ret.substring(end);
if (end && c === '?') {
++pos;
end = end.substring(1);
}
ret = ret.substring(0, pos - 1) + end;
}
return ret;
},
getConfig: function (name) {
return name ? Boot.config[name] : Boot.config;
},
setConfig: function (name, value) {
if (typeof name === 'string') {
Boot.config[name] = value;
} else {
for (var s in name) {
Boot.setConfig(s, name[s]);
}
}
return Boot;
},
getHead: function () {
return Boot.docHead ||
(Boot.docHead = doc.head ||
doc.getElementsByTagName('head')[0]);
},
create: function (url, key, cfg) {
var config = cfg || {};
config.url = url;
config.key = key;
return Boot.scripts[key] = new Entry(config);
},
getEntry: function (url, cfg) {
var key = Boot.canonicalUrl(url),
entry = Boot.scripts[key];
if (!entry) {
entry = Boot.create(url, key, cfg);
}
return entry;
},
processRequest: function(request, sync) {
request.loadEntries(sync);
},
load: function (request) {
_debug("Boot.load called");
var request = new Request(request);
if (request.sync || Boot.syncMode) {
return Boot.loadSync(request);
}
if (Boot.currentRequest) {
_debug("current active request, suspending this request");
request.getEntries();
Boot.suspendedQueue.push(request);
} else {
Boot.currentRequest = request;
Boot.processRequest(request, false);
}
return Boot;
},
loadSync: function (request) {
_debug("Boot.loadSync called");
var request = new Request(request);
Boot.syncMode++;
Boot.processRequest(request, true);
Boot.syncMode--;
return Boot;
},
loadBasePrefix: function(request) {
request = new Request(request);
request.prependBaseUrl = true;
return Boot.load(request);
},
loadSyncBasePrefix: function(request) {
request = new Request(request);
request.prependBaseUrl = true;
return Boot.loadSync(request);
},
requestComplete: function(request) {
var next;
if (Boot.currentRequest === request) {
Boot.currentRequest = null;
while(Boot.suspendedQueue.length > 0) {
next = Boot.suspendedQueue.shift();
if(!next.done) {
_debug("resuming suspended request");
Boot.load(next);
break;
}
}
}
if (!Boot.currentRequest && Boot.suspendedQueue.length == 0) {
Boot.fireListeners();
}
},
isLoading: function () {
return !Boot.currentRequest && Boot.suspendedQueue.length == 0;
},
fireListeners: function () {
var listener;
while (Boot.isLoading() && (listener = Boot.listeners.shift())) {
listener();
}
},
onBootReady: function (listener) {
if (!Boot.isLoading()) {
listener();
} else {
Boot.listeners.push(listener);
}
},
getPathsFromIndexes: function (indexMap, loadOrder) {
return Request.prototype.getPathsFromIndexes(indexMap, loadOrder);
},
createLoadOrderMap: function(loadOrder) {
return Request.prototype.createLoadOrderMap(loadOrder);
},
fetch: function(url, complete, scope, async) {
async = (async === undefined) ? !!complete : async;
var xhr = new XMLHttpRequest(),
result, status, content, exception = false,
readyStateChange = function () {
if (xhr && xhr.readyState == 4) {
status = (xhr.status === 1223) ? 204 :
(xhr.status === 0 && ((self.location || {}).protocol === 'file:' ||
(self.location || {}).protocol === 'ionp:')) ? 200 : xhr.status;
content = xhr.responseText;
result = {
content: content,
status: status,
exception: exception
};
if (complete) {
complete.call(scope, result);
}
xhr = null;
}
};
if (async) {
xhr.onreadystatechange = readyStateChange;
}
try {
_debug("fetching " + url + " " + (async ? "async" : "sync"));
xhr.open('GET', url, async);
xhr.send(null);
} catch (err) {
exception = err;
readyStateChange();
return result;
}
if (!async) {
readyStateChange();
}
return result;
},
notifyAll: function(entry) {
entry.notifyRequests();
}
};
function Request(cfg) {
if(cfg.$isRequest) {
return cfg;
}
var cfg = cfg.url ? cfg : {url: cfg},
url = cfg.url,
urls = url.charAt ? [ url ] : url,
charset = cfg.charset || Boot.config.charset;
_apply(cfg, {
urls: urls,
charset: charset
});
_apply(this, cfg);
};
Request.prototype = {
$isRequest: true,
createLoadOrderMap: function (loadOrder) {
var len = loadOrder.length,
loadOrderMap = {},
i, element;
for (i = 0; i < len; i++) {
element = loadOrder[i];
loadOrderMap[element.path] = element;
}
return loadOrderMap;
},
getLoadIndexes: function (index, indexMap, loadOrder, includeUses, skipLoaded) {
var item = loadOrder[index],
len, i, reqs, entry, stop, added, idx, ridx, url;
if (indexMap[index]) {
return indexMap;
}
indexMap[index] = true;
stop = false;
while (!stop) {
added = false;
for (idx in indexMap) {
if (indexMap.hasOwnProperty(idx)) {
item = loadOrder[idx];
if (!item) {
continue;
}
url = this.prepareUrl(item.path);
entry = Boot.getEntry(url);
if (!skipLoaded || !entry || !entry.done) {
reqs = item.requires;
if (includeUses && item.uses) {
reqs = reqs.concat(item.uses);
}
for (len = reqs.length, i = 0; i < len; i++) {
ridx = reqs[i];
if (!indexMap[ridx]) {
indexMap[ridx] = true;
added = true;
}
}
}
}
}
if (!added) {
stop = true;
}
}
return indexMap;
},
getPathsFromIndexes: function (indexMap, loadOrder) {
var indexes = [],
paths = [],
index, len, i;
for (index in indexMap) {
if (indexMap.hasOwnProperty(index) && indexMap[index]) {
indexes.push(index);
}
}
indexes.sort(function (a, b) {
return a - b;
});
for (len = indexes.length, i = 0; i < len; i++) {
paths.push(loadOrder[indexes[i]].path);
}
return paths;
},
expandUrl: function (url, indexMap, includeUses, skipLoaded) {
if (typeof url == 'string') {
url = [url];
}
var me = this,
loadOrder = me.loadOrder,
loadOrderMap = me.loadOrderMap;
if (loadOrder) {
loadOrderMap = loadOrderMap || me.createLoadOrderMap(loadOrder);
me.loadOrderMap = loadOrderMap;
indexMap = indexMap || {};
var len = url.length,
unmapped = [],
i, item;
for (i = 0; i < len; i++) {
item = loadOrderMap[url[i]];
if (item) {
me.getLoadIndexes(item.idx, indexMap, loadOrder, includeUses, skipLoaded);
} else {
unmapped.push(url[i]);
}
}
return me.getPathsFromIndexes(indexMap, loadOrder).concat(unmapped);
}
return url;
},
expandUrls: function (urls, includeUses) {
if (typeof urls == "string") {
urls = [urls];
}
var expanded = [],
expandMap = {},
tmpExpanded,
len = urls.length,
i, t, tlen, tUrl;
for (i = 0; i < len; i++) {
tmpExpanded = this.expandUrl(urls[i], {}, includeUses, true);
for (t = 0, tlen = tmpExpanded.length; t < tlen; t++) {
tUrl = tmpExpanded[t];
if (!expandMap[tUrl]) {
expandMap[tUrl] = true;
expanded.push(tUrl);
}
}
}
if (expanded.length == 0) {
expanded = urls;
}
return expanded;
},
expandLoadOrder: function () {
var me = this,
urls = me.urls,
expanded;
if (!me.expanded) {
expanded = this.expandUrls(urls, true);
me.expanded = true;
} else {
expanded = urls;
}
me.urls = expanded;
if (urls.length != expanded.length) {
me.sequential = true;
}
return me;
},
getUrls: function () {
this.expandLoadOrder();
return this.urls;
},
prepareUrl: function(url) {
if(this.prependBaseUrl) {
return Boot.baseUrl + url;
}
return url;
},
getEntries: function () {
var me = this,
entries = me.entries,
i, entry, urls, url;
if (!entries) {
entries = [];
urls = me.getUrls();
for (i = 0; i < urls.length; i++) {
url = me.prepareUrl(urls[i]);
entry = Boot.getEntry(url, {
buster: me.buster,
charset: me.charset
});
entry.requests.push(me);
entries.push(entry);
}
me.entries = entries;
}
return entries;
},
loadEntries: function(sync) {
var me = this,
entries = me.getEntries(),
len = entries.length,
start = me.loadStart || 0,
continueLoad, entry, i;
if(sync !== undefined) {
me.sync = sync;
}
me.loaded = me.loaded || 0;
me.loading = me.loading || len;
for(i = start; i < len; i++) {
entry = entries[i];
if(!entry.loaded) {
continueLoad = entries[i].load(me.sync);
} else {
continueLoad = true;
}
if(!continueLoad) {
me.loadStart = i;
entry.onDone(function(){
me.loadEntries(sync);
});
break;
}
}
me.processLoadedEntries();
},
processLoadedEntries: function () {
var me = this,
entries = me.getEntries(),
len = entries.length,
start = me.startIndex || 0,
i, entry;
if (!me.done) {
for (i = start; i < len; i++) {
entry = entries[i];
if (!entry.loaded) {
me.startIndex = i;
return;
}
if (!entry.evaluated) {
entry.evaluate();
}
if (entry.error) {
me.error = true;
}
}
me.notify();
}
},
notify: function () {
var me = this;
if (!me.done) {
var error = me.error,
fn = me[error ? 'failure' : 'success'],
delay = ('delay' in me)
? me.delay
: (error ? 1 : Boot.config.chainDelay),
scope = me.scope || me;
me.done = true;
if (fn) {
if (delay === 0 || delay > 0) {
setTimeout(function () {
fn.call(scope, me);
}, delay);
} else {
fn.call(scope, me);
}
}
me.fireListeners();
Boot.requestComplete(me);
}
},
onDone: function(listener) {
var me = this,
listeners = me.listeners || (me.listeners = []);
if(me.done) {
listener(me);
} else {
listeners.push(listener);
}
},
fireListeners: function() {
var listeners = this.listeners,
listener;
if(listeners) {
_debug("firing request listeners");
while((listener = listeners.shift())) {
listener(this);
}
}
}
};
function Entry(cfg) {
if(cfg.$isEntry) {
return cfg;
}
_debug("creating entry for " + cfg.url);
var charset = cfg.charset || Boot.config.charset,
manifest = Ext.manifest,
loader = manifest && manifest.loader,
cache = (cfg.cache !== undefined) ? cfg.cache : (loader && loader.cache),
buster, busterParam;
if(cache === undefined) {
cache = !Boot.config.disableCaching;
}
if(cache === false) {
buster = +new Date();
} else if(cache !== true) {
buster = cache;
}
if(buster) {
busterParam = (loader && loader.cacheParam) || Boot.config.disableCachingParam;
buster = busterParam + "=" + buster;
};
_apply(cfg, {
charset: charset,
buster: buster,
requests: []
});
_apply(this, cfg);
};
Entry.prototype = {
$isEntry: true,
done: false,
evaluated: false,
loaded: false,
isCrossDomain: function() {
var me = this;
if(me.crossDomain === undefined) {
_debug("checking " + me.getLoadUrl() + " for prefix " + Boot.origin);
me.crossDomain = (me.getLoadUrl().indexOf(Boot.origin) !== 0);
}
return me.crossDomain;
},
isCss: function () {
var me = this;
if (me.css === undefined) {
me.css = me.url && cssRe.test(me.url);
}
return this.css;
},
getElement: function (tag) {
var me = this,
el = me.el;
if (!el) {
_debug("creating element for " + me.url);
if (me.isCss()) {
tag = tag || "link";
el = doc.createElement(tag);
if(tag == "link") {
el.rel = 'stylesheet';
me.prop = 'href';
} else {
me.prop="textContent";
}
el.type = "text/css";
} else {
tag = tag || "script";
el = doc.createElement(tag);
el.type = 'text/javascript';
me.prop = 'src';
if (Boot.hasAsync) {
el.async = false;
}
}
me.el = el;
}
return el;
},
getLoadUrl: function () {
var me = this,
url = Boot.canonicalUrl(me.url);
if (!me.loadUrl) {
me.loadUrl = !!me.buster
? (url + (url.indexOf('?') === -1 ? '?' : '&') + me.buster)
: url;
}
return me.loadUrl;
},
fetch: function (req) {
var url = this.getLoadUrl(),
async = !!req.async,
complete = req.complete;
Boot.fetch(url, complete, this, async);
},
onContentLoaded: function (response) {
var me = this,
status = response.status,
content = response.content,
exception = response.exception,
url = this.getLoadUrl();
me.loaded = true;
if ((exception || status === 0) && !_environment.phantom) {
me.error =
("Failed loading synchronously via XHR: '" + url +
"'. It's likely that the file is either being loaded from a " +
"different domain or from the local file system where cross " +
"origin requests are not allowed for security reasons. Try " +
"asynchronous loading instead.") ||
true;
me.evaluated = true;
}
else if ((status >= 200 && status < 300) || status === 304
|| _environment.phantom
|| (status === 0 && content.length > 0)
) {
me.content = content;
}
else {
me.error =
("Failed loading synchronously via XHR: '" + url +
"'. Please verify that the file exists. XHR status code: " +
status) ||
true;
me.evaluated = true;
}
},
createLoadElement: function(callback) {
var me = this,
el = me.getElement(),
readyStateChange = function(){
if (this.readyState === 'loaded' || this.readyState === 'complete') {
if(callback) {
callback();
}
}
},
errorFn = function() {
me.error = true;
if(callback) {
callback();
}
};
me.preserve = true;
el.onerror = errorFn;
if(Boot.hasReadyState) {
el.onreadystatechange = readyStateChange;
} else {
el.onload = callback;
}
el[me.prop] = me.getLoadUrl();
},
onLoadElementReady: function() {
Boot.getHead().appendChild(this.getElement());
this.evaluated = true;
},
inject: function (content, asset) {
_debug("injecting content for " + this.url);
var me = this,
head = Boot.getHead(),
url = me.url,
key = me.key,
base, el, ieMode, basePath;
if (me.isCss()) {
me.preserve = true;
basePath = key.substring(0, key.lastIndexOf("/") + 1);
base = doc.createElement('base');
base.href = basePath;
if(head.firstChild) {
head.insertBefore(base, head.firstChild);
} else {
head.appendChild(base);
}
base.href = base.href;
if (url) {
content += "\n/*# sourceURL=" + key + " */";
}
el = me.getElement("style");
ieMode = ('styleSheet' in el);
head.appendChild(base);
if(ieMode) {
head.appendChild(el);
el.styleSheet.cssText = content;
} else {
el.textContent = content;
head.appendChild(el);
}
head.removeChild(base);
} else {
if (url) {
content += "\n//# sourceURL=" + key;
}
Ext.globalEval(content);
}
return me;
},
loadCrossDomain: function() {
var me = this,
complete = function(){
me.loaded = me.evaluated = me.done = true;
me.notifyRequests();
};
if(me.isCss()) {
me.createLoadElement();
me.evaluateLoadElement();
complete();
} else {
me.createLoadElement(function(){
complete();
});
me.evaluateLoadElement();
return false;
}
return true;
},
loadElement: function() {
var me = this,
complete = function(){
me.loaded = me.evaluated = me.done = true;
me.notifyRequests();
};
if(me.isCss()) {
return me.loadCrossDomain();
} else {
me.createLoadElement(function(){
complete();
});
me.evaluateLoadElement();
}
return true;
},
loadSync: function() {
var me = this;
me.fetch({
async: false,
complete: function (response) {
me.onContentLoaded(response);
}
});
me.evaluate();
me.notifyRequests();
},
load: function (sync) {
var me = this;
if (!me.loaded) {
if(me.loading) {
return false;
}
me.loading = true;
if (!sync) {
if(me.isCrossDomain()) {
return me.loadCrossDomain();
}
else if(!me.isCss() && Boot.hasReadyState) {
me.createLoadElement(function () {
me.loaded = true;
me.notifyRequests();
});
}
else if(Boot.useElements) {
return me.loadElement();
}
else {
me.fetch({
async: !sync,
complete: function (response) {
me.onContentLoaded(response);
me.notifyRequests();
}
});
}
}
else {
me.loadSync();
}
}
return true;
},
evaluateContent: function () {
this.inject(this.content);
this.content = null;
},
evaluateLoadElement: function() {
Boot.getHead().appendChild(this.getElement());
},
evaluate: function () {
var me = this;
if(!me.evaluated) {
if(me.evaluating) {
return;
}
me.evaluating = true;
if(me.content !== undefined) {
me.evaluateContent();
} else if(!me.error) {
me.evaluateLoadElement();
}
me.evaluated = me.done = true;
me.cleanup();
}
},
cleanup: function () {
var me = this,
el = me.el,
prop;
if (!el) {
return;
}
if (!me.preserve) {
me.el = null;
el.parentNode.removeChild(el);
for (prop in el) {
try {
if (prop !== me.prop) {
el[prop] = null;
}
delete el[prop];
} catch (cleanEx) {
}
}
}
el.onload = el.onerror = el.onreadystatechange = emptyFn;
},
notifyRequests: function () {
var requests = this.requests,
len = requests.length,
i, request;
for (i = 0; i < len; i++) {
request = requests[i];
request.processLoadedEntries();
}
if(this.done) {
this.fireListeners();
}
},
onDone: function(listener) {
var me = this,
listeners = me.listeners || (me.listeners = []);
if(me.done) {
listener(me);
} else {
listeners.push(listener);
}
},
fireListeners: function() {
var listeners = this.listeners,
listener;
if(listeners && listeners.length > 0) {
_debug("firing event listeners for url " + this.url);
while((listener = listeners.shift())) {
listener(this);
}
}
}
};
Ext.disableCacheBuster = function (disable, path) {
var date = new Date();
date.setTime(date.getTime() + (disable ? 10 * 365 : -1) * 24 * 60 * 60 * 1000);
date = date.toGMTString();
doc.cookie = 'ext-cache=1; expires=' + date + '; path=' + (path || '/');
};
if (_environment.node) {
Boot.prototype.load = Boot.prototype.loadSync = function (request) {
require(filePath);
onLoad.call(scope);
};
Boot.prototype.init = emptyFn;
}
Boot.init();
return Boot;
}(function () {
}));
Ext.globalEval = Ext.globalEval || (this.execScript
? function (code) { execScript(code); }
: function ($$code) { eval.call(window, $$code); });
if (!Function.prototype.bind) {
(function () {
var slice = Array.prototype.slice,
bind = function (me) {
var args = slice.call(arguments, 1),
method = this;
if (args.length) {
return function () {
var t = arguments;
return method.apply(me, t.length ? args.concat(slice.call(t)) : args);
};
}
args = null;
return function () {
return method.apply(me, arguments);
};
};
Function.prototype.bind = bind;
bind.$extjs = true;
}());
}
var Ext = Ext || {};
Ext._startTime = Date.now ? Date.now() : (+new Date());
(function() {
var global = this,
objectPrototype = Object.prototype,
toString = objectPrototype.toString,
enumerables = [
'valueOf',
'toLocaleString',
'toString',
'constructor'
],
emptyFn = function() {},
privateFn = function() {},
identityFn = function(o) {
return o;
},
callOverrideParent = function() {
var method = callOverrideParent.caller.caller;
return method.$owner.prototype[method.$name].apply(this, arguments);
},
manifest = Ext.manifest || {},
i,
iterableRe = /\[object\s*(?:Array|Arguments|\w*Collection|\w*List|HTML\s+document\.all\s+class)\]/,
MSDateRe = /^\\?\/Date\(([-+])?(\d+)(?:[+-]\d{4})?\)\\?\/$/;
Ext.global = global;
emptyFn.$nullFn = identityFn.$nullFn = emptyFn.$emptyFn = identityFn.$identityFn = privateFn.$nullFn = true;
privateFn.$privacy = 'framework';
Ext['suspendLayouts'] = Ext['resumeLayouts'] = emptyFn;
for (i in {
toString: 1
}) {
enumerables = null;
}
Ext.enumerables = enumerables;
Ext.apply = function(object, config, defaults) {
if (defaults) {
Ext.apply(object, defaults);
}
if (object && config && typeof config === 'object') {
var i, j, k;
for (i in config) {
object[i] = config[i];
}
if (enumerables) {
for (j = enumerables.length; j--; ) {
k = enumerables[j];
if (config.hasOwnProperty(k)) {
object[k] = config[k];
}
}
}
}
return object;
};
Ext.buildSettings = Ext.apply({
baseCSSPrefix: 'x-'
}, Ext.buildSettings || {});
Ext.apply(Ext, {
idSeed: 0,
idPrefix: 'ext-',
isSecure: /^https/i.test(window.location.protocol),
enableGarbageCollector: false,
enableListenerCollection: true,
name: Ext.sandboxName || 'Ext',
privateFn: privateFn,
emptyFn: emptyFn,
identityFn: identityFn,
frameStartTime: +new Date(),
manifest: manifest,
debugConfig: Ext.debugConfig || manifest.debug || {
hooks: {
'*': true
}
},
validIdRe: /^[a-z_][a-z0-9\-_]*$/i,
BLANK_IMAGE_URL: 'data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==',
makeIdSelector: function(id) {
if (!Ext.validIdRe.test(id)) {
Ext.Error.raise('Invalid id selector: "' + id + '"');
}
return '#' + id;
},
id: function(o, prefix) {
if (o && o.id) {
return o.id;
}
var id = (prefix || Ext.idPrefix) + (++Ext.idSeed);
if (o) {
o.id = id;
}
return id;
},
returnId: function(o) {
return o.getId();
},
returnTrue: function() {
return true;
},
emptyString: new String(),
baseCSSPrefix: Ext.buildSettings.baseCSSPrefix,
$eventNameMap: {},
$vendorEventRe: /^(Moz.+|MS.+|webkit.+)/,
canonicalEventName: function(name) {
return Ext.$eventNameMap[name] || (Ext.$eventNameMap[name] = (Ext.$vendorEventRe.test(name) ? name : name.toLowerCase()));
},
applyIf: function(object, config) {
var property;
if (object) {
for (property in config) {
if (object[property] === undefined) {
object[property] = config[property];
}
}
}
return object;
},
now: (global.performance && global.performance.now) ? function() {
return performance.now();
} :
(Date.now || (Date.now = function() {
return +new Date();
})),
destroy: function() {
var ln = arguments.length,
i, arg;
for (i = 0; i < ln; i++) {
arg = arguments[i];
if (arg) {
if (Ext.isArray(arg)) {
this.destroy.apply(this, arg);
} else if (Ext.isFunction(arg.destroy)) {
arg.destroy();
}
}
}
return null;
},
destroyMembers: function(object) {
for (var ref, name,
i = 1,
a = arguments,
len = a.length; i < len; i++) {
ref = object[name = a[i]];
if (ref != null) {
object[name] = Ext.destroy(ref);
}
}
},
override: function(target, overrides) {
if (target.$isClass) {
target.override(overrides);
} else if (typeof target === 'function') {
Ext.apply(target.prototype, overrides);
} else {
var owner = target.self,
name, value;
if (owner && owner.$isClass) {
for (name in overrides) {
if (overrides.hasOwnProperty(name)) {
value = overrides[name];
if (typeof value === 'function') {
if (owner.$className) {
value.name = owner.$className + '#' + name;
}
value.$name = name;
value.$owner = owner;
value.$previous = target.hasOwnProperty(name) ? target[name] :
callOverrideParent;
}
target[name] = value;
}
}
} else {
Ext.apply(target, overrides);
}
}
return target;
},
valueFrom: function(value, defaultValue, allowBlank) {
return Ext.isEmpty(value, allowBlank) ? defaultValue : value;
},
isEmpty: function(value, allowEmptyString) {
return (value == null) || (!allowEmptyString ? value === '' : false) || (Ext.isArray(value) && value.length === 0);
},
isArray: ('isArray' in Array) ? Array.isArray : function(value) {
return toString.call(value) === '[object Array]';
},
isDate: function(value) {
return toString.call(value) === '[object Date]';
},
isMSDate: function(value) {
if (!Ext.isString(value)) {
return false;
}
return MSDateRe.test(value);
},
isObject: (toString.call(null) === '[object Object]') ? function(value) {
return value !== null && value !== undefined && toString.call(value) === '[object Object]' && value.ownerDocument === undefined;
} : function(value) {
return toString.call(value) === '[object Object]';
},
isSimpleObject: function(value) {
return value instanceof Object && value.constructor === Object;
},
isPrimitive: function(value) {
var type = typeof value;
return type === 'string' || type === 'number' || type === 'boolean';
},
isFunction:
(typeof document !== 'undefined' && typeof document.getElementsByTagName('body') === 'function') ? function(value) {
return !!value && toString.call(value) === '[object Function]';
} : function(value) {
return !!value && typeof value === 'function';
},
isNumber: function(value) {
return typeof value === 'number' && isFinite(value);
},
isNumeric: function(value) {
return !isNaN(parseFloat(value)) && isFinite(value);
},
isString: function(value) {
return typeof value === 'string';
},
isBoolean: function(value) {
return typeof value === 'boolean';
},
isElement: function(value) {
return value ? value.nodeType === 1 : false;
},
isTextNode: function(value) {
return value ? value.nodeName === "#text" : false;
},
isDefined: function(value) {
return typeof value !== 'undefined';
},
isIterable: function(value) {
if (!value || typeof value.length !== 'number' || typeof value === 'string' || Ext.isFunction(value)) {
return false;
}
if (!value.propertyIsEnumerable) {
return !!value.item;
}
if (value.hasOwnProperty('length') && !value.propertyIsEnumerable('length')) {
return true;
}
return iterableRe.test(toString.call(value));
},
isDebugEnabled: function(className, defaultEnabled) {
var debugConfig = Ext.debugConfig.hooks;
if (debugConfig.hasOwnProperty(className)) {
return debugConfig[className];
}
var enabled = debugConfig['*'],
prefixLength = 0;
if (defaultEnabled !== undefined) {
enabled = defaultEnabled;
}
if (!className) {
return enabled;
}
for (var prefix in debugConfig) {
var value = debugConfig[prefix];
if (className.charAt(prefix.length) === '.') {
if (className.substring(0, prefix.length) === prefix) {
if (prefixLength < prefix.length) {
prefixLength = prefix.length;
enabled = value;
}
}
}
}
return enabled;
} || emptyFn,
clone: function(item) {
if (item === null || item === undefined) {
return item;
}
if (item.nodeType && item.cloneNode) {
return item.cloneNode(true);
}
var type = toString.call(item),
i, j, k, clone, key;
if (type === '[object Date]') {
return new Date(item.getTime());
}
if (type === '[object Array]') {
i = item.length;
clone = [];
while (i--) {
clone[i] = Ext.clone(item[i]);
}
}
else if (type === '[object Object]' && item.constructor === Object) {
clone = {};
for (key in item) {
clone[key] = Ext.clone(item[key]);
}
if (enumerables) {
for (j = enumerables.length; j--; ) {
k = enumerables[j];
if (item.hasOwnProperty(k)) {
clone[k] = item[k];
}
}
}
}
return clone || item;
},
getUniqueGlobalNamespace: function() {
var uniqueGlobalNamespace = this.uniqueGlobalNamespace,
i;
if (uniqueGlobalNamespace === undefined) {
i = 0;
do {
uniqueGlobalNamespace = 'ExtBox' + (++i);
} while (global[uniqueGlobalNamespace] !== undefined);
global[uniqueGlobalNamespace] = Ext;
this.uniqueGlobalNamespace = uniqueGlobalNamespace;
}
return uniqueGlobalNamespace;
},
functionFactoryCache: {},
cacheableFunctionFactory: function() {
var me = this,
args = Array.prototype.slice.call(arguments),
cache = me.functionFactoryCache,
idx, fn, ln;
if (Ext.isSandboxed) {
ln = args.length;
if (ln > 0) {
ln--;
args[ln] = 'var Ext=window.' + Ext.name + ';' + args[ln];
}
}
idx = args.join('');
fn = cache[idx];
if (!fn) {
fn = Function.prototype.constructor.apply(Function.prototype, args);
cache[idx] = fn;
}
return fn;
},
functionFactory: function() {
var args = Array.prototype.slice.call(arguments),
ln;
if (Ext.isSandboxed) {
ln = args.length;
if (ln > 0) {
ln--;
args[ln] = 'var Ext=window.' + Ext.name + ';' + args[ln];
}
}
return Function.prototype.constructor.apply(Function.prototype, args);
},
Logger: {
log: function(message, priority) {
if (message && global.console) {
if (!priority || !(priority in global.console)) {
priority = 'log';
}
message = '[' + priority.toUpperCase() + '] ' + message;
global.console[priority](message);
}
},
verbose: function(message) {
this.log(message, 'verbose');
},
info: function(message) {
this.log(message, 'info');
},
warn: function(message) {
this.log(message, 'warn');
},
error: function(message) {
throw new Error(message);
},
deprecate: function(message) {
this.log(message, 'warn');
}
} || {
verbose: emptyFn,
log: emptyFn,
info: emptyFn,
warn: emptyFn,
error: function(message) {
throw new Error(message);
},
deprecate: emptyFn
},
getElementById: function(id) {
return document.getElementById(id);
},
splitAndUnescape: (function() {
var cache = {};
return function(origin, delimiter) {
if (!origin) {
return [];
} else if (!delimiter) {
return [
origin
];
}
var replaceRe = cache[delimiter] || (cache[delimiter] = new RegExp('\\\\' + delimiter, 'g')),
result = [],
parts, part;
parts = origin.split(delimiter);
while ((part = parts.shift()) !== undefined) {
while (part.charAt(part.length - 1) === '\\' && parts.length > 0) {
part = part + delimiter + parts.shift();
}
part = part.replace(replaceRe, delimiter);
result.push(part);
}
return result;
};
})()
});
Ext.returnTrue.$nullFn = Ext.returnId.$nullFn = true;
}());
(function() {
function toString() {
var me = this,
cls = me.sourceClass,
method = me.sourceMethod,
msg = me.msg;
if (method) {
if (msg) {
method += '(): ';
method += msg;
} else {
method += '()';
}
}
if (cls) {
method = method ? (cls + '.' + method) : cls;
}
return method || msg || '';
}
Ext.Error = function(config) {
if (Ext.isString(config)) {
config = {
msg: config
};
}
var error = new Error();
Ext.apply(error, config);
error.message = error.message || error.msg;
error.toString = toString;
return error;
};
Ext.apply(Ext.Error, {
ignore: false,
raise: function(err) {
err = err || {};
if (Ext.isString(err)) {
err = {
msg: err
};
}
var me = this,
method = me.raise.caller,
msg, name;
if (method) {
if (!err.sourceMethod && (name = method.$name)) {
err.sourceMethod = name;
}
if (!err.sourceClass && (name = method.$owner) && (name = name.$className)) {
err.sourceClass = name;
}
}
if (me.handle(err) !== true) {
msg = toString.call(err);
Ext.log({
msg: msg,
level: 'error',
dump: err,
stack: true
});
throw new Ext.Error(err);
}
},
handle: function() {
return this.ignore;
}
});
})();
Ext.deprecated = function(suggestion) {
if (!suggestion) {
suggestion = '';
}
function fail() {
Ext.Error.raise('The method "' + fail.$owner.$className + '.' + fail.$name + '" has been removed. ' + suggestion);
}
return fail;
return Ext.emptyFn;
};
(function() {
if (typeof window === 'undefined') {
return;
}
var last = 0,
notify = function() {
var cnt = Ext.log && Ext.log.counters,
n = cnt && (cnt.error + cnt.warn + cnt.info + cnt.log),
msg;
if (n && last !== n) {
msg = [];
if (cnt.error) {
msg.push('Errors: ' + cnt.error);
}
if (cnt.warn) {
msg.push('Warnings: ' + cnt.warn);
}
if (cnt.info) {
msg.push('Info: ' + cnt.info);
}
if (cnt.log) {
msg.push('Log: ' + cnt.log);
}
window.status = '*** ' + msg.join(' -- ');
last = n;
}
};
setInterval(notify, 1000);
}());
Ext.Array = (function() {
var arrayPrototype = Array.prototype,
slice = arrayPrototype.slice,
supportsSplice = (function() {
var array = [],
lengthBefore,
j = 20;
if (!array.splice) {
return false;
}
while (j--) {
array.push("A");
}
array.splice(15, 0, "F", "F", "F", "F", "F", "F", "F", "F", "F", "F", "F", "F", "F", "F", "F", "F", "F", "F", "F", "F", "F");
lengthBefore = array.length;
array.splice(13, 0, "XXX");
if (lengthBefore + 1 !== array.length) {
return false;
}
return true;
}()),
supportsIndexOf = 'indexOf' in arrayPrototype,
supportsSliceOnNodeList = true;
function stableSort(array, userComparator) {
var len = array.length,
indices = new Array(len),
i;
for (i = 0; i < len; i++) {
indices[i] = i;
}
indices.sort(function(index1, index2) {
return userComparator(array[index1], array[index2]) || (index1 - index2);
});
for (i = 0; i < len; i++) {
indices[i] = array[indices[i]];
}
for (i = 0; i < len; i++) {
array[i] = indices[i];
}
return array;
}
try {
if (typeof document !== 'undefined') {
slice.call(document.getElementsByTagName('body'));
}
} catch (e) {
supportsSliceOnNodeList = false;
}
var fixArrayIndex = function(array, index) {
return (index < 0) ? Math.max(0, array.length + index) : Math.min(array.length, index);
},
replaceSim = function(array, index, removeCount, insert) {
var add = insert ? insert.length : 0,
length = array.length,
pos = fixArrayIndex(array, index);
if (pos === length) {
if (add) {
array.push.apply(array, insert);
}
} else {
var remove = Math.min(removeCount, length - pos),
tailOldPos = pos + remove,
tailNewPos = tailOldPos + add - remove,
tailCount = length - tailOldPos,
lengthAfterRemove = length - remove,
i;
if (tailNewPos < tailOldPos) {
for (i = 0; i < tailCount; ++i) {
array[tailNewPos + i] = array[tailOldPos + i];
}
} else if (tailNewPos > tailOldPos) {
for (i = tailCount; i--; ) {
array[tailNewPos + i] = array[tailOldPos + i];
}
}
if (add && pos === lengthAfterRemove) {
array.length = lengthAfterRemove;
array.push.apply(array, insert);
} else {
array.length = lengthAfterRemove + add;
for (i = 0; i < add; ++i) {
array[pos + i] = insert[i];
}
}
}
return array;
},
replaceNative = function(array, index, removeCount, insert) {
if (insert && insert.length) {
if (index === 0 && !removeCount) {
array.unshift.apply(array, insert);
}
else if (index < array.length) {
array.splice.apply(array, [
index,
removeCount
].concat(insert));
} else
{
array.push.apply(array, insert);
}
} else {
array.splice(index, removeCount);
}
return array;
},
eraseSim = function(array, index, removeCount) {
return replaceSim(array, index, removeCount);
},
eraseNative = function(array, index, removeCount) {
array.splice(index, removeCount);
return array;
},
spliceSim = function(array, index, removeCount) {
var pos = fixArrayIndex(array, index),
removed = array.slice(index, fixArrayIndex(array, pos + removeCount));
if (arguments.length < 4) {
replaceSim(array, pos, removeCount);
} else {
replaceSim(array, pos, removeCount, slice.call(arguments, 3));
}
return removed;
},
spliceNative = function(array) {
return array.splice.apply(array, slice.call(arguments, 1));
},
erase = supportsSplice ? eraseNative : eraseSim,
replace = supportsSplice ? replaceNative : replaceSim,
splice = supportsSplice ? spliceNative : spliceSim,
ExtArray = {
binarySearch: function(array, item, begin, end, compareFn) {
var length = array.length,
middle, comparison;
if (begin instanceof Function) {
compareFn = begin;
begin = 0;
end = length;
} else if (end instanceof Function) {
compareFn = end;
end = length;
} else {
if (begin === undefined) {
begin = 0;
}
if (end === undefined) {
end = length;
}
compareFn = compareFn || ExtArray.lexicalCompare;
}
--end;
while (begin <= end) {
middle = (begin + end) >> 1;
comparison = compareFn(item, array[middle]);
if (comparison >= 0) {
begin = middle + 1;
} else if (comparison < 0) {
end = middle - 1;
}
}
return begin;
},
defaultCompare: function(lhs, rhs) {
return (lhs < rhs) ? -1 : ((lhs > rhs) ? 1 : 0);
},
lexicalCompare: function(lhs, rhs) {
lhs = String(lhs);
rhs = String(rhs);
return (lhs < rhs) ? -1 : ((lhs > rhs) ? 1 : 0);
},
each: function(array, fn, scope, reverse) {
array = ExtArray.from(array);
var i,
ln = array.length;
if (reverse !== true) {
for (i = 0; i < ln; i++) {
if (fn.call(scope || array[i], array[i], i, array) === false) {
return i;
}
}
} else {
for (i = ln - 1; i > -1; i--) {
if (fn.call(scope || array[i], array[i], i, array) === false) {
return i;
}
}
}
return true;
},
forEach: ('forEach' in arrayPrototype) ? function(array, fn, scope) {
return array.forEach(fn, scope);
} : function(array, fn, scope) {
for (var i = 0,
ln = array.length; i < ln; i++) {
fn.call(scope, array[i], i, array);
}
},
indexOf: supportsIndexOf ? function(array, item, from) {
return arrayPrototype.indexOf.call(array, item, from);
} : function(array, item, from) {
var i,
length = array.length;
for (i = (from < 0) ? Math.max(0, length + from) : from || 0; i < length; i++) {
if (array[i] === item) {
return i;
}
}
return -1;
},
contains: supportsIndexOf ? function(array, item) {
return arrayPrototype.indexOf.call(array, item) !== -1;
} : function(array, item) {
var i, ln;
for (i = 0 , ln = array.length; i < ln; i++) {
if (array[i] === item) {
return true;
}
}
return false;
},
toArray: function(iterable, start, end) {
if (!iterable || !iterable.length) {
return [];
}
if (typeof iterable === 'string') {
iterable = iterable.split('');
}
if (supportsSliceOnNodeList) {
return slice.call(iterable, start || 0, end || iterable.length);
}
var array = [],
i;
start = start || 0;
end = end ? ((end < 0) ? iterable.length + end : end) : iterable.length;
for (i = start; i < end; i++) {
array.push(iterable[i]);
}
return array;
},
pluck: function(array, propertyName) {
var ret = [],
i, ln, item;
for (i = 0 , ln = array.length; i < ln; i++) {
item = array[i];
ret.push(item[propertyName]);
}
return ret;
},
map: ('map' in arrayPrototype) ? function(array, fn, scope) {
Ext.Assert.isFunction(fn, 'Ext.Array.map must have a callback function passed as second argument.');
return array.map(fn, scope);
} : function(array, fn, scope) {
Ext.Assert.isFunction(fn, 'Ext.Array.map must have a callback function passed as second argument.');
var results = [],
i = 0,
len = array.length;
for (; i < len; i++) {
results[i] = fn.call(scope, array[i], i, array);
}
return results;
},
every: ('every' in arrayPrototype) ? function(array, fn, scope) {
Ext.Assert.isFunction(fn, 'Ext.Array.every must have a callback function passed as second argument.');
return array.every(fn, scope);
} : function(array, fn, scope) {
Ext.Assert.isFunction(fn, 'Ext.Array.every must have a callback function passed as second argument.');
var i = 0,
ln = array.length;
for (; i < ln; ++i) {
if (!fn.call(scope, array[i], i, array)) {
return false;
}
}
return true;
},
some: ('some' in arrayPrototype) ? function(array, fn, scope) {
Ext.Assert.isFunction(fn, 'Ext.Array.some must have a callback function passed as second argument.');
return array.some(fn, scope);
} : function(array, fn, scope) {
Ext.Assert.isFunction(fn, 'Ext.Array.some must have a callback function passed as second argument.');
var i = 0,
ln = array.length;
for (; i < ln; ++i) {
if (fn.call(scope, array[i], i, array)) {
return true;
}
}
return false;
},
equals: function(array1, array2) {
var len1 = array1.length,
len2 = array2.length,
i;
if (array1 === array2) {
return true;
}
if (len1 !== len2) {
return false;
}
for (i = 0; i < len1; ++i) {
if (array1[i] !== array2[i]) {
return false;
}
}
return true;
},
clean: function(array) {
var results = [],
i = 0,
ln = array.length,
item;
for (; i < ln; i++) {
item = array[i];
if (!Ext.isEmpty(item)) {
results.push(item);
}
}
return results;
},
unique: function(array) {
var clone = [],
i = 0,
ln = array.length,
item;
for (; i < ln; i++) {
item = array[i];
if (ExtArray.indexOf(clone, item) === -1) {
clone.push(item);
}
}
return clone;
},
filter: ('filter' in arrayPrototype) ? function(array, fn, scope) {
Ext.Assert.isFunction(fn, 'Ext.Array.filter must have a filter function passed as second argument.');
return array.filter(fn, scope);
} : function(array, fn, scope) {
Ext.Assert.isFunction(fn, 'Ext.Array.filter must have a filter function passed as second argument.');
var results = [],
i = 0,
ln = array.length;
for (; i < ln; i++) {
if (fn.call(scope, array[i], i, array)) {
results.push(array[i]);
}
}
return results;
},
findBy: function(array, fn, scope) {
var i = 0,
len = array.length;
for (; i < len; i++) {
if (fn.call(scope || array, array[i], i)) {
return array[i];
}
}
return null;
},
from: function(value, newReference) {
if (value === undefined || value === null) {
return [];
}
if (Ext.isArray(value)) {
return (newReference) ? slice.call(value) : value;
}
var type = typeof value;
if (value && value.length !== undefined && type !== 'string' && (type !== 'function' || !value.apply)) {
return ExtArray.toArray(value);
}
return [
value
];
},
remove: function(array, item) {
var index = ExtArray.indexOf(array, item);
if (index !== -1) {
erase(array, index, 1);
}
return array;
},
removeAt: function(array, index, count) {
var len = array.length;
if (index >= 0 && index < len) {
count = count || 1;
count = Math.min(count, len - index);
erase(array, index, count);
}
return array;
},
include: function(array, item) {
if (!ExtArray.contains(array, item)) {
array.push(item);
}
},
clone: function(array) {
return slice.call(array);
},
merge: function() {
var args = slice.call(arguments),
array = [],
i, ln;
for (i = 0 , ln = args.length; i < ln; i++) {
array = array.concat(args[i]);
}
return ExtArray.unique(array);
},
intersect: function() {
var intersection = [],
arrays = slice.call(arguments),
arraysLength, array, arrayLength, minArray, minArrayIndex, minArrayCandidate, minArrayLength, element, elementCandidate, elementCount, i, j, k;
if (!arrays.length) {
return intersection;
}
arraysLength = arrays.length;
for (i = minArrayIndex = 0; i < arraysLength; i++) {
minArrayCandidate = arrays[i];
if (!minArray || minArrayCandidate.length < minArray.length) {
minArray = minArrayCandidate;
minArrayIndex = i;
}
}
minArray = ExtArray.unique(minArray);
erase(arrays, minArrayIndex, 1);
minArrayLength = minArray.length;
arraysLength = arrays.length;
for (i = 0; i < minArrayLength; i++) {
element = minArray[i];
elementCount = 0;
for (j = 0; j < arraysLength; j++) {
array = arrays[j];
arrayLength = array.length;
for (k = 0; k < arrayLength; k++) {
elementCandidate = array[k];
if (element === elementCandidate) {
elementCount++;
break;
}
}
}
if (elementCount === arraysLength) {
intersection.push(element);
}
}
return intersection;
},
difference: function(arrayA, arrayB) {
var clone = slice.call(arrayA),
ln = clone.length,
i, j, lnB;
for (i = 0 , lnB = arrayB.length; i < lnB; i++) {
for (j = 0; j < ln; j++) {
if (clone[j] === arrayB[i]) {
erase(clone, j, 1);
j--;
ln--;
}
}
}
return clone;
},
slice: ([
1,
2
].slice(1, undefined).length ? function(array, begin, end) {
return slice.call(array, begin, end);
} : function(array, begin, end) {
if (typeof begin === 'undefined') {
return slice.call(array);
}
if (typeof end === 'undefined') {
return slice.call(array, begin);
}
return slice.call(array, begin, end);
}),
sort: function(array, sortFn) {
return stableSort(array, sortFn || ExtArray.lexicalCompare);
},
flatten: function(array) {
var worker = [];
function rFlatten(a) {
var i, ln, v;
for (i = 0 , ln = a.length; i < ln; i++) {
v = a[i];
if (Ext.isArray(v)) {
rFlatten(v);
} else {
worker.push(v);
}
}
return worker;
}
return rFlatten(array);
},
min: function(array, comparisonFn) {
var min = array[0],
i, ln, item;
for (i = 0 , ln = array.length; i < ln; i++) {
item = array[i];
if (comparisonFn) {
if (comparisonFn(min, item) === 1) {
min = item;
}
} else {
if (item < min) {
min = item;
}
}
}
return min;
},
max: function(array, comparisonFn) {
var max = array[0],
i, ln, item;
for (i = 0 , ln = array.length; i < ln; i++) {
item = array[i];
if (comparisonFn) {
if (comparisonFn(max, item) === -1) {
max = item;
}
} else {
if (item > max) {
max = item;
}
}
}
return max;
},
mean: function(array) {
return array.length > 0 ? ExtArray.sum(array) / array.length : undefined;
},
sum: function(array) {
var sum = 0,
i, ln, item;
for (i = 0 , ln = array.length; i < ln; i++) {
item = array[i];
sum += item;
}
return sum;
},
toMap: function(array, getKey, scope) {
var map = {},
i = array.length;
if (!getKey) {
while (i--) {
map[array[i]] = i + 1;
}
} else if (typeof getKey === 'string') {
while (i--) {
map[array[i][getKey]] = i + 1;
}
} else {
while (i--) {
map[getKey.call(scope, array[i])] = i + 1;
}
}
return map;
},
toValueMap: function(array, getKey, scope, arrayify) {
var map = {},
i = array.length,
autoArray, alwaysArray, entry, fn, key, value;
if (!getKey) {
while (i--) {
value = array[i];
map[value] = value;
}
} else {
if (!(fn = (typeof getKey !== 'string'))) {
arrayify = scope;
}
alwaysArray = arrayify === 1;
autoArray = arrayify === 2;
while (i--) {
value = array[i];
key = fn ? getKey.call(scope, value) : value[getKey];
if (alwaysArray) {
if (key in map) {
map[key].push(value);
} else {
map[key] = [
value
];
}
} else if (autoArray && (key in map)) {
if ((entry = map[key]) instanceof Array) {
entry.push(value);
} else {
map[key] = [
entry,
value
];
}
} else {
map[key] = value;
}
}
}
return map;
},
_replaceSim: replaceSim,
_spliceSim: spliceSim,
erase: erase,
insert: function(array, index, items) {
return replace(array, index, 0, items);
},
replace: replace,
splice: splice,
push: function(target) {
var len = arguments.length,
i = 1,
newItem;
if (target === undefined) {
target = [];
} else if (!Ext.isArray(target)) {
target = [
target
];
}
for (; i < len; i++) {
newItem = arguments[i];
Array.prototype.push[Ext.isIterable(newItem) ? 'apply' : 'call'](target, newItem);
}
return target;
},
numericSortFn: function(a, b) {
return a - b;
}
};
Ext.each = ExtArray.each;
ExtArray.union = ExtArray.merge;
Ext.min = ExtArray.min;
Ext.max = ExtArray.max;
Ext.sum = ExtArray.sum;
Ext.mean = ExtArray.mean;
Ext.flatten = ExtArray.flatten;
Ext.clean = ExtArray.clean;
Ext.unique = ExtArray.unique;
Ext.pluck = ExtArray.pluck;
Ext.toArray = function() {
return ExtArray.toArray.apply(ExtArray, arguments);
};
return ExtArray;
}());
Ext.Assert = {
falsey: function(b, msg) {
if (b) {
Ext.Error.raise(msg || ('Expected a falsey value but was ' + b));
}
},
falseyProp: function(object, property) {
Ext.Assert.truthy(object);
var b = object[property];
if (b) {
if (object.$className) {
property = object.$className + '#' + property;
}
Ext.Error.raise('Expected a falsey value for ' + property + ' but was ' + b);
}
},
truthy: function(b, msg) {
if (!b) {
Ext.Error.raise(msg || ('Expected a truthy value but was ' + typeof b));
}
},
truthyProp: function(object, property) {
Ext.Assert.truthy(object);
var b = object[property];
if (!b) {
if (object.$className) {
property = object.$className + '#' + property;
}
Ext.Error.raise('Expected a truthy value for ' + property + ' but was ' + typeof b);
}
}
};
(function() {
function makeAssert(name, kind) {
var testFn = Ext[name],
def;
return function(value, msg) {
if (!testFn(value)) {
Ext.Error.raise(msg || def || (def = 'Expected value to be ' + kind));
}
};
}
function makeAssertProp(name, kind) {
var testFn = Ext[name],
def;
return function(object, prop) {
Ext.Assert.truthy(object);
if (!testFn(object[prop])) {
Ext.Error.raise(def || (def = 'Expected ' + (object.$className ? object.$className + '#' : '') + prop + ' to be ' + kind));
}
};
}
function makeNotAssert(name, kind) {
var testFn = Ext[name],
def;
return function(value, msg) {
if (testFn(value)) {
Ext.Error.raise(msg || def || (def = 'Expected value to NOT be ' + kind));
}
};
}
function makeNotAssertProp(name, kind) {
var testFn = Ext[name],
def;
return function(object, prop) {
Ext.Assert.truthy(object);
if (testFn(object[prop])) {
Ext.Error.raise(def || (def = 'Expected ' + (object.$className ? object.$className + '#' : '') + prop + ' to NOT be ' + kind));
}
};
}
for (var name in Ext) {
if (name.substring(0, 2) == "is" && Ext.isFunction(Ext[name])) {
var kind = name.substring(2);
Ext.Assert[name] = makeAssert(name, kind);
Ext.Assert[name + 'Prop'] = makeAssertProp(name, kind);
Ext.Assert['isNot' + kind] = makeNotAssert(name, kind);
Ext.Assert['isNot' + kind + 'Prop'] = makeNotAssertProp(name, kind);
}
}
}());
Ext.String = (function() {
var trimRegex = /^[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]+|[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]+$/g,
escapeRe = /('|\\)/g,
escapeRegexRe = /([-.*+?\^${}()|\[\]\/\\])/g,
basicTrimRe = /^\s+|\s+$/g,
whitespaceRe = /\s+/,
varReplace = /(^[^a-z]*|[^\w])/gi,
charToEntity, entityToChar, charToEntityRegex, entityToCharRegex,
htmlEncodeReplaceFn = function(match, capture) {
return charToEntity[capture];
},
htmlDecodeReplaceFn = function(match, capture) {
return (capture in entityToChar) ? entityToChar[capture] : String.fromCharCode(parseInt(capture.substr(2), 10));
},
boundsCheck = function(s, other) {
if (s === null || s === undefined || other === null || other === undefined) {
return false;
}
return other.length <= s.length;
},
ExtString;
return ExtString = {
insert: function(s, value, index) {
if (!s) {
return value;
}
if (!value) {
return s;
}
var len = s.length;
if (!index && index !== 0) {
index = len;
}
if (index < 0) {
index *= -1;
if (index >= len) {
index = 0;
} else {
index = len - index;
}
}
if (index === 0) {
s = value + s;
} else if (index >= s.length) {
s += value;
} else {
s = s.substr(0, index) + value + s.substr(index);
}
return s;
},
startsWith: function(s, start, ignoreCase) {
var result = boundsCheck(s, start);
if (result) {
if (ignoreCase) {
s = s.toLowerCase();
start = start.toLowerCase();
}
result = s.lastIndexOf(start, 0) === 0;
}
return result;
},
endsWith: function(s, end, ignoreCase) {
var result = boundsCheck(s, end);
if (result) {
if (ignoreCase) {
s = s.toLowerCase();
end = end.toLowerCase();
}
result = s.indexOf(end, s.length - end.length) !== -1;
}
return result;
},
createVarName: function(s) {
return s.replace(varReplace, '');
},
htmlEncode: function(value) {
return (!value) ? value : String(value).replace(charToEntityRegex, htmlEncodeReplaceFn);
},
htmlDecode: function(value) {
return (!value) ? value : String(value).replace(entityToCharRegex, htmlDecodeReplaceFn);
},
hasHtmlCharacters: function(s) {
return charToEntityRegex.test(s);
},
addCharacterEntities: function(newEntities) {
var charKeys = [],
entityKeys = [],
key, echar;
for (key in newEntities) {
echar = newEntities[key];
entityToChar[key] = echar;
charToEntity[echar] = key;
charKeys.push(echar);
entityKeys.push(key);
}
charToEntityRegex = new RegExp('(' + charKeys.join('|') + ')', 'g');
entityToCharRegex = new RegExp('(' + entityKeys.join('|') + '|[0-9]{1,5};' + ')', 'g');
},
resetCharacterEntities: function() {
charToEntity = {};
entityToChar = {};
this.addCharacterEntities({
'&': '&',
'>': '>',
'<': '<',
'"': '"',
''': "'"
});
},
urlAppend: function(url, string) {
if (!Ext.isEmpty(string)) {
return url + (url.indexOf('?') === -1 ? '?' : '&') + string;
}
return url;
},
trim: function(string) {
if (string) {
string = string.replace(trimRegex, "");
}
return string || '';
},
capitalize: function(string) {
if (string) {
string = string.charAt(0).toUpperCase() + string.substr(1);
}
return string || '';
},
uncapitalize: function(string) {
if (string) {
string = string.charAt(0).toLowerCase() + string.substr(1);
}
return string || '';
},
ellipsis: function(value, length, word) {
if (value && value.length > length) {
if (word) {
var vs = value.substr(0, length - 2),
index = Math.max(vs.lastIndexOf(' '), vs.lastIndexOf('.'), vs.lastIndexOf('!'), vs.lastIndexOf('?'));
if (index !== -1 && index >= (length - 15)) {
return vs.substr(0, index) + "...";
}
}
return value.substr(0, length - 3) + "...";
}
return value;
},
escapeRegex: function(string) {
return string.replace(escapeRegexRe, "\\$1");
},
createRegex: function(value, startsWith, endsWith, ignoreCase) {
var ret = value;
if (value != null && !value.exec) {
ret = ExtString.escapeRegex(String(value));
if (startsWith !== false) {
ret = '^' + ret;
}
if (endsWith !== false) {
ret += '$';
}
ret = new RegExp(ret, (ignoreCase !== false) ? 'i' : '');
}
return ret;
},
escape: function(string) {
return string.replace(escapeRe, "\\$1");
},
toggle: function(string, value, other) {
return string === value ? other : value;
},
leftPad: function(string, size, character) {
var result = String(string);
character = character || " ";
while (result.length < size) {
result = character + result;
}
return result;
},
repeat: function(pattern, count, sep) {
if (count < 1) {
count = 0;
}
for (var buf = [],
i = count; i--; ) {
buf.push(pattern);
}
return buf.join(sep || '');
},
splitWords: function(words) {
if (words && typeof words == 'string') {
return words.replace(basicTrimRe, '').split(whitespaceRe);
}
return words || [];
}
};
}());
Ext.String.resetCharacterEntities();
Ext.htmlEncode = Ext.String.htmlEncode;
Ext.htmlDecode = Ext.String.htmlDecode;
Ext.urlAppend = Ext.String.urlAppend;
Ext.Date = (function() {
var utilDate,
nativeDate = Date,
stripEscapeRe = /(\\.)/g,
hourInfoRe = /([gGhHisucUOPZ]|MS)/,
dateInfoRe = /([djzmnYycU]|MS)/,
slashRe = /\\/gi,
numberTokenRe = /\{(\d+)\}/g,
MSFormatRe = new RegExp('\\/Date\\(([-+])?(\\d+)(?:[+-]\\d{4})?\\)\\/'),
pad = Ext.String.leftPad,
code = [
"var me = this, dt, y, m, d, h, i, s, ms, o, O, z, zz, u, v, W, year, jan4, week1monday, daysInMonth, dayMatched,",
"def = me.defaults,",
"from = Ext.Number.from,",
"results = String(input).match(me.parseRegexes[{0}]);",
"if(results){",
"{1}",
"if(u != null){",
"v = new Date(u * 1000);",
"}else{",
"dt = me.clearTime(new Date);",
"y = from(y, from(def.y, dt.getFullYear()));",
"m = from(m, from(def.m - 1, dt.getMonth()));",
"dayMatched = d !== undefined;",
"d = from(d, from(def.d, dt.getDate()));",
"if (!dayMatched) {",
"dt.setDate(1);",
"dt.setMonth(m);",
"dt.setFullYear(y);",
"daysInMonth = me.getDaysInMonth(dt);",
"if (d > daysInMonth) {",
"d = daysInMonth;",
"}",
"}",
"h = from(h, from(def.h, dt.getHours()));",
"i = from(i, from(def.i, dt.getMinutes()));",
"s = from(s, from(def.s, dt.getSeconds()));",
"ms = from(ms, from(def.ms, dt.getMilliseconds()));",
"if(z >= 0 && y >= 0){",
"v = me.add(new Date(y < 100 ? 100 : y, 0, 1, h, i, s, ms), me.YEAR, y < 100 ? y - 100 : 0);",
"v = !strict? v : (strict === true && (z <= 364 || (me.isLeapYear(v) && z <= 365))? me.add(v, me.DAY, z) : null);",
"}else if(strict === true && !me.isValid(y, m + 1, d, h, i, s, ms)){",
"v = null;",
"}else{",
"if (W) {",
"year = y || (new Date()).getFullYear();",
"jan4 = new Date(year, 0, 4, 0, 0, 0);",
"d = jan4.getDay();",
"week1monday = new Date(jan4.getTime() - ((d === 0 ? 6 : d - 1) * 86400000));",
"v = Ext.Date.clearTime(new Date(week1monday.getTime() + ((W - 1) * 604800000 + 43200000)));",
"} else {",
"v = me.add(new Date(y < 100 ? 100 : y, m, d, h, i, s, ms), me.YEAR, y < 100 ? y - 100 : 0);",
"}",
"}",
"}",
"}",
"if(v){",
"if(zz != null){",
"v = me.add(v, me.SECOND, -v.getTimezoneOffset() * 60 - zz);",
"}else if(o){",
"v = me.add(v, me.MINUTE, -v.getTimezoneOffset() + (sn == '+'? -1 : 1) * (hr * 60 + mn));",
"}",
"}",
"return (v != null) ? v : null;"
].join('\n');
if (!Date.prototype.toISOString) {
Date.prototype.toISOString = function() {
var me = this;
return pad(me.getUTCFullYear(), 4, '0') + '-' + pad(me.getUTCMonth() + 1, 2, '0') + '-' + pad(me.getUTCDate(), 2, '0') + 'T' + pad(me.getUTCHours(), 2, '0') + ':' + pad(me.getUTCMinutes(), 2, '0') + ':' + pad(me.getUTCSeconds(), 2, '0') + '.' + pad(me.getUTCMilliseconds(), 3, '0') + 'Z';
};
}
function xf(format) {
var args = Array.prototype.slice.call(arguments, 1);
return format.replace(numberTokenRe, function(m, i) {
return args[i];
});
}
return utilDate = {
now: nativeDate.now,
toString: function(date) {
if (!date) {
date = new nativeDate();
}
return date.getFullYear() + "-" + pad(date.getMonth() + 1, 2, '0') + "-" + pad(date.getDate(), 2, '0') + "T" + pad(date.getHours(), 2, '0') + ":" + pad(date.getMinutes(), 2, '0') + ":" + pad(date.getSeconds(), 2, '0');
},
getElapsed: function(dateA, dateB) {
return Math.abs(dateA - (dateB || utilDate.now()));
},
useStrict: false,
formatCodeToRegex: function(character, currentGroup) {
var p = utilDate.parseCodes[character];
if (p) {
p = typeof p === 'function' ? p() : p;
utilDate.parseCodes[character] = p;
}
return p ? Ext.applyIf({
c: p.c ? xf(p.c, currentGroup || "{0}") : p.c
}, p) : {
g: 0,
c: null,
s: Ext.String.escapeRegex(character)
};
},
parseFunctions: {
"MS": function(input, strict) {
var r = (input || '').match(MSFormatRe);
return r ? new nativeDate(((r[1] || '') + r[2]) * 1) : null;
},
"time": function(input, strict) {
var num = parseInt(input, 10);
if (num || num === 0) {
return new nativeDate(num);
}
return null;
},
"timestamp": function(input, strict) {
var num = parseInt(input, 10);
if (num || num === 0) {
return new nativeDate(num * 1000);
}
return null;
}
},
parseRegexes: [],
formatFunctions: {
"MS": function() {
return '\\/Date(' + this.getTime() + ')\\/';
},
"time": function() {
return this.getTime().toString();
},
"timestamp": function() {
return utilDate.format(this, 'U');
}
},
y2kYear: 50,
MILLI: "ms",
SECOND: "s",
MINUTE: "mi",
HOUR: "h",
DAY: "d",
MONTH: "mo",
YEAR: "y",
defaults: {},
dayNames: [
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
],
monthNames: [
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
],
monthNumbers: {
January: 0,
Jan: 0,
February: 1,
Feb: 1,
March: 2,
Mar: 2,
April: 3,
Apr: 3,
May: 4,
June: 5,
Jun: 5,
July: 6,
Jul: 6,
August: 7,
Aug: 7,
September: 8,
Sep: 8,
October: 9,
Oct: 9,
November: 10,
Nov: 10,
December: 11,
Dec: 11
},
defaultFormat: "m/d/Y",
getShortMonthName: function(month) {
return utilDate.monthNames[month].substring(0, 3);
},
getShortDayName: function(day) {
return utilDate.dayNames[day].substring(0, 3);
},
getMonthNumber: function(name) {
return utilDate.monthNumbers[name.substring(0, 1).toUpperCase() + name.substring(1, 3).toLowerCase()];
},
formatContainsHourInfo: function(format) {
return hourInfoRe.test(format.replace(stripEscapeRe, ''));
},
formatContainsDateInfo: function(format) {
return dateInfoRe.test(format.replace(stripEscapeRe, ''));
},
unescapeFormat: function(format) {
return format.replace(slashRe, '');
},
formatCodes: {
d: "Ext.String.leftPad(m.getDate(), 2, '0')",
D: "Ext.Date.getShortDayName(m.getDay())",
j: "m.getDate()",
l: "Ext.Date.dayNames[m.getDay()]",
N: "(m.getDay() ? m.getDay() : 7)",
S: "Ext.Date.getSuffix(m)",
w: "m.getDay()",
z: "Ext.Date.getDayOfYear(m)",
W: "Ext.String.leftPad(Ext.Date.getWeekOfYear(m), 2, '0')",
F: "Ext.Date.monthNames[m.getMonth()]",
m: "Ext.String.leftPad(m.getMonth() + 1, 2, '0')",
M: "Ext.Date.getShortMonthName(m.getMonth())",
n: "(m.getMonth() + 1)",
t: "Ext.Date.getDaysInMonth(m)",
L: "(Ext.Date.isLeapYear(m) ? 1 : 0)",
o: "(m.getFullYear() + (Ext.Date.getWeekOfYear(m) == 1 && m.getMonth() > 0 ? +1 : (Ext.Date.getWeekOfYear(m) >= 52 && m.getMonth() < 11 ? -1 : 0)))",
Y: "Ext.String.leftPad(m.getFullYear(), 4, '0')",
y: "('' + m.getFullYear()).substring(2, 4)",
a: "(m.getHours() < 12 ? 'am' : 'pm')",
A: "(m.getHours() < 12 ? 'AM' : 'PM')",
g: "((m.getHours() % 12) ? m.getHours() % 12 : 12)",
G: "m.getHours()",
h: "Ext.String.leftPad((m.getHours() % 12) ? m.getHours() % 12 : 12, 2, '0')",
H: "Ext.String.leftPad(m.getHours(), 2, '0')",
i: "Ext.String.leftPad(m.getMinutes(), 2, '0')",
s: "Ext.String.leftPad(m.getSeconds(), 2, '0')",
u: "Ext.String.leftPad(m.getMilliseconds(), 3, '0')",
O: "Ext.Date.getGMTOffset(m)",
P: "Ext.Date.getGMTOffset(m, true)",
T: "Ext.Date.getTimezone(m)",
Z: "(m.getTimezoneOffset() * -60)",
c: function() {
var c = "Y-m-dTH:i:sP",
code = [],
i,
l = c.length,
e;
for (i = 0; i < l; ++i) {
e = c.charAt(i);
code.push(e === "T" ? "'T'" : utilDate.getFormatCode(e));
}
return code.join(" + ");
},
C: function() {
return 'm.toISOString()';
},
U: "Math.round(m.getTime() / 1000)"
},
isValid: function(y, m, d, h, i, s, ms) {
h = h || 0;
i = i || 0;
s = s || 0;
ms = ms || 0;
var dt = utilDate.add(new nativeDate(y < 100 ? 100 : y, m - 1, d, h, i, s, ms), utilDate.YEAR, y < 100 ? y - 100 : 0);
return y === dt.getFullYear() && m === dt.getMonth() + 1 && d === dt.getDate() && h === dt.getHours() && i === dt.getMinutes() && s === dt.getSeconds() && ms === dt.getMilliseconds();
},
parse: function(input, format, strict) {
var p = utilDate.parseFunctions;
if (p[format] == null) {
utilDate.createParser(format);
}
return p[format].call(utilDate, input, Ext.isDefined(strict) ? strict : utilDate.useStrict);
},
parseDate: function(input, format, strict) {
return utilDate.parse(input, format, strict);
},
getFormatCode: function(character) {
var f = utilDate.formatCodes[character];
if (f) {
f = typeof f === 'function' ? f() : f;
utilDate.formatCodes[character] = f;
}
return f || ("'" + Ext.String.escape(character) + "'");
},
createFormat: function(format) {
var code = [],
special = false,
ch = '',
i;
for (i = 0; i < format.length; ++i) {
ch = format.charAt(i);
if (!special && ch === "\\") {
special = true;
} else if (special) {
special = false;
code.push("'" + Ext.String.escape(ch) + "'");
} else {
if (ch === '\n') {
code.push("'\\n'");
} else {
code.push(utilDate.getFormatCode(ch));
}
}
}
utilDate.formatFunctions[format] = Ext.functionFactory("var m=this;return " + code.join('+'));
},
createParser: function(format) {
var regexNum = utilDate.parseRegexes.length,
currentGroup = 1,
calc = [],
regex = [],
special = false,
ch = "",
i = 0,
len = format.length,
atEnd = [],
obj;
for (; i < len; ++i) {
ch = format.charAt(i);
if (!special && ch === "\\") {
special = true;
} else if (special) {
special = false;
regex.push(Ext.String.escape(ch));
} else {
obj = utilDate.formatCodeToRegex(ch, currentGroup);
currentGroup += obj.g;
regex.push(obj.s);
if (obj.g && obj.c) {
if (obj.calcAtEnd) {
atEnd.push(obj.c);
} else {
calc.push(obj.c);
}
}
}
}
calc = calc.concat(atEnd);
utilDate.parseRegexes[regexNum] = new RegExp("^" + regex.join('') + "$", 'i');
utilDate.parseFunctions[format] = Ext.functionFactory("input", "strict", xf(code, regexNum, calc.join('')));
},
parseCodes: {
d: {
g: 1,
c: "d = parseInt(results[{0}], 10);\n",
s: "(3[0-1]|[1-2][0-9]|0[1-9])"
},
j: {
g: 1,
c: "d = parseInt(results[{0}], 10);\n",
s: "(3[0-1]|[1-2][0-9]|[1-9])"
},
D: function() {
for (var a = [],
i = 0; i < 7; a.push(utilDate.getShortDayName(i)) , ++i){}
return {
g: 0,
c: null,
s: "(?:" + a.join("|") + ")"
};
},
l: function() {
return {
g: 0,
c: null,
s: "(?:" + utilDate.dayNames.join("|") + ")"
};
},
N: {
g: 0,
c: null,
s: "[1-7]"
},
S: {
g: 0,
c: null,
s: "(?:st|nd|rd|th)"
},
w: {
g: 0,
c: null,
s: "[0-6]"
},
z: {
g: 1,
c: "z = parseInt(results[{0}], 10);\n",
s: "(\\d{1,3})"
},
W: {
g: 1,
c: "W = parseInt(results[{0}], 10);\n",
s: "(\\d{2})"
},
F: function() {
return {
g: 1,
c: "m = parseInt(me.getMonthNumber(results[{0}]), 10);\n",
s: "(" + utilDate.monthNames.join("|") + ")"
};
},
M: function() {
for (var a = [],
i = 0; i < 12; a.push(utilDate.getShortMonthName(i)) , ++i){}
return Ext.applyIf({
s: "(" + a.join("|") + ")"
}, utilDate.formatCodeToRegex("F"));
},
m: {
g: 1,
c: "m = parseInt(results[{0}], 10) - 1;\n",
s: "(1[0-2]|0[1-9])"
},
n: {
g: 1,
c: "m = parseInt(results[{0}], 10) - 1;\n",
s: "(1[0-2]|[1-9])"
},
t: {
g: 0,
c: null,
s: "(?:\\d{2})"
},
L: {
g: 0,
c: null,
s: "(?:1|0)"
},
o: {
g: 1,
c: "y = parseInt(results[{0}], 10);\n",
s: "(\\d{4})"
},
Y: {
g: 1,
c: "y = parseInt(results[{0}], 10);\n",
s: "(\\d{4})"
},
y: {
g: 1,
c: "var ty = parseInt(results[{0}], 10);\n" + "y = ty > me.y2kYear ? 1900 + ty : 2000 + ty;\n",
s: "(\\d{2})"
},
a: {
g: 1,
c: "if (/(am)/i.test(results[{0}])) {\n" + "if (!h || h == 12) { h = 0; }\n" + "} else { if (!h || h < 12) { h = (h || 0) + 12; }}",
s: "(am|pm|AM|PM)",
calcAtEnd: true
},
A: {
g: 1,
c: "if (/(am)/i.test(results[{0}])) {\n" + "if (!h || h == 12) { h = 0; }\n" + "} else { if (!h || h < 12) { h = (h || 0) + 12; }}",
s: "(AM|PM|am|pm)",
calcAtEnd: true
},
g: {
g: 1,
c: "h = parseInt(results[{0}], 10);\n",
s: "(1[0-2]|[0-9])"
},
G: {
g: 1,
c: "h = parseInt(results[{0}], 10);\n",
s: "(2[0-3]|1[0-9]|[0-9])"
},
h: {
g: 1,
c: "h = parseInt(results[{0}], 10);\n",
s: "(1[0-2]|0[1-9])"
},
H: {
g: 1,
c: "h = parseInt(results[{0}], 10);\n",
s: "(2[0-3]|[0-1][0-9])"
},
i: {
g: 1,
c: "i = parseInt(results[{0}], 10);\n",
s: "([0-5][0-9])"
},
s: {
g: 1,
c: "s = parseInt(results[{0}], 10);\n",
s: "([0-5][0-9])"
},
u: {
g: 1,
c: "ms = results[{0}]; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n",
s: "(\\d+)"
},
O: {
g: 1,
c: [
"o = results[{0}];",
"var sn = o.substring(0,1),",
"hr = o.substring(1,3)*1 + Math.floor(o.substring(3,5) / 60),",
"mn = o.substring(3,5) % 60;",
"o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + Ext.String.leftPad(hr, 2, '0') + Ext.String.leftPad(mn, 2, '0')) : null;\n"
].
join("\n"),
s: "([+-]\\d{4})"
},
P: {
g: 1,
c: [
"o = results[{0}];",
"var sn = o.substring(0,1),",
"hr = o.substring(1,3)*1 + Math.floor(o.substring(4,6) / 60),",
"mn = o.substring(4,6) % 60;",
"o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + Ext.String.leftPad(hr, 2, '0') + Ext.String.leftPad(mn, 2, '0')) : null;\n"
].
join("\n"),
s: "([+-]\\d{2}:\\d{2})"
},
T: {
g: 0,
c: null,
s: "[A-Z]{1,5}"
},
Z: {
g: 1,
c: "zz = results[{0}] * 1;\n" +
"zz = (-43200 <= zz && zz <= 50400)? zz : null;\n",
s: "([+-]?\\d{1,5})"
},
c: function() {
var calc = [],
arr = [
utilDate.formatCodeToRegex("Y", 1),
utilDate.formatCodeToRegex("m", 2),
utilDate.formatCodeToRegex("d", 3),
utilDate.formatCodeToRegex("H", 4),
utilDate.formatCodeToRegex("i", 5),
utilDate.formatCodeToRegex("s", 6),
{
c: "ms = results[7] || '0'; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n"
},
{
c: [
"if(results[8]) {",
"if(results[8] == 'Z'){",
"zz = 0;",
"}else if (results[8].indexOf(':') > -1){",
utilDate.formatCodeToRegex("P", 8).c,
"}else{",
utilDate.formatCodeToRegex("O", 8).c,
"}",
"}"
].join('\n')
}
],
i, l;
for (i = 0 , l = arr.length; i < l; ++i) {
calc.push(arr[i].c);
}
return {
g: 1,
c: calc.join(""),
s: [
arr[0].s,
"(?:",
"-",
arr[1].s,
"(?:",
"-",
arr[2].s,
"(?:",
"(?:T| )?",
arr[3].s,
":",
arr[4].s,
"(?::",
arr[5].s,
")?",
"(?:(?:\\.|,)(\\d+))?",
"(Z|(?:[-+]\\d{2}(?::)?\\d{2}))?",
")?",
")?",
")?"
].join("")
};
},
U: {
g: 1,
c: "u = parseInt(results[{0}], 10);\n",
s: "(-?\\d+)"
}
},
dateFormat: function(date, format) {
return utilDate.format(date, format);
},
isEqual: function(date1, date2) {
if (date1 && date2) {
return (date1.getTime() === date2.getTime());
}
return !(date1 || date2);
},
format: function(date, format) {
var formatFunctions = utilDate.formatFunctions;
if (!Ext.isDate(date)) {
return '';
}
if (formatFunctions[format] == null) {
utilDate.createFormat(format);
}
return formatFunctions[format].call(date) + '';
},
getTimezone: function(date) {
return date.toString().replace(/^.* (?:\((.*)\)|([A-Z]{1,5})(?:[\-+][0-9]{4})?(?: -?\d+)?)$/, "$1$2").replace(/[^A-Z]/g, "");
},
getGMTOffset: function(date, colon) {
var offset = date.getTimezoneOffset();
return (offset > 0 ? "-" : "+") + Ext.String.leftPad(Math.floor(Math.abs(offset) / 60), 2, "0") + (colon ? ":" : "") + Ext.String.leftPad(Math.abs(offset % 60), 2, "0");
},
getDayOfYear: function(date) {
var num = 0,
d = utilDate.clone(date),
m = date.getMonth(),
i;
for (i = 0 , d.setDate(1) , d.setMonth(0); i < m; d.setMonth(++i)) {
num += utilDate.getDaysInMonth(d);
}
return num + date.getDate() - 1;
},
getWeekOfYear: (function() {
var ms1d = 86400000,
ms7d = 7 * ms1d;
return function(date) {
var DC3 = nativeDate.UTC(date.getFullYear(), date.getMonth(), date.getDate() + 3) / ms1d,
AWN = Math.floor(DC3 / 7),
Wyr = new nativeDate(AWN * ms7d).getUTCFullYear();
return AWN - Math.floor(nativeDate.UTC(Wyr, 0, 7) / ms7d) + 1;
};
}()),
isLeapYear: function(date) {
var year = date.getFullYear();
return !!((year & 3) === 0 && (year % 100 || (year % 400 === 0 && year)));
},
getFirstDayOfMonth: function(date) {
var day = (date.getDay() - (date.getDate() - 1)) % 7;
return (day < 0) ? (day + 7) : day;
},
getLastDayOfMonth: function(date) {
return utilDate.getLastDateOfMonth(date).getDay();
},
getFirstDateOfMonth: function(date) {
return new nativeDate(date.getFullYear(), date.getMonth(), 1);
},
getLastDateOfMonth: function(date) {
return new nativeDate(date.getFullYear(), date.getMonth(), utilDate.getDaysInMonth(date));
},
getDaysInMonth: (function() {
var daysInMonth = [
31,
28,
31,
30,
31,
30,
31,
31,
30,
31,
30,
31
];
return function(date) {
var m = date.getMonth();
return m === 1 && utilDate.isLeapYear(date) ? 29 : daysInMonth[m];
};
}()),
getSuffix: function(date) {
switch (date.getDate()) {
case 1:
case 21:
case 31:
return "st";
case 2:
case 22:
return "nd";
case 3:
case 23:
return "rd";
default:
return "th";
}
},
clone: function(date) {
return new nativeDate(date.getTime());
},
isDST: function(date) {
return new nativeDate(date.getFullYear(), 0, 1).getTimezoneOffset() !== date.getTimezoneOffset();
},
clearTime: function(date, clone) {
if (clone) {
return utilDate.clearTime(utilDate.clone(date));
}
var d = date.getDate(),
hr, c;
date.setHours(0);
date.setMinutes(0);
date.setSeconds(0);
date.setMilliseconds(0);
if (date.getDate() !== d) {
for (hr = 1 , c = utilDate.add(date, utilDate.HOUR, hr); c.getDate() !== d; hr++ , c = utilDate.add(date, utilDate.HOUR, hr)){}
date.setDate(d);
date.setHours(c.getHours());
}
return date;
},
add: function(date, interval, value) {
var d = utilDate.clone(date),
day, decimalValue,
base = 0;
if (!interval || value === 0) {
return d;
}
decimalValue = value - parseInt(value, 10);
value = parseInt(value, 10);
if (value) {
switch (interval.toLowerCase()) {
case utilDate.MILLI:
d.setTime(d.getTime() + value);
break;
case utilDate.SECOND:
d.setTime(d.getTime() + value * 1000);
break;
case utilDate.MINUTE:
d.setTime(d.getTime() + value * 60 * 1000);
break;
case utilDate.HOUR:
d.setTime(d.getTime() + value * 60 * 60 * 1000);
break;
case utilDate.DAY:
d.setDate(d.getDate() + value);
break;
case utilDate.MONTH:
day = date.getDate();
if (day > 28) {
day = Math.min(day, utilDate.getLastDateOfMonth(utilDate.add(utilDate.getFirstDateOfMonth(date), utilDate.MONTH, value)).getDate());
};
d.setDate(day);
d.setMonth(date.getMonth() + value);
break;
case utilDate.YEAR:
day = date.getDate();
if (day > 28) {
day = Math.min(day, utilDate.getLastDateOfMonth(utilDate.add(utilDate.getFirstDateOfMonth(date), utilDate.YEAR, value)).getDate());
};
d.setDate(day);
d.setFullYear(date.getFullYear() + value);
break;
}
}
if (decimalValue) {
switch (interval.toLowerCase()) {
case utilDate.MILLI:
base = 1;
break;
case utilDate.SECOND:
base = 1000;
break;
case utilDate.MINUTE:
base = 1000 * 60;
break;
case utilDate.HOUR:
base = 1000 * 60 * 60;
break;
case utilDate.DAY:
base = 1000 * 60 * 60 * 24;
break;
case utilDate.MONTH:
day = utilDate.getDaysInMonth(d);
base = 1000 * 60 * 60 * 24 * day;
break;
case utilDate.YEAR:
day = (utilDate.isLeapYear(d) ? 366 : 365);
base = 1000 * 60 * 60 * 24 * day;
break;
}
if (base) {
d.setTime(d.getTime() + base * decimalValue);
}
}
return d;
},
subtract: function(date, interval, value) {
return utilDate.add(date, interval, -value);
},
between: function(date, start, end) {
var t = date.getTime();
return start.getTime() <= t && t <= end.getTime();
},
compat: function() {
var p,
statics = [
'useStrict',
'formatCodeToRegex',
'parseFunctions',
'parseRegexes',
'formatFunctions',
'y2kYear',
'MILLI',
'SECOND',
'MINUTE',
'HOUR',
'DAY',
'MONTH',
'YEAR',
'defaults',
'dayNames',
'monthNames',
'monthNumbers',
'getShortMonthName',
'getShortDayName',
'getMonthNumber',
'formatCodes',
'isValid',
'parseDate',
'getFormatCode',
'createFormat',
'createParser',
'parseCodes'
],
proto = [
'dateFormat',
'format',
'getTimezone',
'getGMTOffset',
'getDayOfYear',
'getWeekOfYear',
'isLeapYear',
'getFirstDayOfMonth',
'getLastDayOfMonth',
'getDaysInMonth',
'getSuffix',
'clone',
'isDST',
'clearTime',
'add',
'between'
],
sLen = statics.length,
pLen = proto.length,
stat, prot, s;
for (s = 0; s < sLen; s++) {
stat = statics[s];
nativeDate[stat] = utilDate[stat];
}
for (p = 0; p < pLen; p++) {
prot = proto[p];
nativeDate.prototype[prot] = function() {
var args = Array.prototype.slice.call(arguments);
args.unshift(this);
return utilDate[prot].apply(utilDate, args);
};
}
},
diff: function(min, max, unit) {
var est,
diff = +max - min;
switch (unit) {
case utilDate.MILLI:
return diff;
case utilDate.SECOND:
return Math.floor(diff / 1000);
case utilDate.MINUTE:
return Math.floor(diff / 60000);
case utilDate.HOUR:
return Math.floor(diff / 3600000);
case utilDate.DAY:
return Math.floor(diff / 86400000);
case 'w':
return Math.floor(diff / 604800000);
case utilDate.MONTH:
est = (max.getFullYear() * 12 + max.getMonth()) - (min.getFullYear() * 12 + min.getMonth());
if (utilDate.add(min, unit, est) > max) {
return est - 1;
};
return est;
case utilDate.YEAR:
est = max.getFullYear() - min.getFullYear();
if (utilDate.add(min, unit, est) > max) {
return est - 1;
} else {
return est;
};
}
},
align: function(date, unit, step) {
var num = new nativeDate(+date);
switch (unit.toLowerCase()) {
case utilDate.MILLI:
return num;
case utilDate.SECOND:
num.setUTCSeconds(num.getUTCSeconds() - num.getUTCSeconds() % step);
num.setUTCMilliseconds(0);
return num;
case utilDate.MINUTE:
num.setUTCMinutes(num.getUTCMinutes() - num.getUTCMinutes() % step);
num.setUTCSeconds(0);
num.setUTCMilliseconds(0);
return num;
case utilDate.HOUR:
num.setUTCHours(num.getUTCHours() - num.getUTCHours() % step);
num.setUTCMinutes(0);
num.setUTCSeconds(0);
num.setUTCMilliseconds(0);
return num;
case utilDate.DAY:
if (step === 7 || step === 14) {
num.setUTCDate(num.getUTCDate() - num.getUTCDay() + 1);
};
num.setUTCHours(0);
num.setUTCMinutes(0);
num.setUTCSeconds(0);
num.setUTCMilliseconds(0);
return num;
case utilDate.MONTH:
num.setUTCMonth(num.getUTCMonth() - (num.getUTCMonth() - 1) % step, 1);
num.setUTCHours(0);
num.setUTCMinutes(0);
num.setUTCSeconds(0);
num.setUTCMilliseconds(0);
return num;
case utilDate.YEAR:
num.setUTCFullYear(num.getUTCFullYear() - num.getUTCFullYear() % step, 1, 1);
num.setUTCHours(0);
num.setUTCMinutes(0);
num.setUTCSeconds(0);
num.setUTCMilliseconds(0);
return date;
}
}
};
}());
Ext.Function = (function() {
var lastTime = 0,
animFrameId,
animFrameHandlers = [],
animFrameNoArgs = [],
idSource = 0,
animFrameMap = {},
win = window,
requestAnimFrame = win.requestAnimationFrame || win.webkitRequestAnimationFrame || win.mozRequestAnimationFrame || win.oRequestAnimationFrame || function(callback) {
var currTime = Ext.now(),
timeToCall = Math.max(0, 16 - (currTime - lastTime)),
id = win.setTimeout(function() {
callback(currTime + timeToCall);
}, timeToCall);
lastTime = currTime + timeToCall;
return id;
},
fireHandlers = function() {
var len = animFrameHandlers.length,
id, i, handler;
animFrameId = null;
for (i = 0; i < len; i++) {
handler = animFrameHandlers[i];
id = handler[3];
if (animFrameMap[id]) {
handler[0].apply(handler[1] || Ext.global, handler[2] || animFrameNoArgs);
delete animFrameMap[id];
}
}
animFrameHandlers = animFrameHandlers.slice(len);
},
fireElevatedHandlers = function() {
Ext.elevateFunction(fireHandlers);
},
ExtFunction = {
flexSetter: function(setter) {
return function(name, value) {
var k, i;
if (name !== null) {
if (typeof name !== 'string') {
for (k in name) {
if (name.hasOwnProperty(k)) {
setter.call(this, k, name[k]);
}
}
if (Ext.enumerables) {
for (i = Ext.enumerables.length; i--; ) {
k = Ext.enumerables[i];
if (name.hasOwnProperty(k)) {
setter.call(this, k, name[k]);
}
}
}
} else {
setter.call(this, name, value);
}
}
return this;
};
},
bind: function(fn, scope, args, appendArgs) {
if (arguments.length === 2) {
return function() {
return fn.apply(scope, arguments);
};
}
var method = fn,
slice = Array.prototype.slice;
return function() {
var callArgs = args || arguments;
if (appendArgs === true) {
callArgs = slice.call(arguments, 0);
callArgs = callArgs.concat(args);
} else if (typeof appendArgs == 'number') {
callArgs = slice.call(arguments, 0);
Ext.Array.insert(callArgs, appendArgs, args);
}
return method.apply(scope || Ext.global, callArgs);
};
},
bindCallback: function(callback, scope, args, delay, caller) {
return function() {
var a = Ext.Array.slice(arguments);
return Ext.callback(callback, scope, args ? args.concat(a) : a, delay, caller);
};
},
pass: function(fn, args, scope) {
if (!Ext.isArray(args)) {
if (Ext.isIterable(args)) {
args = Ext.Array.clone(args);
} else {
args = args !== undefined ? [
args
] : [];
}
}
return function() {
var fnArgs = args.slice();
fnArgs.push.apply(fnArgs, arguments);
return fn.apply(scope || this, fnArgs);
};
},
alias: function(object, methodName) {
return function() {
return object[methodName].apply(object, arguments);
};
},
clone: function(method) {
return function() {
return method.apply(this, arguments);
};
},
createInterceptor: function(origFn, newFn, scope, returnValue) {
if (!Ext.isFunction(newFn)) {
return origFn;
} else {
returnValue = Ext.isDefined(returnValue) ? returnValue : null;
return function() {
var me = this,
args = arguments;
newFn.target = me;
newFn.method = origFn;
return (newFn.apply(scope || me || Ext.global, args) !== false) ? origFn.apply(me || Ext.global, args) : returnValue;
};
}
},
createDelayed: function(fn, delay, scope, args, appendArgs) {
if (scope || args) {
fn = Ext.Function.bind(fn, scope, args, appendArgs);
}
return function() {
var me = this,
args = Array.prototype.slice.call(arguments);
setTimeout(function() {
if (Ext.elevateFunction) {
Ext.elevateFunction(fn, me, args);
} else {
fn.apply(me, args);
}
}, delay);
};
},
defer: function(fn, millis, scope, args, appendArgs) {
fn = Ext.Function.bind(fn, scope, args, appendArgs);
if (millis > 0) {
return setTimeout(function() {
if (Ext.elevateFunction) {
Ext.elevateFunction(fn);
} else {
fn();
}
}, millis);
}
fn();
return 0;
},
interval: function(fn, millis, scope, args, appendArgs) {
fn = Ext.Function.bind(fn, scope, args, appendArgs);
return setInterval(function() {
if (Ext.elevateFunction) {
Ext.elevateFunction(fn);
} else {
fn();
}
}, millis);
},
createSequence: function(originalFn, newFn, scope) {
if (!newFn) {
return originalFn;
} else {
return function() {
var result = originalFn.apply(this, arguments);
newFn.apply(scope || this, arguments);
return result;
};
}
},
createBuffered: function(fn, buffer, scope, args) {
var timerId;
return function() {
var callArgs = args || Array.prototype.slice.call(arguments, 0),
me = scope || this;
if (timerId) {
clearTimeout(timerId);
}
timerId = setTimeout(function() {
if (Ext.elevateFunction) {
Ext.elevateFunction(fn, me, callArgs);
} else {
fn.apply(me, callArgs);
}
}, buffer);
};
},
createAnimationFrame: function(fn, scope, args, queueStrategy) {
var timerId;
queueStrategy = queueStrategy || 3;
return function() {
var callArgs = args || Array.prototype.slice.call(arguments, 0);
scope = scope || this;
if (queueStrategy === 3 && timerId) {
ExtFunction.cancelAnimationFrame(timerId);
}
if ((queueStrategy & 1) || !timerId) {
timerId = ExtFunction.requestAnimationFrame(function() {
timerId = null;
fn.apply(scope, callArgs);
});
}
};
},
requestAnimationFrame: function(fn, scope, args) {
var id = ++idSource,
handler = Array.prototype.slice.call(arguments, 0);
handler[3] = id;
animFrameMap[id] = 1;
animFrameHandlers.push(handler);
if (!animFrameId) {
animFrameId = requestAnimFrame(Ext.elevateFunction ? fireElevatedHandlers : fireHandlers);
}
return id;
},
cancelAnimationFrame: function(id) {
delete animFrameMap[id];
},
createThrottled: function(fn, interval, scope) {
var lastCallTime = 0,
elapsed, lastArgs, timer,
execute = function() {
if (Ext.elevateFunction) {
Ext.elevateFunction(fn, scope, lastArgs);
} else {
fn.apply(scope, lastArgs);
}
lastCallTime = Ext.now();
timer = null;
};
return function() {
if (!scope) {
scope = this;
}
elapsed = Ext.now() - lastCallTime;
lastArgs = arguments;
if (elapsed >= interval) {
clearTimeout(timer);
execute();
}
else if (!timer) {
timer = Ext.defer(execute, interval - elapsed);
}
};
},
createBarrier: function(count, fn, scope) {
return function() {
if (!--count) {
fn.apply(scope, arguments);
}
};
},
interceptBefore: function(object, methodName, fn, scope) {
var method = object[methodName] || Ext.emptyFn;
return (object[methodName] = function() {
var ret = fn.apply(scope || this, arguments);
method.apply(this, arguments);
return ret;
});
},
interceptAfter: function(object, methodName, fn, scope) {
var method = object[methodName] || Ext.emptyFn;
return (object[methodName] = function() {
method.apply(this, arguments);
return fn.apply(scope || this, arguments);
});
},
makeCallback: function(callback, scope) {
if (!scope[callback]) {
if (scope.$className) {
Ext.Error.raise('No method "' + callback + '" on ' + scope.$className);
}
Ext.Error.raise('No method "' + callback + '"');
}
return function() {
return scope[callback].apply(scope, arguments);
};
}
};
Ext.defer = ExtFunction.defer;
Ext.interval = ExtFunction.interval;
Ext.pass = ExtFunction.pass;
Ext.bind = ExtFunction.bind;
Ext.deferCallback = ExtFunction.requestAnimationFrame;
return ExtFunction;
})();
Ext.Number = (new function() {
var ExtNumber = this,
isToFixedBroken = (0.9).toFixed() !== '1',
math = Math,
ClipDefault = {
count: false,
inclusive: false,
wrap: true
};
Ext.apply(ExtNumber, {
Clip: {
DEFAULT: ClipDefault,
COUNT: Ext.applyIf({
count: true
}, ClipDefault),
INCLUSIVE: Ext.applyIf({
inclusive: true
}, ClipDefault),
NOWRAP: Ext.applyIf({
wrap: false
}, ClipDefault)
},
clipIndices: function(length, indices, options) {
options = options || ClipDefault;
var defaultValue = 0,
wrap = options.wrap,
begin, end, i;
indices = indices || [];
for (i = 0; i < 2; ++i) {
begin = end;
end = indices[i];
if (end == null) {
end = defaultValue;
} else if (i && options.count) {
end += begin;
end = (end > length) ? length : end;
} else {
if (wrap) {
end = (end < 0) ? (length + end) : end;
}
if (i && options.inclusive) {
++end;
}
end = (end < 0) ? 0 : ((end > length) ? length : end);
}
defaultValue = length;
}
indices[0] = begin;
indices[1] = (end < begin) ? begin : end;
return indices;
},
constrain: function(number, min, max) {
var x = parseFloat(number);
if (min === null) {
min = number;
}
if (max === null) {
max = number;
}
return (x < min) ? min : ((x > max) ? max : x);
},
snap: function(value, increment, minValue, maxValue) {
var m;
if (value === undefined || value < minValue) {
return minValue || 0;
}
if (increment) {
m = value % increment;
if (m !== 0) {
value -= m;
if (m * 2 >= increment) {
value += increment;
} else if (m * 2 < -increment) {
value -= increment;
}
}
}
return ExtNumber.constrain(value, minValue, maxValue);
},
snapInRange: function(value, increment, minValue, maxValue) {
var tween;
minValue = (minValue || 0);
if (value === undefined || value < minValue) {
return minValue;
}
if (increment && (tween = ((value - minValue) % increment))) {
value -= tween;
tween *= 2;
if (tween >= increment) {
value += increment;
}
}
if (maxValue !== undefined) {
if (value > (maxValue = ExtNumber.snapInRange(maxValue, increment, minValue))) {
value = maxValue;
}
}
return value;
},
sign: function(x) {
x = +x;
if (x === 0 || isNaN(x)) {
return x;
}
return (x > 0) ? 1 : -1;
},
toFixed: isToFixedBroken ? function(value, precision) {
precision = precision || 0;
var pow = math.pow(10, precision);
return (math.round(value * pow) / pow).toFixed(precision);
} : function(value, precision) {
return value.toFixed(precision);
},
from: function(value, defaultValue) {
if (isFinite(value)) {
value = parseFloat(value);
}
return !isNaN(value) ? value : defaultValue;
},
randomInt: function(from, to) {
return math.floor(math.random() * (to - from + 1) + from);
},
correctFloat: function(n) {
return parseFloat(n.toPrecision(14));
}
});
Ext.num = function() {
return ExtNumber.from.apply(this, arguments);
};
}());
(function() {
var TemplateClass = function() {},
queryRe = /^\?/,
keyRe = /(\[):?([^\]]*)\]/g,
nameRe = /^([^\[]+)/,
plusRe = /\+/g,
ExtObject = Ext.Object = {
chain: Object.create || function(object) {
TemplateClass.prototype = object;
var result = new TemplateClass();
TemplateClass.prototype = null;
return result;
},
clear: function(object) {
for (var key in object) {
delete object[key];
}
return object;
},
freeze: Object.freeze ? function(obj, deep) {
if (obj && typeof obj === 'object' && !Object.isFrozen(obj)) {
Object.freeze(obj);
if (deep) {
for (var name in obj) {
ExtObject.freeze(obj[name], deep);
}
}
}
return obj;
} : Ext.identityFn,
toQueryObjects: function(name, value, recursive) {
var self = ExtObject.toQueryObjects,
objects = [],
i, ln;
if (Ext.isArray(value)) {
for (i = 0 , ln = value.length; i < ln; i++) {
if (recursive) {
objects = objects.concat(self(name + '[' + i + ']', value[i], true));
} else {
objects.push({
name: name,
value: value[i]
});
}
}
} else if (Ext.isObject(value)) {
for (i in value) {
if (value.hasOwnProperty(i)) {
if (recursive) {
objects = objects.concat(self(name + '[' + i + ']', value[i], true));
} else {
objects.push({
name: name,
value: value[i]
});
}
}
}
} else {
objects.push({
name: name,
value: value
});
}
return objects;
},
toQueryString: function(object, recursive) {
var paramObjects = [],
params = [],
i, j, ln, paramObject, value;
for (i in object) {
if (object.hasOwnProperty(i)) {
paramObjects = paramObjects.concat(ExtObject.toQueryObjects(i, object[i], recursive));
}
}
for (j = 0 , ln = paramObjects.length; j < ln; j++) {
paramObject = paramObjects[j];
value = paramObject.value;
if (Ext.isEmpty(value)) {
value = '';
} else if (Ext.isDate(value)) {
value = Ext.Date.toString(value);
}
params.push(encodeURIComponent(paramObject.name) + '=' + encodeURIComponent(String(value)));
}
return params.join('&');
},
fromQueryString: function(queryString, recursive) {
var parts = queryString.replace(queryRe, '').split('&'),
object = {},
temp, components, name, value, i, ln, part, j, subLn, matchedKeys, matchedName, keys, key, nextKey;
for (i = 0 , ln = parts.length; i < ln; i++) {
part = parts[i];
if (part.length > 0) {
components = part.split('=');
name = components[0];
name = name.replace(plusRe, '%20');
name = decodeURIComponent(name);
value = components[1];
if (value !== undefined) {
value = value.replace(plusRe, '%20');
value = decodeURIComponent(value);
} else {
value = '';
}
if (!recursive) {
if (object.hasOwnProperty(name)) {
if (!Ext.isArray(object[name])) {
object[name] = [
object[name]
];
}
object[name].push(value);
} else {
object[name] = value;
}
} else {
matchedKeys = name.match(keyRe);
matchedName = name.match(nameRe);
if (!matchedName) {
throw new Error('[Ext.Object.fromQueryString] Malformed query string given, failed parsing name from "' + part + '"');
}
name = matchedName[0];
keys = [];
if (matchedKeys === null) {
object[name] = value;
continue;
}
for (j = 0 , subLn = matchedKeys.length; j < subLn; j++) {
key = matchedKeys[j];
key = (key.length === 2) ? '' : key.substring(1, key.length - 1);
keys.push(key);
}
keys.unshift(name);
temp = object;
for (j = 0 , subLn = keys.length; j < subLn; j++) {
key = keys[j];
if (j === subLn - 1) {
if (Ext.isArray(temp) && key === '') {
temp.push(value);
} else {
temp[key] = value;
}
} else {
if (temp[key] === undefined || typeof temp[key] === 'string') {
nextKey = keys[j + 1];
temp[key] = (Ext.isNumeric(nextKey) || nextKey === '') ? [] : {};
}
temp = temp[key];
}
}
}
}
}
return object;
},
each: function(object, fn, scope) {
var enumerables = Ext.enumerables,
i, property;
if (object) {
scope = scope || object;
for (property in object) {
if (object.hasOwnProperty(property)) {
if (fn.call(scope, property, object[property], object) === false) {
return;
}
}
}
if (enumerables) {
for (i = enumerables.length; i--; ) {
if (object.hasOwnProperty(property = enumerables[i])) {
if (fn.call(scope, property, object[property], object) === false) {
return;
}
}
}
}
}
},
eachValue: function(object, fn, scope) {
var enumerables = Ext.enumerables,
i, property;
scope = scope || object;
for (property in object) {
if (object.hasOwnProperty(property)) {
if (fn.call(scope, object[property]) === false) {
return;
}
}
}
if (enumerables) {
for (i = enumerables.length; i--; ) {
if (object.hasOwnProperty(property = enumerables[i])) {
if (fn.call(scope, object[property]) === false) {
return;
}
}
}
}
},
merge: function(destination) {
var i = 1,
ln = arguments.length,
mergeFn = ExtObject.merge,
cloneFn = Ext.clone,
object, key, value, sourceKey;
for (; i < ln; i++) {
object = arguments[i];
for (key in object) {
value = object[key];
if (value && value.constructor === Object) {
sourceKey = destination[key];
if (sourceKey && sourceKey.constructor === Object) {
mergeFn(sourceKey, value);
} else {
destination[key] = cloneFn(value);
}
} else {
destination[key] = value;
}
}
}
return destination;
},
mergeIf: function(destination) {
var i = 1,
ln = arguments.length,
cloneFn = Ext.clone,
object, key, value;
for (; i < ln; i++) {
object = arguments[i];
for (key in object) {
if (!(key in destination)) {
value = object[key];
if (value && value.constructor === Object) {
destination[key] = cloneFn(value);
} else {
destination[key] = value;
}
}
}
}
return destination;
},
getAllKeys: function(object) {
var keys = [],
property;
for (property in object) {
keys.push(property);
}
return keys;
},
getKey: function(object, value) {
for (var property in object) {
if (object.hasOwnProperty(property) && object[property] === value) {
return property;
}
}
return null;
},
getValues: function(object) {
var values = [],
property;
for (property in object) {
if (object.hasOwnProperty(property)) {
values.push(object[property]);
}
}
return values;
},
getKeys: (typeof Object.keys == 'function') ? function(object) {
if (!object) {
return [];
}
return Object.keys(object);
} : function(object) {
var keys = [],
property;
for (property in object) {
if (object.hasOwnProperty(property)) {
keys.push(property);
}
}
return keys;
},
getSize: function(object) {
var size = 0,
property;
for (property in object) {
if (object.hasOwnProperty(property)) {
size++;
}
}
return size;
},
isEmpty: function(object) {
for (var key in object) {
if (object.hasOwnProperty(key)) {
return false;
}
}
return true;
},
equals: (function() {
var check = function(o1, o2) {
var key;
for (key in o1) {
if (o1.hasOwnProperty(key)) {
if (o1[key] !== o2[key]) {
return false;
}
}
}
return true;
};
return function(object1, object2) {
if (object1 === object2) {
return true;
}
if (object1 && object2) {
return check(object1, object2) && check(object2, object1);
} else if (!object1 && !object2) {
return object1 === object2;
} else {
return false;
}
};
})(),
fork: function(obj) {
var ret, key, value;
if (obj && obj.constructor === Object) {
ret = ExtObject.chain(obj);
for (key in obj) {
value = obj[key];
if (value) {
if (value.constructor === Object) {
ret[key] = ExtObject.fork(value);
} else if (value instanceof Array) {
ret[key] = Ext.Array.clone(value);
}
}
}
} else {
ret = obj;
}
return ret;
},
defineProperty: ('defineProperty' in Object) ? Object.defineProperty : function(object, name, descriptor) {
if (!Object.prototype.__defineGetter__) {
return;
}
if (descriptor.get) {
object.__defineGetter__(name, descriptor.get);
}
if (descriptor.set) {
object.__defineSetter__(name, descriptor.set);
}
},
classify: function(object) {
var prototype = object,
objectProperties = [],
propertyClassesMap = {},
objectClass = function() {
var i = 0,
ln = objectProperties.length,
property;
for (; i < ln; i++) {
property = objectProperties[i];
this[property] = new propertyClassesMap[property]();
}
},
key, value;
for (key in object) {
if (object.hasOwnProperty(key)) {
value = object[key];
if (value && value.constructor === Object) {
objectProperties.push(key);
propertyClassesMap[key] = ExtObject.classify(value);
}
}
}
objectClass.prototype = prototype;
return objectClass;
}
};
Ext.merge = Ext.Object.merge;
Ext.mergeIf = Ext.Object.mergeIf;
}());
Ext.apply(Ext, {
_namedScopes: {
'this': {
isThis: 1
},
controller: {
isController: 1
},
self: {
isSelf: 1
},
'self.controller': {
isSelf: 1,
isController: 1
}
},
escapeId: (function() {
var validIdRe = /^[a-zA-Z_][a-zA-Z0-9_\-]*$/i,
escapeRx = /([\W]{1})/g,
leadingNumRx = /^(\d)/g,
escapeFn = function(match, capture) {
return "\\" + capture;
},
numEscapeFn = function(match, capture) {
return '\\00' + capture.charCodeAt(0).toString(16) + ' ';
};
return function(id) {
return validIdRe.test(id) ? id :
id.replace(escapeRx, escapeFn).replace(leadingNumRx, numEscapeFn);
};
}()),
callback: function(callback, scope, args, delay, caller, defaultScope) {
if (!callback) {
return;
}
var namedScope = (scope in Ext._namedScopes);
if (callback.charAt) {
if ((!scope || namedScope) && caller) {
scope = caller.resolveListenerScope(namedScope ? scope : defaultScope);
}
if (!scope || !Ext.isObject(scope)) {
Ext.Error.raise('Named method "' + callback + '" requires a scope object');
}
if (!Ext.isFunction(scope[callback])) {
Ext.Error.raise('No method named "' + callback + '" on ' + (scope.$className || 'scope object'));
}
callback = scope[callback];
} else if (namedScope) {
scope = defaultScope || caller;
} else if (!scope) {
scope = caller;
}
var ret;
if (callback && Ext.isFunction(callback)) {
scope = scope || Ext.global;
if (delay) {
Ext.defer(callback, delay, scope, args);
} else if (Ext.elevateFunction) {
ret = Ext.elevateFunction(callback, scope, args);
} else if (args) {
ret = callback.apply(scope, args);
} else {
ret = callback.call(scope);
}
}
return ret;
},
coerce: function(from, to) {
var fromType = Ext.typeOf(from),
toType = Ext.typeOf(to),
isString = typeof from === 'string';
if (fromType !== toType) {
switch (toType) {
case 'string':
return String(from);
case 'number':
return Number(from);
case 'boolean':
return isString && (!from || from === 'false') ? false : Boolean(from);
case 'null':
return isString && (!from || from === 'null') ? null : from;
case 'undefined':
return isString && (!from || from === 'undefined') ? undefined : from;
case 'date':
return isString && isNaN(from) ? Ext.Date.parse(from, Ext.Date.defaultFormat) : Date(Number(from));
}
}
return from;
},
copyTo: function(dest, source, names, usePrototypeKeys) {
if (typeof names === 'string') {
names = names.split(Ext.propertyNameSplitRe);
}
for (var name,
i = 0,
n = names ? names.length : 0; i < n; i++) {
name = names[i];
if (usePrototypeKeys || source.hasOwnProperty(name)) {
dest[name] = source[name];
}
}
return dest;
},
propertyNameSplitRe: /[,;\s]+/,
copyToIf: function(destination, source, names) {
if (typeof names === 'string') {
names = names.split(Ext.propertyNameSplitRe);
}
for (var name,
i = 0,
n = names ? names.length : 0; i < n; i++) {
name = names[i];
if (destination[name] === undefined) {
destination[name] = source[name];
}
}
return destination;
},
extend: (function() {
var objectConstructor = Object.prototype.constructor,
inlineOverrides = function(o) {
for (var m in o) {
if (!o.hasOwnProperty(m)) {
continue;
}
this[m] = o[m];
}
};
return function(subclass, superclass, overrides) {
if (Ext.isObject(superclass)) {
overrides = superclass;
superclass = subclass;
subclass = overrides.constructor !== objectConstructor ? overrides.constructor : function() {
superclass.apply(this, arguments);
};
}
if (!superclass) {
Ext.Error.raise({
sourceClass: 'Ext',
sourceMethod: 'extend',
msg: 'Attempting to extend from a class which has not been loaded on the page.'
});
}
var F = function() {},
subclassProto,
superclassProto = superclass.prototype;
F.prototype = superclassProto;
subclassProto = subclass.prototype = new F();
subclassProto.constructor = subclass;
subclass.superclass = superclassProto;
if (superclassProto.constructor === objectConstructor) {
superclassProto.constructor = superclass;
}
subclass.override = function(overrides) {
Ext.override(subclass, overrides);
};
subclassProto.override = inlineOverrides;
subclassProto.proto = subclassProto;
subclass.override(overrides);
subclass.extend = function(o) {
return Ext.extend(subclass, o);
};
return subclass;
};
}()),
iterate: function(object, fn, scope) {
if (Ext.isEmpty(object)) {
return;
}
if (scope === undefined) {
scope = object;
}
if (Ext.isIterable(object)) {
Ext.Array.each.call(Ext.Array, object, fn, scope);
} else {
Ext.Object.each.call(Ext.Object, object, fn, scope);
}
},
urlEncode: function() {
var args = Ext.Array.from(arguments),
prefix = '';
if (Ext.isString(args[1])) {
prefix = args[1] + '&';
args[1] = false;
}
return prefix + Ext.Object.toQueryString.apply(Ext.Object, args);
},
urlDecode: function() {
return Ext.Object.fromQueryString.apply(Ext.Object, arguments);
},
getScrollbarSize: function(force) {
if (!Ext.isDomReady) {
Ext.Error.raise("getScrollbarSize called before DomReady");
}
var scrollbarSize = Ext._scrollbarSize;
if (force || !scrollbarSize) {
var db = document.body,
div = document.createElement('div');
div.style.width = div.style.height = '100px';
div.style.overflow = 'scroll';
div.style.position = 'absolute';
db.appendChild(div);
Ext._scrollbarSize = scrollbarSize = {
width: div.offsetWidth - div.clientWidth,
height: div.offsetHeight - div.clientHeight
};
db.removeChild(div);
}
return scrollbarSize;
},
typeOf: (function() {
var nonWhitespaceRe = /\S/,
toString = Object.prototype.toString,
typeofTypes = {
number: 1,
string: 1,
'boolean': 1,
'undefined': 1
},
toStringTypes = {
'[object Array]': 'array',
'[object Date]': 'date',
'[object Boolean]': 'boolean',
'[object Number]': 'number',
'[object RegExp]': 'regexp'
};
return function(value) {
if (value === null) {
return 'null';
}
var type = typeof value,
ret, typeToString;
if (typeofTypes[type]) {
return type;
}
ret = toStringTypes[typeToString = toString.call(value)];
if (ret) {
return ret;
}
if (type === 'function') {
return 'function';
}
if (type === 'object') {
if (value.nodeType !== undefined) {
if (value.nodeType === 3) {
return nonWhitespaceRe.test(value.nodeValue) ? 'textnode' : 'whitespace';
} else {
return 'element';
}
}
return 'object';
}
Ext.Error.raise({
sourceClass: 'Ext',
sourceMethod: 'typeOf',
msg: 'Failed to determine the type of "' + value + '".'
});
return typeToString;
};
}()),
factory: function(config, classReference, instance, aliasNamespace) {
var manager = Ext.ClassManager,
newInstance;
if (!config || config.isInstance) {
if (instance && instance !== config) {
instance.destroy();
}
return config;
}
if (aliasNamespace) {
if (typeof config === 'string') {
return manager.instantiateByAlias(aliasNamespace + '.' + config);
}
else if (Ext.isObject(config) && 'type' in config) {
return manager.instantiateByAlias(aliasNamespace + '.' + config.type, config);
}
}
if (config === true) {
return instance || Ext.create(classReference);
}
if (!Ext.isObject(config)) {
Ext.Logger.error("Invalid config, must be a valid config object");
}
if ('xtype' in config) {
newInstance = manager.instantiateByAlias('widget.' + config.xtype, config);
} else if ('xclass' in config) {
newInstance = Ext.create(config.xclass, config);
}
if (newInstance) {
if (instance) {
instance.destroy();
}
return newInstance;
}
if (instance) {
return instance.setConfig(config);
}
return Ext.create(classReference, config);
},
log: (function() {
var primitiveRe = /string|number|boolean/;
function dumpObject(object, level, maxLevel, withFunctions) {
var member, type, value, name, prefix, suffix,
members = [];
if (Ext.isArray(object)) {
prefix = '[';
suffix = ']';
} else if (Ext.isObject(object)) {
prefix = '{';
suffix = '}';
}
if (!maxLevel) {
maxLevel = 3;
}
if (level > maxLevel) {
return prefix + '...' + suffix;
}
level = level || 1;
var spacer = (new Array(level)).join(' ');
for (name in object) {
if (object.hasOwnProperty(name)) {
value = object[name];
type = typeof value;
if (type === 'function') {
if (!withFunctions) {
continue;
}
member = type;
} else if (type === 'undefined') {
member = type;
} else if (value === null || primitiveRe.test(type) || Ext.isDate(value)) {
member = Ext.encode(value);
} else if (Ext.isArray(value)) {
member = this.dumpObject(value, level + 1, maxLevel, withFunctions);
} else if (Ext.isObject(value)) {
member = this.dumpObject(value, level + 1, maxLevel, withFunctions);
} else {
member = type;
}
members.push(spacer + name + ': ' + member);
}
}
if (members.length) {
return prefix + '\n ' + members.join(',\n ') + '\n' + spacer + suffix;
}
return prefix + suffix;
}
function log(message) {
var options, dump,
con = Ext.global.console,
level = 'log',
indent = log.indent || 0,
prefix, stack, fn, out, max;
log.indent = indent;
if (typeof message !== 'string') {
options = message;
message = options.msg || '';
level = options.level || level;
dump = options.dump;
stack = options.stack;
prefix = options.prefix;
fn = options.fn;
if (options.indent) {
++log.indent;
} else if (options.outdent) {
log.indent = indent = Math.max(indent - 1, 0);
}
if (dump && !(con && con.dir)) {
message += dumpObject(dump);
dump = null;
}
}
if (arguments.length > 1) {
message += Array.prototype.slice.call(arguments, 1).join('');
}
if (prefix) {
message = prefix + ' - ' + message;
}
message = indent ? Ext.String.repeat(' ', log.indentSize * indent) + message : message;
if (level !== 'log') {
message = '[' + level.charAt(0).toUpperCase() + '] ' + message;
}
if (fn) {
message += '\nCaller: ' + fn.toString();
}
if (con) {
if (con[level]) {
con[level](message);
} else {
con.log(message);
}
if (dump) {
con.dir(dump);
}
if (stack && con.trace) {
if (!con.firebug || level !== 'error') {
con.trace();
}
}
} else if (Ext.isOpera) {
opera.postError(message);
} else
{
out = log.out;
max = log.max;
if (out.length >= max) {
Ext.Array.erase(out, 0, out.length - 3 * Math.floor(max / 4));
}
out.push(message);
}
++log.count;
++log.counters[level];
}
function logx(level, args) {
if (typeof args[0] === 'string') {
args.unshift({});
}
args[0].level = level;
log.apply(this, args);
}
log.error = function() {
logx('error', Array.prototype.slice.call(arguments));
};
log.info = function() {
logx('info', Array.prototype.slice.call(arguments));
};
log.warn = function() {
logx('warn', Array.prototype.slice.call(arguments));
};
log.count = 0;
log.counters = {
error: 0,
warn: 0,
info: 0,
log: 0
};
log.indentSize = 2;
log.out = [];
log.max = 750;
return log;
}()) || (function() {
var nullLog = function() {};
nullLog.info = nullLog.warn = nullLog.error = Ext.emptyFn;
return nullLog;
}())
});
(function() {
var
checkVerTemp = [
''
],
endOfVersionRe = /([^\d\.])/,
notDigitsRe = /[^\d]/g,
plusMinusRe = /[\-+]/g,
stripRe = /\s/g,
underscoreRe = /_/g,
Version;
Ext.Version = Version = function(version, defaultMode) {
var me = this,
padModes = me.padModes,
ch, i, pad, parts, release, releaseStartIndex, ver;
if (version.isVersion) {
version = version.version;
}
me.version = ver = String(version).toLowerCase().replace(underscoreRe, '.').replace(plusMinusRe, '');
ch = ver.charAt(0);
if (ch in padModes) {
ver = ver.substring(1);
pad = padModes[ch];
} else {
pad = defaultMode ? padModes[defaultMode] : 0;
}
me.pad = pad;
releaseStartIndex = ver.search(endOfVersionRe);
me.shortVersion = ver;
if (releaseStartIndex !== -1) {
me.release = release = ver.substr(releaseStartIndex, version.length);
me.shortVersion = ver.substr(0, releaseStartIndex);
release = Version.releaseValueMap[release] || release;
}
me.releaseValue = release || pad;
me.shortVersion = me.shortVersion.replace(notDigitsRe, '');
me.parts = parts = ver.split('.');
for (i = parts.length; i--; ) {
parts[i] = parseInt(parts[i], 10);
}
if (pad === Infinity) {
parts.push(pad);
}
me.major = parts[0] || pad;
me.minor = parts[1] || pad;
me.patch = parts[2] || pad;
me.build = parts[3] || pad;
return me;
};
Version.prototype = {
isVersion: true,
padModes: {
'~': NaN,
'^': Infinity
},
release: '',
compareTo: function(other) {
var me = this,
lhsPad = me.pad,
lhsParts = me.parts,
lhsLength = lhsParts.length,
rhsVersion = other.isVersion ? other : new Version(other),
rhsPad = rhsVersion.pad,
rhsParts = rhsVersion.parts,
rhsLength = rhsParts.length,
length = Math.max(lhsLength, rhsLength),
i, lhs, rhs;
for (i = 0; i < length; i++) {
lhs = (i < lhsLength) ? lhsParts[i] : lhsPad;
rhs = (i < rhsLength) ? rhsParts[i] : rhsPad;
if (lhs < rhs) {
return -1;
}
if (lhs > rhs) {
return 1;
}
}
lhs = me.releaseValue;
rhs = rhsVersion.releaseValue;
if (lhs < rhs) {
return -1;
}
if (lhs > rhs) {
return 1;
}
return 0;
},
toString: function() {
return this.version;
},
valueOf: function() {
return this.version;
},
getMajor: function() {
return this.major;
},
getMinor: function() {
return this.minor;
},
getPatch: function() {
return this.patch;
},
getBuild: function() {
return this.build;
},
getRelease: function() {
return this.release;
},
getReleaseValue: function() {
return this.releaseValue;
},
isGreaterThan: function(target) {
return this.compareTo(target) > 0;
},
isGreaterThanOrEqual: function(target) {
return this.compareTo(target) >= 0;
},
isLessThan: function(target) {
return this.compareTo(target) < 0;
},
isLessThanOrEqual: function(target) {
return this.compareTo(target) <= 0;
},
equals: function(target) {
return this.compareTo(target) === 0;
},
match: function(target) {
target = String(target);
return this.version.substr(0, target.length) === target;
},
toArray: function() {
var me = this;
return [
me.getMajor(),
me.getMinor(),
me.getPatch(),
me.getBuild(),
me.getRelease()
];
},
getShortVersion: function() {
return this.shortVersion;
},
gt: function(target) {
return this.compareTo(target) > 0;
},
lt: function(target) {
return this.compareTo(target) < 0;
},
gtEq: function(target) {
return this.compareTo(target) >= 0;
},
ltEq: function(target) {
return this.compareTo(target) <= 0;
}
};
Ext.apply(Version, {
aliases: {
from: {
extjs: 'ext',
core: 'sencha-core'
},
to: {
ext: [
'extjs'
],
'sencha-core': [
'core'
]
}
},
releaseValueMap: {
dev: -6,
alpha: -5,
a: -5,
beta: -4,
b: -4,
rc: -3,
'#': -2,
p: -1,
pl: -1
},
getComponentValue: function(value) {
return !value ? 0 : (isNaN(value) ? this.releaseValueMap[value] || value : parseInt(value, 10));
},
compare: function(current, target) {
var ver = current.isVersion ? current : new Version(current);
return ver.compareTo(target);
},
set: function(collection, packageName, version) {
var aliases = Version.aliases.to[packageName],
ver = version.isVersion ? version : new Version(version),
i;
collection[packageName] = ver;
if (aliases) {
for (i = aliases.length; i-- > 0; ) {
collection[aliases[i]] = ver;
}
}
return ver;
}
});
Ext.apply(Ext, {
compatVersions: {},
versions: {},
lastRegisteredVersion: null,
getCompatVersion: function(packageName) {
var versions = Ext.compatVersions,
compat;
if (!packageName) {
compat = versions.ext || versions.touch || versions.core;
} else {
compat = versions[Version.aliases.from[packageName] || packageName];
}
return compat || Ext.getVersion(packageName);
},
setCompatVersion: function(packageName, version) {
Version.set(Ext.compatVersions, packageName, version);
},
setVersion: function(packageName, version) {
Ext.lastRegisteredVersion = Version.set(Ext.versions, packageName, version);
return this;
},
getVersion: function(packageName) {
var versions = Ext.versions;
if (!packageName) {
return versions.ext || versions.touch || versions.core;
}
return versions[Version.aliases.from[packageName] || packageName];
},
checkVersion: function(specs, matchAll) {
var isArray = Ext.isArray(specs),
aliases = Version.aliases.from,
compat = isArray ? specs : checkVerTemp,
length = compat.length,
versions = Ext.versions,
frameworkVer = versions.ext || versions.touch,
i, index, matches, minVer, maxVer, packageName, spec, range, ver;
if (!isArray) {
checkVerTemp[0] = specs;
}
for (i = 0; i < length; ++i) {
if (!Ext.isString(spec = compat[i])) {
matches = Ext.checkVersion(spec.and || spec.or, !spec.or);
if (spec.not) {
matches = !matches;
}
} else {
if (spec.indexOf(' ') >= 0) {
spec = spec.replace(stripRe, '');
}
index = spec.indexOf('@');
if (index < 0) {
range = spec;
ver = frameworkVer;
} else {
packageName = spec.substring(0, index);
if (!(ver = versions[aliases[packageName] || packageName])) {
if (matchAll) {
return false;
}
continue;
}
range = spec.substring(index + 1);
}
index = range.indexOf('-');
if (index < 0) {
if (range.charAt(index = range.length - 1) === '+') {
minVer = range.substring(0, index);
maxVer = null;
} else {
minVer = maxVer = range;
}
} else if (index > 0) {
minVer = range.substring(0, index);
maxVer = range.substring(index + 1);
} else
{
minVer = null;
maxVer = range.substring(index + 1);
}
matches = true;
if (minVer) {
minVer = new Version(minVer, '~');
matches = minVer.ltEq(ver);
}
if (matches && maxVer) {
maxVer = new Version(maxVer, '~');
matches = maxVer.gtEq(ver);
}
}
if (matches) {
if (!matchAll) {
return true;
}
} else if (matchAll) {
return false;
}
}
return !!matchAll;
},
deprecate: function(packageName, since, closure, scope) {
if (Version.compare(Ext.getVersion(packageName), since) < 1) {
closure.call(scope);
}
}
});
}());
(function(manifest) {
var packages = (manifest && manifest.packages) || {},
compat = manifest && manifest.compatibility,
name, pkg;
for (name in packages) {
pkg = packages[name];
Ext.setVersion(name, pkg.version);
}
if (compat) {
if (Ext.isString(compat)) {
Ext.setCompatVersion('core', compat);
} else {
for (name in compat) {
Ext.setCompatVersion(name, compat[name]);
}
}
}
if (!packages.ext && !packages.touch) {
Ext.setVersion('ext','5.1.1.451');Ext.setVersion('sencha-core','5.1.1.451');
}
})(Ext.manifest);
Ext.Config = function(name) {
var me = this,
capitalizedName = name.charAt(0).toUpperCase() + name.substr(1);
me.name = name;
me.names = {
internal: '_' + name,
initializing: 'is' + capitalizedName + 'Initializing',
apply: 'apply' + capitalizedName,
update: 'update' + capitalizedName,
get: 'get' + capitalizedName,
set: 'set' + capitalizedName,
initGet: 'initGet' + capitalizedName,
doSet: 'doSet' + capitalizedName,
changeEvent: name.toLowerCase() + 'change'
};
me.root = me;
};
Ext.Config.map = {};
Ext.Config.get = function(name) {
var map = Ext.Config.map,
ret = map[name] || (map[name] = new Ext.Config(name));
return ret;
};
Ext.Config.prototype = {
self: Ext.Config,
isConfig: true,
getGetter: function() {
return this.getter || (this.root.getter = this.makeGetter());
},
getInitGetter: function() {
return this.initGetter || (this.root.initGetter = this.makeInitGetter());
},
getSetter: function() {
return this.setter || (this.root.setter = this.makeSetter());
},
getInternalName: function(target) {
return target.$configPrefixed ? this.names.internal : this.name;
},
mergeNew: function(newValue, oldValue, target, mixinClass) {
var ret, key;
if (!oldValue) {
ret = newValue;
} else if (!newValue) {
ret = oldValue;
} else {
ret = Ext.Object.chain(oldValue);
for (key in newValue) {
if (!mixinClass || !(key in ret)) {
ret[key] = newValue[key];
}
}
}
return ret;
},
mergeSets: function(newValue, oldValue, preserveExisting) {
var ret = oldValue ? Ext.Object.chain(oldValue) : {},
i, val;
if (newValue instanceof Array) {
for (i = newValue.length; i--; ) {
val = newValue[i];
if (!preserveExisting || !(val in ret)) {
ret[val] = true;
}
}
} else if (newValue) {
if (newValue.constructor === Object) {
for (i in newValue) {
val = newValue[i];
if (!preserveExisting || !(i in ret)) {
ret[i] = val;
}
}
} else if (!preserveExisting || !(newValue in ret)) {
ret[newValue] = true;
}
}
return ret;
},
makeGetter: function() {
var name = this.name,
prefixedName = this.names.internal;
return function() {
var internalName = this.$configPrefixed ? prefixedName : name;
return this[internalName];
};
},
makeInitGetter: function() {
var name = this.name,
names = this.names,
setName = names.set,
getName = names.get,
initializingName = names.initializing;
return function() {
var me = this;
me[initializingName] = true;
delete me[getName];
me[setName](me.config[name]);
delete me[initializingName];
return me[getName].apply(me, arguments);
};
},
makeSetter: function() {
var name = this.name,
names = this.names,
prefixedName = names.internal,
getName = names.get,
applyName = names.apply,
updateName = names.update,
setter;
setter = function(value) {
var me = this,
internalName = me.$configPrefixed ? prefixedName : name,
oldValue = me[internalName];
delete me[getName];
if (!me[applyName] || (value = me[applyName](value, oldValue)) !== undefined) {
if (value !== (oldValue = me[internalName])) {
me[internalName] = value;
if (me[updateName]) {
me[updateName](value, oldValue);
}
}
}
return me;
};
setter.$isDefault = true;
return setter;
}
};
(function() {
var ExtConfig = Ext.Config,
configPropMap = ExtConfig.map,
ExtObject = Ext.Object;
Ext.Configurator = function(cls) {
var me = this,
prototype = cls.prototype,
zuper = cls.superclass ? cls.superclass.self.$config : null;
me.cls = cls;
if (zuper) {
me.configs = ExtObject.chain(zuper.configs);
me.cachedConfigs = ExtObject.chain(zuper.cachedConfigs);
me.initMap = ExtObject.chain(zuper.initMap);
me.values = ExtObject.chain(zuper.values);
me.needsFork = zuper.needsFork;
} else {
me.configs = {};
me.cachedConfigs = {};
me.initMap = {};
me.values = {};
}
prototype.config = prototype.defaultConfig = me.values;
cls.$config = me;
};
Ext.Configurator.prototype = {
self: Ext.Configurator,
needsFork: false,
initList: null,
add: function(config, mixinClass) {
var me = this,
Cls = me.cls,
configs = me.configs,
cachedConfigs = me.cachedConfigs,
initMap = me.initMap,
prototype = Cls.prototype,
mixinConfigs = mixinClass && mixinClass.$config.configs,
values = me.values,
isObject, meta, isCached, merge, cfg, currentValue, name, names, s, value;
for (name in config) {
value = config[name];
isObject = value && value.constructor === Object;
meta = isObject && '$value' in value ? value : null;
if (meta) {
isCached = !!meta.cached;
value = meta.$value;
isObject = value && value.constructor === Object;
}
merge = meta && meta.merge;
cfg = configs[name];
if (cfg) {
if (mixinClass) {
merge = cfg.merge;
if (!merge) {
continue;
}
meta = null;
} else {
merge = merge || cfg.merge;
}
if (!mixinClass && isCached && !cachedConfigs[name]) {
Ext.Error.raise('Redefining config as cached: ' + name + ' in class: ' + Cls.$className);
}
currentValue = values[name];
if (merge) {
value = merge.call(cfg, value, currentValue, Cls, mixinClass);
} else if (isObject) {
if (currentValue && currentValue.constructor === Object) {
value = ExtObject.merge({}, currentValue, value);
}
}
} else
{
if (mixinConfigs) {
cfg = mixinConfigs[name];
meta = null;
} else {
cfg = ExtConfig.get(name);
}
configs[name] = cfg;
if (cfg.cached || isCached) {
cachedConfigs[name] = true;
}
names = cfg.names;
if (!prototype[s = names.get]) {
prototype[s] = cfg.getGetter();
}
if (!prototype[s = names.set]) {
prototype[s] = cfg.getSetter();
}
}
if (meta) {
if (cfg.owner !== Cls) {
configs[name] = cfg = Ext.Object.chain(cfg);
cfg.owner = Cls;
}
Ext.apply(cfg, meta);
delete cfg.$value;
}
if (!me.needsFork && value && (value.constructor === Object || value instanceof Array)) {
me.needsFork = true;
}
if (value !== null) {
initMap[name] = true;
} else {
if (prototype.$configPrefixed) {
prototype[configs[name].names.internal] = null;
} else {
prototype[configs[name].name] = null;
}
if (name in initMap) {
initMap[name] = false;
}
}
values[name] = value;
}
},
configure: function(instance, instanceConfig) {
var me = this,
configs = me.configs,
initMap = me.initMap,
initListMap = me.initListMap,
initList = me.initList,
prototype = me.cls.prototype,
values = me.values,
remaining = 0,
firstInstance = !initList,
cachedInitList, cfg, getter, needsInit, i, internalName, ln, names, name, value, isCached, valuesKey;
values = me.needsFork ? ExtObject.fork(values) : ExtObject.chain(values);
if (firstInstance) {
me.initList = initList = [];
me.initListMap = initListMap = {};
instance.isFirstInstance = true;
for (name in initMap) {
needsInit = initMap[name];
cfg = configs[name];
isCached = cfg.cached;
if (needsInit) {
names = cfg.names;
value = values[name];
if (!prototype[names.set].$isDefault || prototype[names.apply] || prototype[names.update] || typeof value === 'object') {
if (isCached) {
(cachedInitList || (cachedInitList = [])).push(cfg);
} else {
initList.push(cfg);
initListMap[name] = true;
}
instance[names.get] = cfg.initGetter || cfg.getInitGetter();
} else {
prototype[cfg.getInternalName(prototype)] = value;
}
} else if (isCached) {
prototype[cfg.getInternalName(prototype)] = undefined;
}
}
}
ln = cachedInitList && cachedInitList.length;
if (ln) {
for (i = 0; i < ln; ++i) {
internalName = cachedInitList[i].getInternalName(prototype);
instance[internalName] = null;
}
for (i = 0; i < ln; ++i) {
names = (cfg = cachedInitList[i]).names;
getter = names.get;
if (instance.hasOwnProperty(getter)) {
instance[names.set](values[cfg.name]);
delete instance[getter];
}
}
for (i = 0; i < ln; ++i) {
internalName = cachedInitList[i].getInternalName(prototype);
prototype[internalName] = instance[internalName];
delete instance[internalName];
}
}
if (instanceConfig && instanceConfig.platformConfig) {
instanceConfig = me.resolvePlatformConfig(instance, instanceConfig);
}
if (firstInstance) {
if (instance.afterCachedConfig && !instance.afterCachedConfig.$nullFn) {
instance.afterCachedConfig(instanceConfig);
}
}
instance.isConfiguring = true;
instance.config = values;
for (i = 0 , ln = initList.length; i < ln; ++i) {
cfg = initList[i];
instance[cfg.names.get] = cfg.initGetter || cfg.getInitGetter();
}
if (instance.transformInstanceConfig) {
instanceConfig = instance.transformInstanceConfig(instanceConfig);
}
if (instanceConfig) {
for (name in instanceConfig) {
value = instanceConfig[name];
cfg = configs[name];
if (!cfg) {
if (instance.$configStrict && typeof instance.self.prototype[name] === 'function') {
Ext.Error.raise("Cannot override method " + name + " on " + instance.$className + " instance.");
}
instance[name] = value;
} else {
if (!cfg.lazy) {
++remaining;
}
if (!initListMap[name]) {
instance[cfg.names.get] = cfg.initGetter || cfg.getInitGetter();
}
if (cfg.merge) {
value = cfg.merge(value, values[name], instance);
} else if (value && value.constructor === Object) {
valuesKey = values[name];
if (valuesKey && valuesKey.constructor === Object) {
value = ExtObject.merge(values[name], value);
} else {
value = Ext.clone(value);
}
}
}
values[name] = value;
}
}
if (instance.beforeInitConfig && !instance.beforeInitConfig.$nullFn) {
if (instance.beforeInitConfig(instanceConfig) === false) {
return;
}
}
if (instanceConfig) {
for (name in instanceConfig) {
if (!remaining) {
break;
}
cfg = configs[name];
if (cfg && !cfg.lazy) {
--remaining;
names = cfg.names;
getter = names.get;
if (instance.hasOwnProperty(getter)) {
instance[names.set](values[name]);
delete instance[names.get];
}
}
}
}
for (i = 0 , ln = initList.length; i < ln; ++i) {
cfg = initList[i];
names = cfg.names;
getter = names.get;
if (!cfg.lazy && instance.hasOwnProperty(getter)) {
instance[names.set](values[cfg.name]);
delete instance[getter];
}
}
delete instance.isConfiguring;
},
getCurrentConfig: function(instance) {
var defaultConfig = instance.defaultConfig,
config = {},
name;
for (name in defaultConfig) {
config[name] = instance[configPropMap[name].names.get]();
}
return config;
},
merge: function(instance, baseConfig, config) {
var configs = this.configs,
name, value, baseValue, cfg;
for (name in config) {
value = config[name];
cfg = configs[name];
if (cfg) {
if (cfg.merge) {
value = cfg.merge(value, baseConfig[name], instance);
} else if (value && value.constructor === Object) {
baseValue = baseConfig[name];
if (baseValue && baseValue.constructor === Object) {
value = Ext.Object.merge(baseValue, value);
} else {
value = Ext.clone(value);
}
}
}
baseConfig[name] = value;
}
return baseConfig;
},
reconfigure: function(instance, instanceConfig, options) {
var currentConfig = instance.config,
configList = [],
strict = instance.$configStrict,
configs = this.configs,
defaults = options && options.defaults,
applyProps = options && options.strict === false,
cfg, getter, i, len, name, names, setter;
for (name in instanceConfig) {
if (defaults && instance.hasOwnProperty(name)) {
continue;
}
currentConfig[name] = instanceConfig[name];
cfg = configs[name];
if (cfg) {
instance[cfg.names.get] = cfg.initGetter || cfg.getInitGetter();
} else if (strict) {
if (name !== 'type') {
Ext.log.error('No such config "' + name + '" for class ' + instance.$className);
}
continue;
}
configList.push(name);
}
for (i = 0 , len = configList.length; i < len; i++) {
name = configList[i];
cfg = configs[name];
if (cfg) {
names = cfg.names;
getter = names.get;
if (instance.hasOwnProperty(getter)) {
instance[names.set](instanceConfig[name]);
delete instance[getter];
}
} else {
cfg = configPropMap[name] || Ext.Config.get(name);
names = cfg.names;
if (instance[names.set]) {
instance[names.set](instanceConfig[name]);
} else if (applyProps) {
if (instance.$configStrict && typeof instance.self.prototype[name] === 'function') {
Ext.Error.raise("Cannot override method " + name + " on " + instance.$className + " instance.");
}
instance[name] = instanceConfig[name];
} else if (name !== 'type') {
Ext.Error.raise('Config "' + name + '" has no setter on class ' + instance.$className);
}
}
}
},
resolvePlatformConfig: function(instance, instanceConfig) {
var platformConfig = instanceConfig && instanceConfig.platformConfig,
ret = instanceConfig,
i, keys, n;
if (platformConfig) {
keys = Ext.getPlatformConfigKeys(platformConfig);
n = keys.length;
if (n) {
ret = Ext.merge({}, ret);
for (i = 0 , n = keys.length; i < n; ++i) {
this.merge(instance, ret, platformConfig[keys[i]]);
}
}
}
return ret;
}
};
}());
Ext.Base = (function(flexSetter) {
var noArgs = [],
baseStaticMember,
baseStaticMembers = [],
getConfig = function(name, peek) {
var me = this,
ret, cfg, getterName;
if (name) {
cfg = Ext.Config.map[name];
if (!cfg) {
Ext.Logger.error("Invalid property name for getter: '" + name + "' for '" + me.$className + "'.");
}
getterName = cfg.names.get;
if (peek && me.hasOwnProperty(getterName)) {
ret = me.config[name];
} else {
ret = me[getterName]();
}
} else {
ret = me.getCurrentConfig();
}
return ret;
},
makeDeprecatedMethod = function(oldName, newName, msg) {
var message = '"' + oldName + '" is deprecated.';
if (msg) {
message += ' ' + msg;
} else if (newName) {
message += ' Please use "' + newName + '" instead.';
}
return function() {
Ext.Error.raise(message);
};
},
addDeprecatedProperty = function(object, oldName, newName, message) {
if (!message) {
message = '"' + oldName + '" is deprecated.';
}
if (newName) {
message += ' Please use "' + newName + '" instead.';
}
if (message) {
Ext.Object.defineProperty(object, oldName, {
get: function() {
Ext.Error.raise(message);
},
set: function(value) {
Ext.Error.raise(message);
},
configurable: true
});
}
},
makeAliasFn = function(name) {
return function() {
return this[name].apply(this, arguments);
};
},
Version = Ext.Version,
leadingDigitRe = /^\d/,
oneMember = {},
aliasOneMember = {},
Base = function() {},
BasePrototype = Base.prototype;
Ext.apply(Base, {
$className: 'Ext.Base',
$isClass: true,
create: function() {
return Ext.create.apply(Ext, [
this
].concat(Array.prototype.slice.call(arguments, 0)));
},
addDeprecations: function(deprecations) {
var me = this,
all = [],
compatVersion = Ext.getCompatVersion(deprecations.name),
displayName = (me.$className || '') + '#',
deprecate, versionSpec, index, message, target, enabled, existing, fn, names, oldName, newName, member, statics, version;
for (versionSpec in deprecations) {
if (leadingDigitRe.test(versionSpec)) {
version = new Ext.Version(versionSpec);
version.deprecations = deprecations[versionSpec];
all.push(version);
}
}
all.sort(Version.compare);
for (index = all.length; index--; ) {
deprecate = (version = all[index]).deprecations;
target = me.prototype;
statics = deprecate.statics;
enabled = compatVersion && compatVersion.lt(version);
if (!enabled) {} else if (!enabled) {
break;
}
while (deprecate) {
names = deprecate.methods;
if (names) {
for (oldName in names) {
member = names[oldName];
fn = null;
if (!member) {
Ext.Assert.isNotDefinedProp(target, oldName);
fn = makeDeprecatedMethod(displayName + oldName);
} else if (Ext.isString(member)) {
Ext.Assert.isNotDefinedProp(target, oldName);
Ext.Assert.isDefinedProp(target, member);
if (enabled) {
fn = makeAliasFn(member);
} else {
fn = makeDeprecatedMethod(displayName + oldName, member);
}
} else {
message = '';
if (member.message || member.fn) {
message = member.message;
member = member.fn;
}
existing = target.hasOwnProperty(oldName) && target[oldName];
if (enabled && member) {
member.$owner = me;
member.$name = oldName;
member.name = displayName + oldName;
if (existing) {
member.$previous = existing;
}
fn = member;
} else if (!existing) {
fn = makeDeprecatedMethod(displayName + oldName, null, message);
}
}
if (fn) {
target[oldName] = fn;
}
}
}
names = deprecate.properties;
if (names && !enabled) {
for (oldName in names) {
newName = names[oldName];
if (Ext.isString(newName)) {
addDeprecatedProperty(target, displayName + oldName, newName);
} else if (newName && newName.message) {
addDeprecatedProperty(target, displayName + oldName, null, newName.message);
} else {
addDeprecatedProperty(target, displayName + oldName);
}
}
}
deprecate = statics;
statics = null;
target = me;
}
}
},
extend: function(parent) {
var me = this,
parentPrototype = parent.prototype,
prototype, i, ln, name, statics;
prototype = me.prototype = Ext.Object.chain(parentPrototype);
prototype.self = me;
me.superclass = prototype.superclass = parentPrototype;
if (!parent.$isClass) {
for (i in BasePrototype) {
if (i in prototype) {
prototype[i] = BasePrototype[i];
}
}
}
statics = parentPrototype.$inheritableStatics;
if (statics) {
for (i = 0 , ln = statics.length; i < ln; i++) {
name = statics[i];
if (!me.hasOwnProperty(name)) {
me[name] = parent[name];
}
}
}
if (parent.$onExtended) {
me.$onExtended = parent.$onExtended.slice();
}
me.getConfigurator();
},
$onExtended: [],
triggerExtended: function() {
Ext.classSystemMonitor && Ext.classSystemMonitor(this, 'Ext.Base#triggerExtended', arguments);
var callbacks = this.$onExtended,
ln = callbacks.length,
i, callback;
if (ln > 0) {
for (i = 0; i < ln; i++) {
callback = callbacks[i];
callback.fn.apply(callback.scope || this, arguments);
}
}
},
onExtended: function(fn, scope) {
this.$onExtended.push({
fn: fn,
scope: scope
});
return this;
},
addStatics: function(members) {
this.addMembers(members, true);
return this;
},
addInheritableStatics: function(members) {
var inheritableStatics, hasInheritableStatics,
prototype = this.prototype,
name, member;
inheritableStatics = prototype.$inheritableStatics;
hasInheritableStatics = prototype.$hasInheritableStatics;
if (!inheritableStatics) {
inheritableStatics = prototype.$inheritableStatics = [];
hasInheritableStatics = prototype.$hasInheritableStatics = {};
}
var className = Ext.getClassName(this) + '.';
for (name in members) {
if (members.hasOwnProperty(name)) {
member = members[name];
if (typeof member == 'function') {
member.name = className + name;
}
this[name] = member;
if (!hasInheritableStatics[name]) {
hasInheritableStatics[name] = true;
inheritableStatics.push(name);
}
}
}
return this;
},
addMembers: function(members, isStatic, privacy) {
var me = this,
cloneFunction = Ext.Function.clone,
target = isStatic ? me : me.prototype,
defaultConfig = !isStatic && target.defaultConfig,
enumerables = Ext.enumerables,
privates = members.privates,
configs, i, ln, member, name, subPrivacy, privateStatics;
var displayName = (me.$className || '') + '#';
if (privates) {
delete members.privates;
if (!isStatic) {
privateStatics = privates.statics;
delete privates.statics;
}
subPrivacy = privates.privacy || privacy || 'framework';
me.addMembers(privates, isStatic, subPrivacy);
if (privateStatics) {
me.addMembers(privateStatics, true, subPrivacy);
}
}
for (name in members) {
if (members.hasOwnProperty(name)) {
member = members[name];
if (privacy === true) {
privacy = 'framework';
}
if (member && member.$nullFn && privacy !== member.$privacy) {
Ext.Error.raise('Cannot use stock function for private method ' + (me.$className ? me.$className + '#' : '') + name);
}
if (typeof member === 'function' && !member.$isClass && !member.$nullFn) {
if (member.$owner) {
member = cloneFunction(member);
}
if (target.hasOwnProperty(name)) {
member.$previous = target[name];
}
member.$owner = me;
member.$name = name;
member.name = displayName + name;
var existing = target[name];
if (privacy) {
member.$privacy = privacy;
if (existing && existing.$privacy && existing.$privacy !== privacy) {
Ext.privacyViolation(me, existing, member, isStatic);
}
} else if (existing && existing.$privacy) {
Ext.privacyViolation(me, existing, member, isStatic);
}
}
else if (defaultConfig && (name in defaultConfig) && !target.config.hasOwnProperty(name)) {
(configs || (configs = {}))[name] = member;
continue;
}
target[name] = member;
}
}
if (configs) {
me.addConfig(configs);
}
if (enumerables) {
for (i = 0 , ln = enumerables.length; i < ln; ++i) {
if (members.hasOwnProperty(name = enumerables[i])) {
member = members[name];
if (member && !member.$nullFn) {
if (member.$owner) {
member = cloneFunction(member);
}
member.$owner = me;
member.$name = name;
member.name = displayName + name;
if (target.hasOwnProperty(name)) {
member.$previous = target[name];
}
}
target[name] = member;
}
}
}
return this;
},
addMember: function(name, member) {
oneMember[name] = member;
this.addMembers(oneMember);
delete oneMember[name];
return this;
},
borrow: function(fromClass, members) {
Ext.classSystemMonitor && Ext.classSystemMonitor(this, 'Ext.Base#borrow', arguments);
var prototype = fromClass.prototype,
membersObj = {},
i, ln, name;
members = Ext.Array.from(members);
for (i = 0 , ln = members.length; i < ln; i++) {
name = members[i];
membersObj[name] = prototype[name];
}
return this.addMembers(membersObj);
},
override: function(members) {
var me = this,
statics = members.statics,
inheritableStatics = members.inheritableStatics,
config = members.config,
mixins = members.mixins,
cachedConfig = members.cachedConfig;
if (statics || inheritableStatics || config) {
members = Ext.apply({}, members);
}
if (statics) {
me.addMembers(statics, true);
delete members.statics;
}
if (inheritableStatics) {
me.addInheritableStatics(inheritableStatics);
delete members.inheritableStatics;
}
if (config) {
me.addConfig(config);
delete members.config;
}
if (cachedConfig) {
me.addCachedConfig(cachedConfig);
delete members.cachedConfig;
}
delete members.mixins;
me.addMembers(members);
if (mixins) {
me.mixin(mixins);
}
return me;
},
callParent: function(args) {
var method;
return (method = this.callParent.caller) && (method.$previous || ((method = method.$owner ? method : method.caller) && method.$owner.superclass.self[method.$name])).apply(this, args || noArgs);
},
callSuper: function(args) {
var method;
return (method = this.callSuper.caller) && ((method = method.$owner ? method : method.caller) && method.$owner.superclass.self[method.$name]).apply(this, args || noArgs);
},
mixin: function(name, mixinClass) {
var me = this,
mixin, prototype, key, statics, i, ln, staticName, mixinValue, mixins;
if (typeof name !== 'string') {
mixins = name;
if (mixins instanceof Array) {
for (i = 0 , ln = mixins.length; i < ln; i++) {
mixin = mixins[i];
me.mixin(mixin.prototype.mixinId || mixin.$className, mixin);
}
} else {
for (var mixinName in mixins) {
me.mixin(mixinName, mixins[mixinName]);
}
}
return;
}
mixin = mixinClass.prototype;
prototype = me.prototype;
if (mixin.onClassMixedIn) {
mixin.onClassMixedIn.call(mixinClass, me);
}
if (!prototype.hasOwnProperty('mixins')) {
if ('mixins' in prototype) {
prototype.mixins = Ext.Object.chain(prototype.mixins);
} else {
prototype.mixins = {};
}
}
for (key in mixin) {
mixinValue = mixin[key];
if (key === 'mixins') {
Ext.applyIf(prototype.mixins, mixinValue);
} else if (!(key === 'mixinId' || key === 'config') && (prototype[key] === undefined)) {
prototype[key] = mixinValue;
}
}
statics = mixin.$inheritableStatics;
if (statics) {
for (i = 0 , ln = statics.length; i < ln; i++) {
staticName = statics[i];
if (!me.hasOwnProperty(staticName)) {
me[staticName] = mixinClass[staticName];
}
}
}
if ('config' in mixin) {
me.addConfig(mixin.config, mixinClass);
}
prototype.mixins[name] = mixin;
if (mixin.afterClassMixedIn) {
mixin.afterClassMixedIn.call(mixinClass, me);
}
return me;
},
addConfig: function(config, mixinClass) {
var cfg = this.$config || this.getConfigurator();
cfg.add(config, mixinClass);
},
addCachedConfig: function(config, isMixin) {
var cached = {},
key;
for (key in config) {
cached[key] = {
cached: true,
$value: config[key]
};
}
this.addConfig(cached, isMixin);
},
getConfigurator: function() {
return this.$config || new Ext.Configurator(this);
},
getName: function() {
return Ext.getClassName(this);
},
createAlias: flexSetter(function(alias, origin) {
aliasOneMember[alias] = function() {
return this[origin].apply(this, arguments);
};
this.override(aliasOneMember);
delete aliasOneMember[alias];
})
});
for (baseStaticMember in Base) {
if (Base.hasOwnProperty(baseStaticMember)) {
baseStaticMembers.push(baseStaticMember);
}
}
Base.$staticMembers = baseStaticMembers;
Base.getConfigurator();
Base.addMembers({
$className: 'Ext.Base',
isInstance: true,
$configPrefixed: true,
$configStrict: true,
isConfiguring: false,
isFirstInstance: false,
statics: function() {
var method = this.statics.caller,
self = this.self;
if (!method) {
return self;
}
return method.$owner;
},
callParent: function(args) {
var method,
superMethod = (method = this.callParent.caller) && (method.$previous || ((method = method.$owner ? method : method.caller) && method.$owner.superclass[method.$name]));
if (!superMethod) {
method = this.callParent.caller;
var parentClass, methodName;
if (!method.$owner) {
if (!method.caller) {
throw new Error("Attempting to call a protected method from the public scope, which is not allowed");
}
method = method.caller;
}
parentClass = method.$owner.superclass;
methodName = method.$name;
if (!(methodName in parentClass)) {
throw new Error("this.callParent() was called but there's no such method (" + methodName + ") found in the parent class (" + (Ext.getClassName(parentClass) || 'Object') + ")");
}
}
return superMethod.apply(this, args || noArgs);
},
callSuper: function(args) {
var method,
superMethod = (method = this.callSuper.caller) && ((method = method.$owner ? method : method.caller) && method.$owner.superclass[method.$name]);
if (!superMethod) {
method = this.callSuper.caller;
var parentClass, methodName;
if (!method.$owner) {
if (!method.caller) {
throw new Error("Attempting to call a protected method from the public scope, which is not allowed");
}
method = method.caller;
}
parentClass = method.$owner.superclass;
methodName = method.$name;
if (!(methodName in parentClass)) {
throw new Error("this.callSuper() was called but there's no such method (" + methodName + ") found in the parent class (" + (Ext.getClassName(parentClass) || 'Object') + ")");
}
}
return superMethod.apply(this, args || noArgs);
},
self: Base,
constructor: function() {
return this;
},
getConfigurator: function() {
return this.$config || this.self.getConfigurator();
},
initConfig: function(instanceConfig) {
var me = this,
cfg = me.getConfigurator();
me.initConfig = Ext.emptyFn;
me.initialConfig = instanceConfig || {};
cfg.configure(me, instanceConfig);
return me;
},
beforeInitConfig: Ext.emptyFn,
getConfig: getConfig,
setConfig: function(name, value,
options) {
var me = this,
config;
if (name) {
if (typeof name === 'string') {
config = {};
config[name] = value;
} else {
config = name;
}
me.getConfigurator().reconfigure(me, config, options);
}
return me;
},
getCurrentConfig: function() {
var cfg = this.getConfigurator();
return cfg.getCurrentConfig(this);
},
hasConfig: function(name) {
return name in this.defaultConfig;
},
getInitialConfig: function(name) {
var config = this.config;
if (!name) {
return config;
}
return config[name];
},
$links: null,
link: function(name, value) {
var me = this,
links = me.$links || (me.$links = {});
links[name] = true;
me[name] = value;
return value;
},
unlink: function(names) {
var me = this,
i, ln, link, value;
if (!Ext.isArray(names)) {
Ext.Error.raise('Invalid argument - expected array of strings');
}
for (i = 0 , ln = names.length; i < ln; i++) {
link = names[i];
value = me[link];
if (value) {
if (value.isInstance && !value.isDestroyed) {
value.destroy();
} else if (value.parentNode && 'nodeType' in value) {
value.parentNode.removeChild(value);
}
}
me[link] = null;
}
return me;
},
destroy: function() {
var me = this,
links = me.$links;
me.destroy = Ext.emptyFn;
me.isDestroyed = true;
if (links) {
me.$links = null;
me.unlink(Ext.Object.getKeys(links));
}
}
});
BasePrototype.callOverridden = BasePrototype.callParent;
Ext.privacyViolation = function(cls, existing, member, isStatic) {
var name = member.$name,
conflictCls = existing.$owner && existing.$owner.$className,
s = isStatic ? 'static ' : '',
msg = member.$privacy ? 'Private ' + s + member.$privacy + ' method "' + name + '"' : 'Public ' + s + 'method "' + name + '"';
if (cls.$className) {
msg = cls.$className + ': ' + msg;
}
if (!existing.$privacy) {
msg += conflictCls ? ' hides public method inherited from ' + conflictCls : ' hides inherited public method.';
} else {
msg += conflictCls ? ' conflicts with private ' + existing.$privacy + ' method declared by ' + conflictCls : ' conflicts with inherited private ' + existing.$privacy + ' method.';
}
var compat = Ext.getCompatVersion();
var ver = Ext.getVersion();
if (ver && compat && compat.lt(ver)) {
Ext.log.error(msg);
} else {
Ext.Error.raise(msg);
}
};
return Base;
}(Ext.Function.flexSetter));
(function(Cache, prototype) {
(Ext.util || (Ext.util = {})).Cache = Cache = function(config) {
var me = this,
head;
if (config) {
Ext.apply(me, config);
}
me.head = head = {
id: (me.seed = 0),
key: null,
value: null
};
me.map = {};
head.next = head.prev = head;
};
Cache.prototype = prototype = {
maxSize: 100,
count: 0,
clear: function() {
var me = this,
head = me.head,
entry = head.next;
head.next = head.prev = head;
if (!me.evict.$nullFn) {
for (; entry !== head; entry = entry.next) {
me.evict(entry.key, entry.value);
}
}
me.count = 0;
},
each: function(fn, scope) {
scope = scope || this;
for (var head = this.head,
ent = head.next; ent !== head; ent = ent.next) {
if (fn.call(scope, ent.key, ent.value)) {
break;
}
}
},
get: function(key) {
var me = this,
head = me.head,
map = me.map,
entry = map[key];
if (entry) {
if (entry.prev !== head) {
me.unlinkEntry(entry);
me.linkEntry(entry);
}
} else {
map[key] = entry = {
id: ++me.seed,
key: key,
value: me.miss.apply(me, arguments)
};
me.linkEntry(entry);
++me.count;
while (me.count > me.maxSize) {
me.unlinkEntry(head.prev, true);
--me.count;
}
}
return entry.value;
},
evict: Ext.emptyFn,
linkEntry: function(entry) {
var head = this.head,
first = head.next;
entry.next = first;
entry.prev = head;
head.next = entry;
first.prev = entry;
},
unlinkEntry: function(entry, evicted) {
var next = entry.next,
prev = entry.prev;
prev.next = next;
next.prev = prev;
if (evicted) {
this.evict(entry.key, entry.value);
}
}
};
prototype.destroy = prototype.clear;
}());
(function() {
var ExtClass,
Base = Ext.Base,
baseStaticMembers = Base.$staticMembers,
ruleKeySortFn = function(a, b) {
return (a.length - b.length) || ((a < b) ? -1 : ((a > b) ? 1 : 0));
};
function makeCtor(className) {
function constructor() {
return this.constructor.apply(this, arguments) || null;
}
if (className) {
constructor.name = className;
}
return constructor;
}
Ext.Class = ExtClass = function(Class, data, onCreated) {
if (typeof Class != 'function') {
onCreated = data;
data = Class;
Class = null;
}
if (!data) {
data = {};
}
Class = ExtClass.create(Class, data);
ExtClass.process(Class, data, onCreated);
return Class;
};
Ext.apply(ExtClass, {
makeCtor: makeCtor,
onBeforeCreated: function(Class, data, hooks) {
Ext.classSystemMonitor && Ext.classSystemMonitor(Class, '>> Ext.Class#onBeforeCreated', arguments);
Class.addMembers(data);
hooks.onCreated.call(Class, Class);
Ext.classSystemMonitor && Ext.classSystemMonitor(Class, '<< Ext.Class#onBeforeCreated', arguments);
},
create: function(Class, data) {
var i = baseStaticMembers.length,
name;
if (!Class) {
Class = makeCtor(data.$className);
}
while (i--) {
name = baseStaticMembers[i];
Class[name] = Base[name];
}
return Class;
},
process: function(Class, data, onCreated) {
var preprocessorStack = data.preprocessors || ExtClass.defaultPreprocessors,
registeredPreprocessors = this.preprocessors,
hooks = {
onBeforeCreated: this.onBeforeCreated
},
preprocessors = [],
preprocessor, preprocessorsProperties, i, ln, j, subLn, preprocessorProperty;
delete data.preprocessors;
Class._classHooks = hooks;
for (i = 0 , ln = preprocessorStack.length; i < ln; i++) {
preprocessor = preprocessorStack[i];
if (typeof preprocessor == 'string') {
preprocessor = registeredPreprocessors[preprocessor];
preprocessorsProperties = preprocessor.properties;
if (preprocessorsProperties === true) {
preprocessors.push(preprocessor.fn);
} else if (preprocessorsProperties) {
for (j = 0 , subLn = preprocessorsProperties.length; j < subLn; j++) {
preprocessorProperty = preprocessorsProperties[j];
if (data.hasOwnProperty(preprocessorProperty)) {
preprocessors.push(preprocessor.fn);
break;
}
}
}
} else {
preprocessors.push(preprocessor);
}
}
hooks.onCreated = onCreated ? onCreated : Ext.emptyFn;
hooks.preprocessors = preprocessors;
this.doProcess(Class, data, hooks);
},
doProcess: function(Class, data, hooks) {
var me = this,
preprocessors = hooks.preprocessors,
preprocessor = preprocessors.shift(),
doProcess = me.doProcess;
for (; preprocessor; preprocessor = preprocessors.shift()) {
if (preprocessor.call(me, Class, data, hooks, doProcess) === false) {
return;
}
}
hooks.onBeforeCreated.apply(me, arguments);
},
preprocessors: {},
registerPreprocessor: function(name, fn, properties, position, relativeTo) {
if (!position) {
position = 'last';
}
if (!properties) {
properties = [
name
];
}
this.preprocessors[name] = {
name: name,
properties: properties || false,
fn: fn
};
this.setDefaultPreprocessorPosition(name, position, relativeTo);
return this;
},
getPreprocessor: function(name) {
return this.preprocessors[name];
},
getPreprocessors: function() {
return this.preprocessors;
},
defaultPreprocessors: [],
getDefaultPreprocessors: function() {
return this.defaultPreprocessors;
},
setDefaultPreprocessors: function(preprocessors) {
this.defaultPreprocessors = Ext.Array.from(preprocessors);
return this;
},
setDefaultPreprocessorPosition: function(name, offset, relativeName) {
var defaultPreprocessors = this.defaultPreprocessors,
index;
if (typeof offset == 'string') {
if (offset === 'first') {
defaultPreprocessors.unshift(name);
return this;
} else if (offset === 'last') {
defaultPreprocessors.push(name);
return this;
}
offset = (offset === 'after') ? 1 : -1;
}
index = Ext.Array.indexOf(defaultPreprocessors, relativeName);
if (index !== -1) {
Ext.Array.splice(defaultPreprocessors, Math.max(0, index + offset), 0, name);
}
return this;
}
});
ExtClass.registerPreprocessor('extend', function(Class, data, hooks) {
Ext.classSystemMonitor && Ext.classSystemMonitor(Class, 'Ext.Class#extendPreProcessor', arguments);
var Base = Ext.Base,
basePrototype = Base.prototype,
extend = data.extend,
Parent, parentPrototype, i;
delete data.extend;
if (extend && extend !== Object) {
Parent = extend;
} else {
Parent = Base;
}
parentPrototype = Parent.prototype;
if (!Parent.$isClass) {
for (i in basePrototype) {
if (!parentPrototype[i]) {
parentPrototype[i] = basePrototype[i];
}
}
}
Class.extend(Parent);
Class.triggerExtended.apply(Class, arguments);
if (data.onClassExtended) {
Class.onExtended(data.onClassExtended, Class);
delete data.onClassExtended;
}
}, true);
ExtClass.registerPreprocessor('privates', function(Class, data) {
Ext.classSystemMonitor && Ext.classSystemMonitor(Class, 'Ext.Class#privatePreprocessor', arguments);
var privates = data.privates,
statics = privates.statics,
privacy = privates.privacy || true;
delete data.privates;
delete privates.statics;
Class.addMembers(privates, false, privacy);
if (statics) {
Class.addMembers(statics, true, privacy);
}
});
ExtClass.registerPreprocessor('statics', function(Class, data) {
Ext.classSystemMonitor && Ext.classSystemMonitor(Class, 'Ext.Class#staticsPreprocessor', arguments);
Class.addStatics(data.statics);
delete data.statics;
});
ExtClass.registerPreprocessor('inheritableStatics', function(Class, data) {
Ext.classSystemMonitor && Ext.classSystemMonitor(Class, 'Ext.Class#inheritableStaticsPreprocessor', arguments);
Class.addInheritableStatics(data.inheritableStatics);
delete data.inheritableStatics;
});
Ext.createRuleFn = function(code) {
return new Function('$c', 'with($c) { return (' + code + '); }');
};
Ext.expressionCache = new Ext.util.Cache({
miss: Ext.createRuleFn
});
Ext.ruleKeySortFn = ruleKeySortFn;
Ext.getPlatformConfigKeys = function(platformConfig) {
var ret = [],
platform, rule;
for (platform in platformConfig) {
rule = Ext.expressionCache.get(platform);
if (rule(Ext.platformTags)) {
ret.push(platform);
}
}
ret.sort(ruleKeySortFn);
return ret;
};
ExtClass.registerPreprocessor('platformConfig', function(Class, data, hooks) {
var platformConfigs = data.platformConfig,
config = data.config,
added, classConfigs, configs, configurator, hoisted, keys, name, value, platform, theme, platformConfig, i, ln, j, ln2, themeName;
delete data.platformConfig;
if (platformConfigs instanceof Array) {
config = config || {};
themeName = (Ext.theme || (Ext.theme = {
name: 'Default'
})).name;
for (i = 0 , ln = platformConfigs.length; i < ln; i++) {
platformConfig = platformConfigs[i];
platform = platformConfig.platform;
delete platformConfig.platform;
theme = [].concat(platformConfig.theme);
ln2 = theme.length;
delete platformConfig.theme;
if (platform && Ext.filterPlatform(platform)) {
Ext.merge(config, platformConfig);
}
if (ln2) {
for (j = 0; j < ln2; j++) {
if (themeName === theme[j]) {
Ext.merge(config, platformConfig);
}
}
}
}
} else {
configurator = Class.getConfigurator();
classConfigs = configurator.configs;
keys = Ext.getPlatformConfigKeys(platformConfigs);
for (i = 0 , ln = keys.length; i < ln; ++i) {
configs = platformConfigs[keys[i]];
hoisted = added = null;
for (name in configs) {
value = configs[name];
if (config && name in config) {
(added || (added = {}))[name] = value;
(hoisted || (hoisted = {}))[name] = config[name];
delete config[name];
} else if (name in classConfigs) {
(added || (added = {}))[name] = value;
} else {
data[name] = value;
}
}
if (hoisted) {
configurator.add(hoisted);
}
if (added) {
configurator.add(added);
}
}
}
});
ExtClass.registerPreprocessor('config', function(Class, data) {
if (data.hasOwnProperty('$configPrefixed')) {
Class.prototype.$configPrefixed = data.$configPrefixed;
}
Class.addConfig(data.config);
delete data.config;
});
ExtClass.registerPreprocessor('cachedConfig', function(Class, data) {
if (data.hasOwnProperty('$configPrefixed')) {
Class.prototype.$configPrefixed = data.$configPrefixed;
}
Class.addCachedConfig(data.cachedConfig);
delete data.cachedConfig;
});
ExtClass.registerPreprocessor('mixins', function(Class, data, hooks) {
Ext.classSystemMonitor && Ext.classSystemMonitor(Class, 'Ext.Class#mixinsPreprocessor', arguments);
var mixins = data.mixins,
onCreated = hooks.onCreated;
delete data.mixins;
hooks.onCreated = function() {
Ext.classSystemMonitor && Ext.classSystemMonitor(Class, 'Ext.Class#mixinsPreprocessor#beforeCreated', arguments);
hooks.onCreated = onCreated;
Class.mixin(mixins);
return hooks.onCreated.apply(this, arguments);
};
});
Ext.extend = function(Class, Parent, members) {
Ext.classSystemMonitor && Ext.classSystemMonitor(Class, 'Ext.Class#extend-backwards-compatible', arguments);
if (arguments.length === 2 && Ext.isObject(Parent)) {
members = Parent;
Parent = Class;
Class = null;
}
var cls;
if (!Parent) {
throw new Error("[Ext.extend] Attempting to extend from a class which has not been loaded on the page.");
}
members.extend = Parent;
members.preprocessors = [
'extend',
'statics',
'inheritableStatics',
'mixins',
'platformConfig',
'config'
];
if (Class) {
cls = new ExtClass(Class, members);
cls.prototype.constructor = Class;
} else {
cls = new ExtClass(members);
}
cls.prototype.override = function(o) {
for (var m in o) {
if (o.hasOwnProperty(m)) {
this[m] = o[m];
}
}
};
return cls;
};
}());
Ext.Inventory = function() {
var me = this;
me.names = [];
me.paths = {};
me.alternateToName = {};
me.aliasToName = {};
me.nameToAliases = {};
me.nameToAlternates = {};
};
Ext.Inventory.prototype = {
_array1: [
0
],
prefixes: null,
dotRe: /\./g,
wildcardRe: /\*/g,
addAlias: function(className, alias) {
return this.addMapping(className, alias, this.aliasToName, this.nameToAliases);
},
addAlternate: function(className, alternate) {
return this.addMapping(className, alternate, this.alternateToName, this.nameToAlternates);
},
addMapping: function(className, alternate, toName, nameTo) {
var name = className.$className || className,
mappings = name,
array = this._array1,
a, aliases, cls, i, length, nameMapping;
if (Ext.isString(name)) {
mappings = {};
mappings[name] = alternate;
}
for (cls in mappings) {
aliases = mappings[cls];
if (Ext.isString(aliases)) {
array[0] = aliases;
aliases = array;
}
length = aliases.length;
nameMapping = nameTo[cls] || (nameTo[cls] = []);
for (i = 0; i < length; ++i) {
if (!(a = aliases[i])) {
continue;
}
if (toName[a] !== cls) {
if (toName[a]) {
Ext.log.warn("Overriding existing mapping: '" + a + "' From '" + toName[a] + "' to '" + cls + "'. Is this intentional?");
}
toName[a] = cls;
nameMapping.push(a);
}
}
}
},
getAliasesByName: function(name) {
return this.nameToAliases[name] || null;
},
getAlternatesByName: function(name) {
return this.nameToAlternates[name] || null;
},
getNameByAlias: function(alias) {
return this.aliasToName[alias] || '';
},
getNameByAlternate: function(alternate) {
return this.alternateToName[alternate] || '';
},
getNamesByExpression: function(expression, exclude, accumulate) {
var me = this,
aliasToName = me.aliasToName,
alternateToName = me.alternateToName,
nameToAliases = me.nameToAliases,
nameToAlternates = me.nameToAlternates,
map = accumulate ? exclude : {},
names = [],
expressions = Ext.isString(expression) ? [
expression
] : expression,
length = expressions.length,
wildcardRe = me.wildcardRe,
expr, i, list, match, n, name, regex;
for (i = 0; i < length; ++i) {
if ((expr = expressions[i]).indexOf('*') < 0) {
if (!(name = aliasToName[expr])) {
if (!(name = alternateToName[expr])) {
name = expr;
}
}
if (!(name in map) && !(exclude && (name in exclude))) {
map[name] = 1;
names.push(name);
}
} else {
regex = new RegExp('^' + expr.replace(wildcardRe, '(.*?)') + '$');
for (name in nameToAliases) {
if (!(name in map) && !(exclude && (name in exclude))) {
if (!(match = regex.test(name))) {
n = (list = nameToAliases[name]).length;
while (!match && n-- > 0) {
match = regex.test(list[n]);
}
list = nameToAlternates[name];
if (list && !match) {
n = list.length;
while (!match && n-- > 0) {
match = regex.test(list[n]);
}
}
}
if (match) {
map[name] = 1;
names.push(name);
}
}
}
}
}
return names;
},
getPath: function(className) {
var me = this,
paths = me.paths,
ret = '',
prefix;
if (className in paths) {
ret = paths[className];
} else {
prefix = me.getPrefix(className);
if (prefix) {
className = className.substring(prefix.length + 1);
ret = paths[prefix];
if (ret) {
ret += '/';
}
}
ret += className.replace(me.dotRe, '/') + '.js';
}
return ret;
},
getPrefix: function(className) {
if (className in this.paths) {
return className;
}
var prefixes = this.getPrefixes(),
i = prefixes.length,
length, prefix;
while (i-- > 0) {
length = (prefix = prefixes[i]).length;
if (length < className.length && className.charAt(length) === '.' && prefix === className.substring(0, length)) {
return prefix;
}
}
return '';
},
getPrefixes: function() {
var me = this,
prefixes = me.prefixes;
if (!prefixes) {
me.prefixes = prefixes = me.names.slice(0);
prefixes.sort(me._compareNames);
}
return prefixes;
},
removeName: function(name) {
var me = this,
aliasToName = me.aliasToName,
alternateToName = me.alternateToName,
nameToAliases = me.nameToAliases,
nameToAlternates = me.nameToAlternates,
aliases = nameToAliases[name],
alternates = nameToAlternates[name],
i, a;
delete nameToAliases[name];
delete nameToAlternates[name];
if (aliases) {
for (i = aliases.length; i--; ) {
if (name === (a = aliases[i])) {
delete aliasToName[a];
}
}
}
if (alternates) {
for (i = alternates.length; i--; ) {
if (name === (a = alternates[i])) {
delete alternateToName[a];
}
}
}
},
resolveName: function(name) {
var me = this,
trueName;
if (!(name in me.nameToAliases)) {
if (!(trueName = me.aliasToName[name])) {
trueName = me.alternateToName[name];
}
}
return trueName || name;
},
select: function(receiver, scope) {
var me = this,
excludes = {},
ret = {
excludes: excludes,
exclude: function() {
me.getNamesByExpression(arguments, excludes, true);
return this;
}
},
name;
for (name in receiver) {
ret[name] = me.selectMethod(excludes, receiver[name], scope || receiver);
}
return ret;
},
selectMethod: function(excludes, fn, scope) {
var me = this;
return function(include) {
var args = Ext.Array.slice(arguments, 1);
args.unshift(me.getNamesByExpression(include, excludes));
return fn.apply(scope, args);
};
},
setPath: Ext.Function.flexSetter(function(name, path) {
var me = this;
me.paths[name] = path;
me.names.push(name);
me.prefixes = null;
return me;
}),
_compareNames: function(lhs, rhs) {
var cmp = lhs.length - rhs.length;
if (!cmp) {
cmp = (lhs < rhs) ? -1 : 1;
}
return cmp;
}
};
Ext.ClassManager = (function(Class, alias, arraySlice, arrayFrom, global) {
var makeCtor = Ext.Class.makeCtor,
Manager = Ext.apply(new Ext.Inventory(), {
classes: {},
classState: {},
existCache: {},
namespaceRewrites: [
{
from: 'Ext.',
to: Ext
}
],
enableNamespaceParseCache: true,
namespaceParseCache: {},
instantiators: [],
isCreated: function(className) {
var i, ln, part, root, parts;
if (typeof className !== 'string' || className.length < 1) {
throw new Error("[Ext.ClassManager] Invalid classname, must be a string and must not be empty");
}
if (Manager.classes[className] || Manager.existCache[className]) {
return true;
}
root = global;
parts = Manager.parseNamespace(className);
for (i = 0 , ln = parts.length; i < ln; i++) {
part = parts[i];
if (typeof part !== 'string') {
root = part;
} else {
if (!root || !root[part]) {
return false;
}
root = root[part];
}
}
Manager.triggerCreated(className);
return true;
},
createdListeners: [],
nameCreatedListeners: {},
existsListeners: [],
nameExistsListeners: {},
overrideMap: {},
triggerCreated: function(className, state) {
Manager.existCache[className] = state || 1;
Manager.classState[className] += 40;
Manager.notify(className, Manager.createdListeners, Manager.nameCreatedListeners);
},
onCreated: function(fn, scope, className) {
Manager.addListener(fn, scope, className, Manager.createdListeners, Manager.nameCreatedListeners);
},
notify: function(className, listeners, nameListeners) {
var alternateNames = Manager.getAlternatesByName(className),
names = [
className
],
i, ln, j, subLn, listener, name;
for (i = 0 , ln = listeners.length; i < ln; i++) {
listener = listeners[i];
listener.fn.call(listener.scope, className);
}
while (names) {
for (i = 0 , ln = names.length; i < ln; i++) {
name = names[i];
listeners = nameListeners[name];
if (listeners) {
for (j = 0 , subLn = listeners.length; j < subLn; j++) {
listener = listeners[j];
listener.fn.call(listener.scope, name);
}
delete nameListeners[name];
}
}
names = alternateNames;
alternateNames = null;
}
},
addListener: function(fn, scope, className, listeners, nameListeners) {
if (Ext.isArray(className)) {
fn = Ext.Function.createBarrier(className.length, fn, scope);
for (i = 0; i < className.length; i++) {
this.addListener(fn, null, className[i], listeners, nameListeners);
}
return;
}
var i,
listener = {
fn: fn,
scope: scope
};
if (className) {
if (this.isCreated(className)) {
fn.call(scope, className);
return;
}
if (!nameListeners[className]) {
nameListeners[className] = [];
}
nameListeners[className].push(listener);
} else {
listeners.push(listener);
}
},
parseNamespace: function(namespace) {
if (typeof namespace !== 'string') {
throw new Error("[Ext.ClassManager] Invalid namespace, must be a string");
}
var cache = this.namespaceParseCache,
parts, rewrites, root, name, rewrite, from, to, i, ln;
if (this.enableNamespaceParseCache) {
if (cache.hasOwnProperty(namespace)) {
return cache[namespace];
}
}
parts = [];
rewrites = this.namespaceRewrites;
root = global;
name = namespace;
for (i = 0 , ln = rewrites.length; i < ln; i++) {
rewrite = rewrites[i];
from = rewrite.from;
to = rewrite.to;
if (name === from || name.substring(0, from.length) === from) {
name = name.substring(from.length);
if (typeof to !== 'string') {
root = to;
} else {
parts = parts.concat(to.split('.'));
}
break;
}
}
parts.push(root);
parts = parts.concat(name.split('.'));
if (this.enableNamespaceParseCache) {
cache[namespace] = parts;
}
return parts;
},
setNamespace: function(name, value) {
var root = global,
parts = this.parseNamespace(name),
ln = parts.length - 1,
leaf = parts[ln],
i, part;
for (i = 0; i < ln; i++) {
part = parts[i];
if (typeof part !== 'string') {
root = part;
} else {
if (!root[part]) {
root[part] = {};
}
root = root[part];
}
}
root[leaf] = value;
return root[leaf];
},
createNamespaces: function() {
var root = global,
parts, part, i, j, ln, subLn;
for (i = 0 , ln = arguments.length; i < ln; i++) {
parts = this.parseNamespace(arguments[i]);
for (j = 0 , subLn = parts.length; j < subLn; j++) {
part = parts[j];
if (typeof part !== 'string') {
root = part;
} else {
if (!root[part]) {
root[part] = {};
}
root = root[part];
}
}
}
return root;
},
set: function(name, value) {
var me = this,
targetName = me.getName(value);
me.classes[name] = me.setNamespace(name, value);
if (targetName && targetName !== name) {
me.addAlternate(targetName, name);
}
return this;
},
get: function(name) {
var classes = this.classes,
root, parts, part, i, ln;
if (classes[name]) {
return classes[name];
}
root = global;
parts = this.parseNamespace(name);
for (i = 0 , ln = parts.length; i < ln; i++) {
part = parts[i];
if (typeof part !== 'string') {
root = part;
} else {
if (!root || !root[part]) {
return null;
}
root = root[part];
}
}
return root;
},
addNameAliasMappings: function(aliases) {
this.addAlias(aliases);
},
addNameAlternateMappings: function(alternates) {
this.addAlternate(alternates);
},
getByAlias: function(alias) {
return this.get(this.getNameByAlias(alias));
},
getName: function(object) {
return object && object.$className || '';
},
getClass: function(object) {
return object && object.self || null;
},
create: function(className, data, createdFn) {
if (className != null && typeof className !== 'string') {
throw new Error("[Ext.define] Invalid class name '" + className + "' specified, must be a non-empty string");
}
var ctor = makeCtor(className);
if (typeof data === 'function') {
data = data(ctor);
}
if (className) {
if (Manager.classes[className]) {
Ext.log.warn("[Ext.define] Duplicate class name '" + className + "' specified, must be a non-empty string");
}
ctor.name = className;
}
data.$className = className;
return new Class(ctor, data, function() {
var postprocessorStack = data.postprocessors || Manager.defaultPostprocessors,
registeredPostprocessors = Manager.postprocessors,
postprocessors = [],
postprocessor, i, ln, j, subLn, postprocessorProperties, postprocessorProperty;
delete data.postprocessors;
for (i = 0 , ln = postprocessorStack.length; i < ln; i++) {
postprocessor = postprocessorStack[i];
if (typeof postprocessor === 'string') {
postprocessor = registeredPostprocessors[postprocessor];
postprocessorProperties = postprocessor.properties;
if (postprocessorProperties === true) {
postprocessors.push(postprocessor.fn);
} else if (postprocessorProperties) {
for (j = 0 , subLn = postprocessorProperties.length; j < subLn; j++) {
postprocessorProperty = postprocessorProperties[j];
if (data.hasOwnProperty(postprocessorProperty)) {
postprocessors.push(postprocessor.fn);
break;
}
}
}
} else {
postprocessors.push(postprocessor);
}
}
data.postprocessors = postprocessors;
data.createdFn = createdFn;
Manager.processCreate(className, this, data);
});
},
processCreate: function(className, cls, clsData) {
var me = this,
postprocessor = clsData.postprocessors.shift(),
createdFn = clsData.createdFn;
if (!postprocessor) {
Ext.classSystemMonitor && Ext.classSystemMonitor(className, 'Ext.ClassManager#classCreated', arguments);
if (className) {
me.set(className, cls);
}
delete cls._classHooks;
if (createdFn) {
createdFn.call(cls, cls);
}
if (className) {
me.triggerCreated(className);
}
return;
}
if (postprocessor.call(me, className, cls, clsData, me.processCreate) !== false) {
me.processCreate(className, cls, clsData);
}
},
createOverride: function(className, data, createdFn) {
var me = this,
overriddenClassName = data.override,
requires = data.requires,
uses = data.uses,
mixins = data.mixins,
mixinsIsArray,
compat = data.compatibility,
depedenciesLoaded,
classReady = function() {
var cls, dependencies, i, key, temp;
if (!depedenciesLoaded) {
dependencies = requires ? requires.slice(0) : [];
if (mixins) {
if (!(mixinsIsArray = mixins instanceof Array)) {
for (key in mixins) {
if (Ext.isString(cls = mixins[key])) {
dependencies.push(cls);
}
}
} else {
for (i = 0 , temp = mixins.length; i < temp; ++i) {
if (Ext.isString(cls = mixins[i])) {
dependencies.push(cls);
}
}
}
}
depedenciesLoaded = true;
if (dependencies.length) {
Ext.require(dependencies, classReady);
return;
}
}
if (mixinsIsArray) {
for (i = 0 , temp = mixins.length; i < temp; ++i) {
if (Ext.isString(cls = mixins[i])) {
mixins[i] = Ext.ClassManager.get(cls);
}
}
} else if (mixins) {
for (key in mixins) {
if (Ext.isString(cls = mixins[key])) {
mixins[key] = Ext.ClassManager.get(cls);
}
}
}
cls = me.get(overriddenClassName);
delete data.override;
delete data.compatibility;
delete data.requires;
delete data.uses;
Ext.override(cls, data);
Ext.Loader.history.push(className);
if (uses) {
Ext['Loader'].addUsedClasses(uses);
}
if (createdFn) {
createdFn.call(cls, cls);
}
};
Manager.overrideMap[className] = true;
if (!compat || Ext.checkVersion(compat)) {
me.onCreated(classReady, me, overriddenClassName);
}
me.triggerCreated(className, 2);
return me;
},
instantiateByAlias: function() {
var alias = arguments[0],
args = arraySlice.call(arguments),
className = this.getNameByAlias(alias);
if (!className) {
throw new Error("[Ext.createByAlias] Unrecognized alias: " + alias);
}
args[0] = className;
return Ext.create.apply(Ext, args);
},
instantiate: function() {
Ext.log.warn('Ext.ClassManager.instantiate() is deprecated. Use Ext.create() instead.');
return Ext.create.apply(Ext, arguments);
},
dynInstantiate: function(name, args) {
args = arrayFrom(args, true);
args.unshift(name);
return Ext.create.apply(Ext, args);
},
getInstantiator: function(length) {
var instantiators = this.instantiators,
instantiator, i, args;
instantiator = instantiators[length];
if (!instantiator) {
i = length;
args = [];
for (i = 0; i < length; i++) {
args.push('a[' + i + ']');
}
instantiator = instantiators[length] = new Function('c', 'a', 'return new c(' + args.join(',') + ')');
instantiator.name = "Ext.create" + length;
}
return instantiator;
},
postprocessors: {},
defaultPostprocessors: [],
registerPostprocessor: function(name, fn, properties, position, relativeTo) {
if (!position) {
position = 'last';
}
if (!properties) {
properties = [
name
];
}
this.postprocessors[name] = {
name: name,
properties: properties || false,
fn: fn
};
this.setDefaultPostprocessorPosition(name, position, relativeTo);
return this;
},
setDefaultPostprocessors: function(postprocessors) {
this.defaultPostprocessors = arrayFrom(postprocessors);
return this;
},
setDefaultPostprocessorPosition: function(name, offset, relativeName) {
var defaultPostprocessors = this.defaultPostprocessors,
index;
if (typeof offset === 'string') {
if (offset === 'first') {
defaultPostprocessors.unshift(name);
return this;
} else if (offset === 'last') {
defaultPostprocessors.push(name);
return this;
}
offset = (offset === 'after') ? 1 : -1;
}
index = Ext.Array.indexOf(defaultPostprocessors, relativeName);
if (index !== -1) {
Ext.Array.splice(defaultPostprocessors, Math.max(0, index + offset), 0, name);
}
return this;
}
});
Manager.registerPostprocessor('alias', function(name, cls, data) {
Ext.classSystemMonitor && Ext.classSystemMonitor(name, 'Ext.ClassManager#aliasPostProcessor', arguments);
var aliases = Ext.Array.from(data.alias),
i, ln;
for (i = 0 , ln = aliases.length; i < ln; i++) {
alias = aliases[i];
this.addAlias(cls, alias);
}
}, [
'xtype',
'alias'
]);
Manager.registerPostprocessor('singleton', function(name, cls, data, fn) {
Ext.classSystemMonitor && Ext.classSystemMonitor(name, 'Ext.ClassManager#singletonPostProcessor', arguments);
if (data.singleton) {
fn.call(this, name, new cls(), data);
} else {
return true;
}
return false;
});
Manager.registerPostprocessor('alternateClassName', function(name, cls, data) {
Ext.classSystemMonitor && Ext.classSystemMonitor(name, 'Ext.ClassManager#alternateClassNamePostprocessor', arguments);
var alternates = data.alternateClassName,
i, ln, alternate;
if (!(alternates instanceof Array)) {
alternates = [
alternates
];
}
for (i = 0 , ln = alternates.length; i < ln; i++) {
alternate = alternates[i];
if (typeof alternate !== 'string') {
throw new Error("[Ext.define] Invalid alternate of: '" + alternate + "' for class: '" + name + "'; must be a valid string");
}
this.set(alternate, cls);
}
});
Manager.registerPostprocessor('debugHooks', function(name, Class, data) {
Ext.classSystemMonitor && Ext.classSystemMonitor(Class, 'Ext.Class#debugHooks', arguments);
if (Ext.isDebugEnabled(Class.$className, data.debugHooks.$enabled)) {
delete data.debugHooks.$enabled;
Ext.override(Class, data.debugHooks);
}
var target = Class.isInstance ? Class.self : Class;
delete target.prototype.debugHooks;
});
Manager.registerPostprocessor('deprecated', function(name, Class, data) {
Ext.classSystemMonitor && Ext.classSystemMonitor(Class, 'Ext.Class#deprecated', arguments);
var target = Class.isInstance ? Class.self : Class;
target.addDeprecations(data.deprecated);
delete target.prototype.deprecated;
});
Ext.apply(Ext, {
create: function() {
var name = arguments[0],
nameType = typeof name,
args = arraySlice.call(arguments, 1),
cls;
if (nameType === 'function') {
cls = name;
} else {
if (nameType !== 'string' && args.length === 0) {
args = [
name
];
if (!(name = name.xclass)) {
name = args[0].xtype;
if (name) {
name = 'widget.' + name;
}
}
}
if (typeof name !== 'string' || name.length < 1) {
throw new Error("[Ext.create] Invalid class name or alias '" + name + "' specified, must be a non-empty string");
}
name = Manager.resolveName(name);
cls = Manager.get(name);
}
if (!cls) {
Ext.log.warn("[Ext.Loader] Synchronously loading '" + name + "'; consider adding " + "Ext.require('" + name + "') above Ext.onReady");
Ext.syncRequire(name);
cls = Manager.get(name);
}
if (!cls) {
throw new Error("[Ext.create] Unrecognized class name / alias: " + name);
}
if (typeof cls !== 'function') {
throw new Error("[Ext.create] Singleton '" + name + "' cannot be instantiated.");
}
return Manager.getInstantiator(args.length)(cls, args);
},
widget: function(name, config) {
var xtype = name,
alias, className, T;
if (typeof xtype !== 'string') {
config = name;
xtype = config.xtype;
className = config.xclass;
} else {
config = config || {};
}
if (config.isComponent) {
return config;
}
if (!className) {
alias = 'widget.' + xtype;
className = Manager.getNameByAlias(alias);
}
if (className) {
T = Manager.get(className);
}
if (!T) {
return Ext.create(className || alias, config);
}
return new T(config);
},
createByAlias: alias(Manager, 'instantiateByAlias'),
define: function(className, data, createdFn) {
Ext.classSystemMonitor && Ext.classSystemMonitor(className, 'ClassManager#define', arguments);
if (data.override) {
Manager.classState[className] = 20;
return Manager.createOverride.apply(Manager, arguments);
}
Manager.classState[className] = 10;
return Manager.create.apply(Manager, arguments);
},
undefine: function(className) {
Ext.classSystemMonitor && Ext.classSystemMonitor(className, 'Ext.ClassManager#undefine', arguments);
var classes = Manager.classes,
parts, partCount, namespace, i;
delete Manager.namespaceParseCache[className];
delete classes[className];
delete Manager.existCache[className];
delete Manager.classState[className];
Manager.removeName(className);
parts = Manager.parseNamespace(className);
partCount = parts.length - 1;
namespace = parts[0];
for (i = 1; i < partCount; i++) {
namespace = namespace[parts[i]];
if (!namespace) {
return;
}
}
try {
delete namespace[parts[partCount]];
} catch (e) {
namespace[parts[partCount]] = undefined;
}
},
getClassName: alias(Manager, 'getName'),
getDisplayName: function(object) {
if (object) {
if (object.displayName) {
return object.displayName;
}
if (object.$name && object.$class) {
return Ext.getClassName(object.$class) + '#' + object.$name;
}
if (object.$className) {
return object.$className;
}
}
return 'Anonymous';
},
getClass: alias(Manager, 'getClass'),
namespace: alias(Manager, 'createNamespaces')
});
Ext.createWidget = Ext.widget;
Ext.ns = Ext.namespace;
Class.registerPreprocessor('className', function(cls, data) {
if ('$className' in data) {
cls.$className = data.$className;
cls.displayName = cls.$className;
}
Ext.classSystemMonitor && Ext.classSystemMonitor(cls, 'Ext.ClassManager#classNamePreprocessor', arguments);
}, true, 'first');
Class.registerPreprocessor('alias', function(cls, data) {
Ext.classSystemMonitor && Ext.classSystemMonitor(cls, 'Ext.ClassManager#aliasPreprocessor', arguments);
var prototype = cls.prototype,
xtypes = arrayFrom(data.xtype),
aliases = arrayFrom(data.alias),
widgetPrefix = 'widget.',
widgetPrefixLength = widgetPrefix.length,
xtypesChain = Array.prototype.slice.call(prototype.xtypesChain || []),
xtypesMap = Ext.merge({}, prototype.xtypesMap || {}),
i, ln, alias, xtype;
for (i = 0 , ln = aliases.length; i < ln; i++) {
alias = aliases[i];
if (typeof alias !== 'string' || alias.length < 1) {
throw new Error("[Ext.define] Invalid alias of: '" + alias + "' for class: '" + name + "'; must be a valid string");
}
if (alias.substring(0, widgetPrefixLength) === widgetPrefix) {
xtype = alias.substring(widgetPrefixLength);
Ext.Array.include(xtypes, xtype);
}
}
cls.xtype = data.xtype = xtypes[0];
data.xtypes = xtypes;
for (i = 0 , ln = xtypes.length; i < ln; i++) {
xtype = xtypes[i];
if (!xtypesMap[xtype]) {
xtypesMap[xtype] = true;
xtypesChain.push(xtype);
}
}
data.xtypesChain = xtypesChain;
data.xtypesMap = xtypesMap;
Ext.Function.interceptAfter(data, 'onClassCreated', function() {
Ext.classSystemMonitor && Ext.classSystemMonitor(cls, 'Ext.ClassManager#aliasPreprocessor#afterClassCreated', arguments);
var mixins = prototype.mixins,
key, mixin;
for (key in mixins) {
if (mixins.hasOwnProperty(key)) {
mixin = mixins[key];
xtypes = mixin.xtypes;
if (xtypes) {
for (i = 0 , ln = xtypes.length; i < ln; i++) {
xtype = xtypes[i];
if (!xtypesMap[xtype]) {
xtypesMap[xtype] = true;
xtypesChain.push(xtype);
}
}
}
}
}
});
for (i = 0 , ln = xtypes.length; i < ln; i++) {
xtype = xtypes[i];
if (typeof xtype !== 'string' || xtype.length < 1) {
throw new Error("[Ext.define] Invalid xtype of: '" + xtype + "' for class: '" + name + "'; must be a valid non-empty string");
}
Ext.Array.include(aliases, widgetPrefix + xtype);
}
data.alias = aliases;
}, [
'xtype',
'alias'
]);
if (Ext.manifest) {
var manifest = Ext.manifest,
classes = manifest.classes,
paths = manifest.paths,
aliases = {},
alternates = {},
className, obj, name, path, baseUrl;
if (paths) {
if (manifest.bootRelative) {
baseUrl = Ext.Boot.baseUrl;
for (path in paths) {
if (paths.hasOwnProperty(path)) {
paths[path] = baseUrl + paths[path];
}
}
}
Manager.setPath(paths);
}
if (classes) {
for (className in classes) {
alternates[className] = [];
aliases[className] = [];
obj = classes[className];
if (obj.alias) {
aliases[className] = obj.alias;
}
if (obj.alternates) {
alternates[className] = obj.alternates;
}
}
}
Manager.addAlias(aliases);
Manager.addAlternate(alternates);
}
return Manager;
}(Ext.Class, Ext.Function.alias, Array.prototype.slice, Ext.Array.from, Ext.global));
(Ext.env || (Ext.env = {})).Browser = function(userAgent, publish) {
var me = this,
browserPrefixes = me.browserPrefixes,
enginePrefixes = me.enginePrefixes,
browserMatch = userAgent.match(new RegExp('((?:' + Ext.Object.getValues(browserPrefixes).join(')|(?:') + '))([\\w\\._]+)')),
engineMatch = userAgent.match(new RegExp('((?:' + Ext.Object.getValues(enginePrefixes).join(')|(?:') + '))([\\w\\._]+)')),
browserNames = me.browserNames,
browserName = browserNames.other,
engineNames = me.engineNames,
engineName = engineNames.other,
browserVersion = '',
engineVersion = '',
majorVer = '',
isWebView = false,
i, prefix, mode, name, maxIEVersion;
me.userAgent = userAgent;
if (browserMatch) {
browserName = browserNames[Ext.Object.getKey(browserPrefixes, browserMatch[1])];
if (browserName === 'Safari' && /^Opera/.test(userAgent)) {
browserName = 'Opera';
}
browserVersion = new Ext.Version(browserMatch[2]);
}
if (engineMatch) {
engineName = engineNames[Ext.Object.getKey(enginePrefixes, engineMatch[1])];
engineVersion = new Ext.Version(engineMatch[2]);
}
if (engineName === 'Trident' && browserName !== 'IE') {
browserName = 'IE';
var version = userAgent.match(/.*rv:(\d+.\d+)/);
if (version && version.length) {
version = version[1];
browserVersion = new Ext.Version(version);
}
}
if (userAgent.match(/FB/) && browserName === "Other") {
browserName = browserNames.safari;
engineName = engineNames.webkit;
}
if (userAgent.match(/Android.*Chrome/g)) {
browserName = 'ChromeMobile';
}
if (userAgent.match(/OPR/)) {
browserName = 'Opera';
browserMatch = userAgent.match(/OPR\/(\d+.\d+)/);
browserVersion = new Ext.Version(browserMatch[1]);
}
Ext.apply(this, {
engineName: engineName,
engineVersion: engineVersion,
name: browserName,
version: browserVersion
});
this.setFlag(browserName, true, publish);
if (browserVersion) {
majorVer = browserVersion.getMajor() || '';
if (me.is.IE) {
majorVer = parseInt(majorVer, 10);
mode = document.documentMode;
if (mode === 7 || (majorVer === 7 && mode !== 8 && mode !== 9 && mode !== 10)) {
majorVer = 7;
} else if (mode === 8 || (majorVer === 8 && mode !== 8 && mode !== 9 && mode !== 10)) {
majorVer = 8;
} else if (mode === 9 || (majorVer === 9 && mode !== 7 && mode !== 8 && mode !== 10)) {
majorVer = 9;
} else if (mode === 10 || (majorVer === 10 && mode !== 7 && mode !== 8 && mode !== 9)) {
majorVer = 10;
} else if (mode === 11 || (majorVer === 11 && mode !== 7 && mode !== 8 && mode !== 9 && mode !== 10)) {
majorVer = 11;
}
maxIEVersion = Math.max(majorVer, 11);
for (i = 7; i <= maxIEVersion; ++i) {
prefix = 'isIE' + i;
if (majorVer <= i) {
Ext[prefix + 'm'] = true;
}
if (majorVer === i) {
Ext[prefix] = true;
}
if (majorVer >= i) {
Ext[prefix + 'p'] = true;
}
}
}
if (me.is.Opera && parseInt(majorVer, 10) <= 12) {
Ext.isOpera12m = true;
}
Ext.chromeVersion = Ext.isChrome ? majorVer : 0;
Ext.firefoxVersion = Ext.isFirefox ? majorVer : 0;
Ext.ieVersion = Ext.isIE ? majorVer : 0;
Ext.operaVersion = Ext.isOpera ? majorVer : 0;
Ext.safariVersion = Ext.isSafari ? majorVer : 0;
Ext.webKitVersion = Ext.isWebKit ? majorVer : 0;
this.setFlag(browserName + majorVer, true, publish);
this.setFlag(browserName + browserVersion.getShortVersion());
}
for (i in browserNames) {
if (browserNames.hasOwnProperty(i)) {
name = browserNames[i];
this.setFlag(name, browserName === name);
}
}
this.setFlag(name);
if (engineVersion) {
this.setFlag(engineName + (engineVersion.getMajor() || ''));
this.setFlag(engineName + engineVersion.getShortVersion());
}
for (i in engineNames) {
if (engineNames.hasOwnProperty(i)) {
name = engineNames[i];
this.setFlag(name, engineName === name, publish);
}
}
this.setFlag('Standalone', !!navigator.standalone);
this.setFlag('Ripple', !!document.getElementById("tinyhippos-injected") && !Ext.isEmpty(window.top.ripple));
this.setFlag('WebWorks', !!window.blackberry);
if (window.PhoneGap !== undefined || window.Cordova !== undefined || window.cordova !== undefined) {
isWebView = true;
this.setFlag('PhoneGap');
this.setFlag('Cordova');
} else if (!!window.isNK) {
isWebView = true;
this.setFlag('Sencha');
}
if (/(Glass)/i.test(userAgent)) {
this.setFlag('GoogleGlass');
}
if (/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)(?!.*FBAN)/i.test(userAgent)) {
isWebView = true;
}
this.setFlag('WebView', isWebView);
this.isStrict = Ext.isStrict = document.compatMode === "CSS1Compat";
this.isSecure = Ext.isSecure;
this.identity = browserName + majorVer + (this.isStrict ? 'Strict' : 'Quirks');
};
Ext.env.Browser.prototype = {
constructor: Ext.env.Browser,
browserNames: {
ie: 'IE',
firefox: 'Firefox',
safari: 'Safari',
chrome: 'Chrome',
opera: 'Opera',
dolfin: 'Dolfin',
webosbrowser: 'webOSBrowser',
chromeMobile: 'ChromeMobile',
chromeiOS: 'ChromeiOS',
silk: 'Silk',
other: 'Other'
},
engineNames: {
webkit: 'WebKit',
gecko: 'Gecko',
presto: 'Presto',
trident: 'Trident',
other: 'Other'
},
enginePrefixes: {
webkit: 'AppleWebKit/',
gecko: 'Gecko/',
presto: 'Presto/',
trident: 'Trident/'
},
browserPrefixes: {
ie: 'MSIE ',
firefox: 'Firefox/',
chrome: 'Chrome/',
safari: 'Version/',
opera: 'OPR/',
dolfin: 'Dolfin/',
webosbrowser: 'wOSBrowser/',
chromeMobile: 'CrMo/',
chromeiOS: 'CriOS/',
silk: 'Silk/'
},
styleDashPrefixes: {
WebKit: '-webkit-',
Gecko: '-moz-',
Trident: '-ms-',
Presto: '-o-',
Other: ''
},
stylePrefixes: {
WebKit: 'Webkit',
Gecko: 'Moz',
Trident: 'ms',
Presto: 'O',
Other: ''
},
propertyPrefixes: {
WebKit: 'webkit',
Gecko: 'moz',
Trident: 'ms',
Presto: 'o',
Other: ''
},
is: function(name) {
return !!this.is[name];
},
name: null,
version: null,
engineName: null,
engineVersion: null,
setFlag: function(name, value, publish) {
if (value === undefined) {
value = true;
}
this.is[name] = value;
this.is[name.toLowerCase()] = value;
if (publish) {
Ext['is' + name] = value;
}
return this;
},
getStyleDashPrefix: function() {
return this.styleDashPrefixes[this.engineName];
},
getStylePrefix: function() {
return this.stylePrefixes[this.engineName];
},
getVendorProperyName: function(name) {
var prefix = this.propertyPrefixes[this.engineName];
if (prefix.length > 0) {
return prefix + Ext.String.capitalize(name);
}
return name;
},
getPreferredTranslationMethod: function(config) {
if (typeof config === 'object' && 'translationMethod' in config && config.translationMethod !== 'auto') {
return config.translationMethod;
} else {
return 'csstransform';
}
}
};
(function(userAgent) {
Ext.browser = new Ext.env.Browser(userAgent, true);
Ext.userAgent = userAgent.toLowerCase();
Ext.SSL_SECURE_URL = Ext.isSecure && Ext.isIE ? 'javascript:\'\'' : 'about:blank';
}(
Ext.global.navigator.userAgent));
Ext.env.OS = function(userAgent, platform, browserScope) {
var me = this,
names = me.names,
prefixes = me.prefixes,
name,
version = '',
is = me.is,
i, prefix, match, item, match1;
browserScope = browserScope || Ext.browser;
for (i in prefixes) {
if (prefixes.hasOwnProperty(i)) {
prefix = prefixes[i];
match = userAgent.match(new RegExp('(?:' + prefix + ')([^\\s;]+)'));
if (match) {
name = names[i];
match1 = match[1];
if (match1 && match1 === "HTC_") {
version = new Ext.Version("2.3");
} else if (match1 && match1 === "Silk/") {
version = new Ext.Version("2.3");
} else {
version = new Ext.Version(match[match.length - 1]);
}
break;
}
}
}
if (!name) {
name = names[(userAgent.toLowerCase().match(/mac|win|linux/) || [
'other'
])[0]];
version = new Ext.Version('');
}
this.name = name;
this.version = version;
if (platform) {
this.setFlag(platform.replace(/ simulator$/i, ''));
}
this.setFlag(name);
if (version) {
this.setFlag(name + (version.getMajor() || ''));
this.setFlag(name + version.getShortVersion());
}
for (i in names) {
if (names.hasOwnProperty(i)) {
item = names[i];
if (!is.hasOwnProperty(name)) {
this.setFlag(item, (name === item));
}
}
}
if (this.name === "iOS" && window.screen.height === 568) {
this.setFlag('iPhone5');
}
if (browserScope.is.Safari || browserScope.is.Silk) {
if (this.is.Android2 || this.is.Android3 || browserScope.version.shortVersion === 501) {
browserScope.setFlag("AndroidStock");
browserScope.setFlag("AndroidStock2");
}
if (this.is.Android4) {
browserScope.setFlag("AndroidStock");
browserScope.setFlag("AndroidStock4");
}
}
};
Ext.env.OS.prototype = {
constructor: Ext.env.OS,
names: {
ios: 'iOS',
android: 'Android',
windowsPhone: 'WindowsPhone',
webos: 'webOS',
blackberry: 'BlackBerry',
rimTablet: 'RIMTablet',
mac: 'MacOS',
win: 'Windows',
tizen: 'Tizen',
linux: 'Linux',
bada: 'Bada',
chrome: 'ChromeOS',
other: 'Other'
},
prefixes: {
tizen: '(Tizen )',
ios: 'i(?:Pad|Phone|Pod)(?:.*)CPU(?: iPhone)? OS ',
android: '(Android |HTC_|Silk/)',
windowsPhone: 'Windows Phone ',
blackberry: '(?:BlackBerry|BB)(?:.*)Version/',
rimTablet: 'RIM Tablet OS ',
webos: '(?:webOS|hpwOS)/',
bada: 'Bada/',
chrome: 'CrOS '
},
is: function(name) {
return !!this[name];
},
name: null,
version: null,
setFlag: function(name, value) {
if (value === undefined) {
value = true;
}
if (this.flags) {
this.flags[name] = value;
}
this.is[name] = value;
this.is[name.toLowerCase()] = value;
return this;
}
};
(function() {
var navigation = Ext.global.navigator,
userAgent = navigation.userAgent,
OS = Ext.env.OS,
is = (Ext.is || (Ext.is = {})),
osEnv, osName, deviceType;
OS.prototype.flags = is;
Ext.os = osEnv = new OS(userAgent, navigation.platform);
osName = osEnv.name;
Ext['is' + osName] = true;
Ext.isMac = is.Mac = is.MacOS;
var search = window.location.search.match(/deviceType=(Tablet|Phone)/),
nativeDeviceType = window.deviceType;
if (search && search[1]) {
deviceType = search[1];
} else if (nativeDeviceType === 'iPhone') {
deviceType = 'Phone';
} else if (nativeDeviceType === 'iPad') {
deviceType = 'Tablet';
} else {
if (!osEnv.is.Android && !osEnv.is.iOS && !osEnv.is.WindowsPhone && /Windows|Linux|MacOS/.test(osName)) {
deviceType = 'Desktop';
Ext.browser.is.WebView = !!Ext.browser.is.Ripple;
} else if (osEnv.is.iPad || osEnv.is.RIMTablet || osEnv.is.Android3 || Ext.browser.is.Silk || (osEnv.is.Android4 && userAgent.search(/mobile/i) === -1)) {
deviceType = 'Tablet';
} else {
deviceType = 'Phone';
}
}
osEnv.setFlag(deviceType, true);
osEnv.deviceType = deviceType;
delete OS.prototype.flags;
}());
Ext.feature = {
has: function(name) {
return !!this.has[name];
},
testElements: {},
getTestElement: function(tag, createNew) {
if (tag === undefined) {
tag = 'div';
} else if (typeof tag !== 'string') {
return tag;
}
if (createNew) {
return document.createElement(tag);
}
if (!this.testElements[tag]) {
this.testElements[tag] = document.createElement(tag);
}
return this.testElements[tag];
},
isStyleSupported: function(name, tag) {
var elementStyle = this.getTestElement(tag).style,
cName = Ext.String.capitalize(name);
if (typeof elementStyle[name] !== 'undefined' || typeof elementStyle[Ext.browser.getStylePrefix(name) + cName] !== 'undefined') {
return true;
}
return false;
},
isStyleSupportedWithoutPrefix: function(name, tag) {
var elementStyle = this.getTestElement(tag).style;
if (typeof elementStyle[name] !== 'undefined') {
return true;
}
return false;
},
isEventSupported: function(name, tag) {
if (tag === undefined) {
tag = window;
}
var element = this.getTestElement(tag),
eventName = 'on' + name.toLowerCase(),
isSupported = (eventName in element);
if (!isSupported) {
if (element.setAttribute && element.removeAttribute) {
element.setAttribute(eventName, '');
isSupported = typeof element[eventName] === 'function';
if (typeof element[eventName] !== 'undefined') {
element[eventName] = undefined;
}
element.removeAttribute(eventName);
}
}
return isSupported;
},
getStyle: function(element, styleName) {
var view = element.ownerDocument.defaultView,
style = (view ? view.getComputedStyle(element, null) : element.currentStyle);
return (style || element.style)[styleName];
},
getSupportedPropertyName: function(object, name) {
var vendorName = Ext.browser.getVendorProperyName(name);
if (vendorName in object) {
return vendorName;
} else if (name in object) {
return name;
}
return null;
},
detect: function(isReady) {
var me = this,
doc = document,
toRun = me.toRun || me.tests,
n = toRun.length,
div = doc.createElement('div'),
notRun = [],
supports = Ext.supports,
has = me.has,
name, test, vector, value;
if (!Ext.theme) {
Ext.theme = {
name: 'Default'
};
}
Ext.theme.is = {};
Ext.theme.is[Ext.theme.name] = true;
div.innerHTML = '
' + '' + '' + '';
if (isReady) {
doc.body.appendChild(div);
}
vector = me.preDetected[Ext.browser.identity] || [];
while (n--) {
test = toRun[n];
value = vector[n];
name = test.name;
if (value === undefined) {
if (!isReady && test.ready) {
notRun.push(test);
continue;
}
value = test.fn.call(me, doc, div);
}
supports[name] = has[name] = value;
}
if (isReady) {
doc.body.removeChild(div);
}
me.toRun = notRun;
},
report: function() {
var values = [],
len = this.tests.length,
i;
for (i = 0; i < len; ++i) {
values.push(this.has[this.tests[i].name] ? 1 : 0);
}
Ext.log(Ext.browser.identity + ': [' + values.join(',') + ']');
},
preDetected: {},
tests: [
{
name: 'CSSPointerEvents',
fn: function(doc) {
return 'pointerEvents' in doc.documentElement.style;
}
},
{
name: 'CSS3BoxShadow',
fn: function(doc) {
return 'boxShadow' in doc.documentElement.style || 'WebkitBoxShadow' in doc.documentElement.style || 'MozBoxShadow' in doc.documentElement.style;
}
},
{
name: 'ClassList',
fn: function(doc) {
return !!doc.documentElement.classList;
}
},
{
name: 'Canvas',
fn: function() {
var element = this.getTestElement('canvas');
return !!(element && element.getContext && element.getContext('2d'));
}
},
{
name: 'Svg',
fn: function(doc) {
return !!(doc.createElementNS && !!doc.createElementNS("http:/" + "/www.w3.org/2000/svg", "svg").createSVGRect);
}
},
{
name: 'Vml',
fn: function() {
var element = this.getTestElement(),
ret = false;
element.innerHTML = "";
ret = (element.childNodes.length === 1);
element.innerHTML = "";
return ret;
}
},
{
name: 'touchScroll',
fn: function() {
var supports = Ext.supports,
touchScroll = 0;
if (navigator.msMaxTouchPoints || (Ext.isWebKit && supports.TouchEvents && Ext.os.is.Desktop)) {
touchScroll = 1;
} else if (supports.Touch) {
touchScroll = 2;
}
return touchScroll;
}
},
{
name: 'Touch',
fn: function() {
var maxTouchPoints = navigator.msMaxTouchPoints || navigator.maxTouchPoints;
return (Ext.supports.TouchEvents && maxTouchPoints !== 1) || maxTouchPoints > 1;
}
},
{
name: 'TouchEvents',
fn: function() {
return this.isEventSupported('touchend');
}
},
{
name: 'PointerEvents',
fn: function() {
return navigator.pointerEnabled;
}
},
{
name: 'MSPointerEvents',
fn: function() {
return navigator.msPointerEnabled;
}
},
{
name: 'Orientation',
fn: function() {
return ('orientation' in window) && this.isEventSupported('orientationchange');
}
},
{
name: 'OrientationChange',
fn: function() {
return this.isEventSupported('orientationchange');
}
},
{
name: 'DeviceMotion',
fn: function() {
return this.isEventSupported('devicemotion');
}
},
{
names: [
'Geolocation',
'GeoLocation'
],
fn: function() {
return 'geolocation' in window.navigator;
}
},
{
name: 'SqlDatabase',
fn: function() {
return 'openDatabase' in window;
}
},
{
name: 'WebSockets',
fn: function() {
return 'WebSocket' in window;
}
},
{
name: 'Range',
fn: function() {
return !!document.createRange;
}
},
{
name: 'CreateContextualFragment',
fn: function() {
var range = !!document.createRange ? document.createRange() : false;
return range && !!range.createContextualFragment;
}
},
{
name: 'History',
fn: function() {
return ('history' in window && 'pushState' in window.history);
}
},
{
name: 'CssTransforms',
fn: function() {
return this.isStyleSupported('transform');
}
},
{
name: 'CssTransformNoPrefix',
fn: function() {
return this.isStyleSupportedWithoutPrefix('transform');
}
},
{
name: 'Css3dTransforms',
fn: function() {
return this.has('CssTransforms') && this.isStyleSupported('perspective') && !Ext.browser.is.AndroidStock2;
}
},
{
name: 'CssAnimations',
fn: function() {
return this.isStyleSupported('animationName');
}
},
{
names: [
'CssTransitions',
'Transitions'
],
fn: function() {
return this.isStyleSupported('transitionProperty');
}
},
{
names: [
'Audio',
'AudioTag'
],
fn: function() {
return !!this.getTestElement('audio').canPlayType;
}
},
{
name: 'Video',
fn: function() {
return !!this.getTestElement('video').canPlayType;
}
},
{
name: 'LocalStorage',
fn: function() {
try {
if ('localStorage' in window && window['localStorage'] !== null) {
localStorage.setItem('sencha-localstorage-test', 'test success');
localStorage.removeItem('sencha-localstorage-test');
return true;
}
} catch (e) {}
return false;
}
},
{
name: 'XHR2',
fn: function() {
return window.ProgressEvent && window.FormData && window.XMLHttpRequest && ('withCredentials' in new XMLHttpRequest());
}
},
{
name: 'XHRUploadProgress',
fn: function() {
if (window.XMLHttpRequest && !Ext.browser.is.AndroidStock) {
var xhr = new XMLHttpRequest();
return xhr && ('upload' in xhr) && ('onprogress' in xhr.upload);
}
return false;
}
},
{
name: 'NumericInputPlaceHolder',
fn: function() {
return !(Ext.browser.is.AndroidStock4 && Ext.os.version.getMinor() < 2);
}
},
{
name: 'ProperHBoxStretching',
ready: true,
fn: function() {
var bodyElement = document.createElement('div'),
innerElement = bodyElement.appendChild(document.createElement('div')),
contentElement = innerElement.appendChild(document.createElement('div')),
innerWidth;
bodyElement.setAttribute('style', 'width: 100px; height: 100px; position: relative;');
innerElement.setAttribute('style', 'position: absolute; display: -ms-flexbox; display: -webkit-flex; display: -moz-flexbox; display: flex; -ms-flex-direction: row; -webkit-flex-direction: row; -moz-flex-direction: row; flex-direction: row; min-width: 100%;');
contentElement.setAttribute('style', 'width: 200px; height: 50px;');
document.body.appendChild(bodyElement);
innerWidth = innerElement.offsetWidth;
document.body.removeChild(bodyElement);
return (innerWidth > 100);
}
},
{
name: 'matchesSelector',
fn: function() {
var el = document.documentElement,
w3 = 'matches',
wk = 'webkitMatchesSelector',
ms = 'msMatchesSelector',
mz = 'mozMatchesSelector';
return el[w3] ? w3 : el[wk] ? wk : el[ms] ? ms : el[mz] ? mz : null;
}
},
{
name: 'RightMargin',
ready: true,
fn: function(doc, div) {
var view = doc.defaultView;
return !(view && view.getComputedStyle(div.firstChild.firstChild, null).marginRight !== '0px');
}
},
{
name: 'DisplayChangeInputSelectionBug',
fn: function() {
var webKitVersion = Ext.webKitVersion;
return 0 < webKitVersion && webKitVersion < 533;
}
},
{
name: 'DisplayChangeTextAreaSelectionBug',
fn: function() {
var webKitVersion = Ext.webKitVersion;
return 0 < webKitVersion && webKitVersion < 534.24;
}
},
{
name: 'TransparentColor',
ready: true,
fn: function(doc, div, view) {
view = doc.defaultView;
return !(view && view.getComputedStyle(div.lastChild, null).backgroundColor !== 'transparent');
}
},
{
name: 'ComputedStyle',
ready: true,
fn: function(doc, div, view) {
view = doc.defaultView;
return view && view.getComputedStyle;
}
},
{
name: 'Float',
fn: function(doc) {
return 'cssFloat' in doc.documentElement.style;
}
},
{
name: 'CSS3BorderRadius',
ready: true,
fn: function(doc) {
var domPrefixes = [
'borderRadius',
'BorderRadius',
'MozBorderRadius',
'WebkitBorderRadius',
'OBorderRadius',
'KhtmlBorderRadius'
],
pass = false,
i;
for (i = 0; i < domPrefixes.length; i++) {
if (doc.documentElement.style[domPrefixes[i]] !== undefined) {
pass = true;
}
}
return pass && !Ext.isIE9;
}
},
{
name: 'CSS3LinearGradient',
fn: function(doc, div) {
var property = 'background-image:',
webkit = '-webkit-gradient(linear, left top, right bottom, from(black), to(white))',
w3c = 'linear-gradient(left top, black, white)',
moz = '-moz-' + w3c,
ms = '-ms-' + w3c,
opera = '-o-' + w3c,
options = [
property + webkit,
property + w3c,
property + moz,
property + ms,
property + opera
];
div.style.cssText = options.join(';');
return (("" + div.style.backgroundImage).indexOf('gradient') !== -1) && !Ext.isIE9;
}
},
{
name: 'MouseEnterLeave',
fn: function(doc) {
return ('onmouseenter' in doc.documentElement && 'onmouseleave' in doc.documentElement);
}
},
{
name: 'MouseWheel',
fn: function(doc) {
return ('onmousewheel' in doc.documentElement);
}
},
{
name: 'Opacity',
fn: function(doc, div) {
if (Ext.isIE8) {
return false;
}
div.firstChild.style.cssText = 'opacity:0.73';
return div.firstChild.style.opacity == '0.73';
}
},
{
name: 'Placeholder',
fn: function(doc) {
return 'placeholder' in doc.createElement('input');
}
},
{
name: 'Direct2DBug',
fn: function(doc) {
return Ext.isString(doc.documentElement.style.msTransformOrigin) && Ext.isIE9m;
}
},
{
name: 'BoundingClientRect',
fn: function(doc) {
return 'getBoundingClientRect' in doc.documentElement;
}
},
{
name: 'RotatedBoundingClientRect',
ready: true,
fn: function(doc) {
var body = doc.body,
supports = false,
el = this.getTestElement(),
style = el.style;
if (el.getBoundingClientRect) {
style.WebkitTransform = style.MozTransform = style.msTransform = style.OTransform = style.transform = 'rotate(90deg)';
style.width = '100px';
style.height = '30px';
body.appendChild(el);
supports = el.getBoundingClientRect().height !== 100;
body.removeChild(el);
}
return supports;
}
},
{
name: 'ChildContentClearedWhenSettingInnerHTML',
ready: true,
fn: function() {
var el = this.getTestElement(),
child;
el.innerHTML = 'a
';
child = el.firstChild;
el.innerHTML = 'b
';
return child.innerHTML !== 'a';
}
},
{
name: 'IncludePaddingInWidthCalculation',
ready: true,
fn: function(doc, div) {
return div.childNodes[1].firstChild.offsetWidth === 210;
}
},
{
name: 'IncludePaddingInHeightCalculation',
ready: true,
fn: function(doc, div) {
return div.childNodes[1].firstChild.offsetHeight === 210;
}
},
{
name: 'TextAreaMaxLength',
fn: function(doc) {
return ('maxlength' in doc.createElement('textarea'));
}
},
{
name: 'GetPositionPercentage',
ready: true,
fn: function(doc, div) {
return Ext.feature.getStyle(div.childNodes[2], 'left') === '10%';
}
},
{
name: 'PercentageHeightOverflowBug',
ready: true,
fn: function(doc) {
var hasBug = false,
style, el;
if (Ext.getScrollbarSize().height) {
el = this.getTestElement();
style = el.style;
style.height = '50px';
style.width = '50px';
style.overflow = 'auto';
style.position = 'absolute';
el.innerHTML = [
''
].join('');
doc.body.appendChild(el);
if (el.firstChild.offsetHeight === 50) {
hasBug = true;
}
doc.body.removeChild(el);
}
return hasBug;
}
},
{
name: 'xOriginBug',
ready: true,
fn: function(doc, div) {
div.innerHTML = '';
var outerBox = document.getElementById('b1').getBoundingClientRect(),
b2 = document.getElementById('b2').getBoundingClientRect(),
b3 = document.getElementById('b3').getBoundingClientRect();
return (b2.left !== outerBox.left && b3.right !== outerBox.right);
}
},
{
name: 'ScrollWidthInlinePaddingBug',
ready: true,
fn: function(doc) {
var hasBug = false,
style, el;
el = doc.createElement('div');
style = el.style;
style.height = '50px';
style.width = '50px';
style.padding = '10px';
style.overflow = 'hidden';
style.position = 'absolute';
el.innerHTML = '';
doc.body.appendChild(el);
if (el.scrollWidth === 70) {
hasBug = true;
}
doc.body.removeChild(el);
return hasBug;
}
},
{
name: 'rtlVertScrollbarOnRight',
ready: true,
fn: function(doc, div) {
div.innerHTML = '';
var outerBox = div.firstChild,
innerBox = outerBox.firstChild;
return (innerBox.offsetLeft + innerBox.offsetWidth !== outerBox.offsetLeft + outerBox.offsetWidth);
}
},
{
name: 'rtlVertScrollbarOverflowBug',
ready: true,
fn: function(doc, div) {
div.innerHTML = '';
var outerBox = div.firstChild;
return outerBox.clientHeight === outerBox.offsetHeight;
}
},
{
identity: 'defineProperty',
fn: function() {
if (Ext.isIE8m) {
Ext.Object.defineProperty = Ext.emptyFn;
return false;
}
return true;
}
},
{
identify: 'nativeXhr',
fn: function() {
if (typeof XMLHttpRequest !== 'undefined') {
return true;
}
XMLHttpRequest = function() {
try {
return new ActiveXObject('MSXML2.XMLHTTP.3.0');
}
catch (ex) {
return null;
}
};
return false;
}
},
{
name: 'SpecialKeyDownRepeat',
fn: function() {
return Ext.isWebKit ? parseInt(navigator.userAgent.match(/AppleWebKit\/(\d+)/)[1], 10) >= 525 : !((Ext.isGecko && !Ext.isWindows) || (Ext.isOpera && Ext.operaVersion < 12));
}
},
{
name: 'EmulatedMouseOver',
fn: function() {
return Ext.os.is.iOS;
}
},
{
name: 'Hashchange',
fn: function() {
var docMode = document.documentMode;
return 'onhashchange' in window && (docMode === undefined || docMode > 7);
}
},
{
name: 'FixedTableWidthBug',
ready: true,
fn: function() {
if (Ext.isIE8) {
return false;
}
var outer = document.createElement('div'),
inner = document.createElement('div'),
width;
outer.setAttribute('style', 'display:table;table-layout:fixed;');
inner.setAttribute('style', 'display:table-cell;min-width:50px;');
outer.appendChild(inner);
document.body.appendChild(outer);
outer.offsetWidth;
outer.style.width = '25px';
width = outer.offsetWidth;
document.body.removeChild(outer);
return width === 50;
}
},
{
name: 'FocusinFocusoutEvents',
fn: function() {
return !Ext.isGecko;
}
},
0
]
};
Ext.feature.tests.pop();
Ext.supports = {};
Ext.feature.detect();
Ext.env.Ready = {
blocks: (location.search || '').indexOf('ext-pauseReadyFire') > 0 ? 1 : 0,
bound: 0,
delay: 1,
events: [],
firing: false,
generation: 0,
listeners: [],
nextId: 0,
sortGeneration: 0,
state: 0,
timer: null,
bind: function() {
var me = Ext.env.Ready,
doc = document;
if (!me.bound) {
if (doc.readyState === 'complete') {
me.onReadyEvent({
type: doc.readyState || 'body'
});
} else {
me.bound = 1;
if (Ext.browser.is.PhoneGap && !Ext.os.is.Desktop) {
me.bound = 2;
doc.addEventListener('deviceready', me.onReadyEvent, false);
}
doc.addEventListener('DOMContentLoaded', me.onReadyEvent, false);
window.addEventListener('load', me.onReadyEvent, false);
}
}
},
block: function() {
++this.blocks;
Ext.isReady = false;
},
fireReady: function() {
var me = Ext.env.Ready;
if (!me.state) {
Ext._readyTime = Ext.now();
Ext.isDomReady = true;
me.state = 1;
Ext.feature.detect(true);
if (!me.delay) {
me.handleReady();
} else if (navigator.standalone) {
me.timer = Ext.defer(function() {
me.timer = null;
me.handleReadySoon();
}, 1);
} else {
me.handleReadySoon();
}
}
},
handleReady: function() {
var me = this;
if (me.state === 1) {
me.state = 2;
Ext._beforeReadyTime = Ext.now();
me.invokeAll();
Ext._afterReadytime = Ext.now();
}
},
handleReadySoon: function(delay) {
var me = this;
if (!me.timer) {
me.timer = Ext.defer(function() {
me.timer = null;
me.handleReady();
}, delay || me.delay);
}
},
invoke: function(listener) {
var delay = listener.delay;
if (delay) {
Ext.defer(listener.fn, delay, listener.scope);
} else {
if (Ext.elevateFunction) {
Ext.elevateFunction(listener.fn, listener.scope);
} else {
listener.fn.call(listener.scope);
}
}
},
invokeAll: function() {
if (Ext.elevateFunction) {
Ext.elevateFunction(this.doInvokeAll, this);
} else {
this.doInvokeAll();
}
},
doInvokeAll: function() {
var me = this,
listeners = me.listeners,
listener;
if (!me.blocks) {
Ext.isReady = true;
}
me.firing = true;
while (listeners.length) {
if (me.sortGeneration !== me.generation) {
me.sortGeneration = me.generation;
listeners.sort(me.sortFn);
}
listener = listeners.pop();
if (me.blocks && !listener.dom) {
listeners.push(listener);
break;
}
me.invoke(listener);
}
me.firing = false;
},
makeListener: function(fn, scope, options) {
var ret = {
fn: fn,
id: ++this.nextId,
scope: scope,
dom: false,
priority: 0
};
if (options) {
Ext.apply(ret, options);
}
ret.phase = ret.dom ? 0 : 1;
return ret;
},
on: function(fn, scope, options) {
var me = Ext.env.Ready,
listener = me.makeListener(fn, scope, options);
if (me.state === 2 && !me.firing && (listener.dom || !me.blocks)) {
me.invoke(listener);
} else {
me.listeners.push(listener);
++me.generation;
if (!me.bound) {
me.bind();
}
}
},
onReadyEvent: function(ev) {
var me = Ext.env.Ready;
if (Ext.elevateFunction) {
Ext.elevateFunction(me.doReadyEvent, me, arguments);
} else {
me.doReadyEvent(ev);
}
},
doReadyEvent: function(ev) {
var me = this;
if (ev && ev.type) {
me.events.push(ev);
}
if (me.bound > 0) {
me.unbind();
me.bound = -1;
}
if (!me.state) {
me.fireReady();
}
},
sortFn: function(a, b) {
return -((a.phase - b.phase) || (b.priority - a.priority) || (a.id - b.id));
},
unblock: function() {
var me = this;
if (me.blocks) {
if (!--me.blocks) {
if (me.state === 2 && !me.firing) {
me.invokeAll();
}
}
}
},
unbind: function() {
var me = this,
doc = document;
if (me.bound > 1) {
doc.removeEventListener('deviceready', me.onReadyEvent, false);
}
doc.removeEventListener('DOMContentLoaded', me.onReadyEvent, false);
window.removeEventListener('load', me.onReadyEvent, false);
}
};
(function() {
var Ready = Ext.env.Ready;
if (Ext.isIE9m) {
Ext.apply(Ready, {
scrollTimer: null,
readyStatesRe: /complete/i,
pollScroll: function() {
var scrollable = true;
try {
document.documentElement.doScroll('left');
} catch (e) {
scrollable = false;
}
if (scrollable && document.body) {
Ready.onReadyEvent({
type: 'doScroll'
});
} else {
Ready.scrollTimer = Ext.defer(Ready.pollScroll, 20);
}
return scrollable;
},
bind: function() {
if (Ready.bound) {
return;
}
var doc = document,
topContext;
try {
topContext = window.frameElement === undefined;
} catch (e) {}
if (!topContext || !doc.documentElement.doScroll) {
Ready.pollScroll = Ext.emptyFn;
}
else if (Ready.pollScroll()) {
return;
}
if (doc.readyState === 'complete') {
Ready.onReadyEvent({
type: 'already ' + (doc.readyState || 'body')
});
} else {
doc.attachEvent('onreadystatechange', Ready.onReadyStateChange);
window.attachEvent('onload', Ready.onReadyEvent);
Ready.bound = 1;
}
},
unbind: function() {
document.detachEvent('onreadystatechange', Ready.onReadyStateChange);
window.detachEvent('onload', Ready.onReadyEvent);
if (Ext.isNumber(Ready.scrollTimer)) {
clearTimeout(Ready.scrollTimer);
Ready.scrollTimer = null;
}
},
onReadyStateChange: function() {
var state = document.readyState;
if (Ready.readyStatesRe.test(state)) {
Ready.onReadyEvent({
type: state
});
}
}
});
}
Ext.onDocumentReady = function(fn, scope, options) {
var opt = {
dom: true
};
if (options) {
Ext.apply(opt, options);
}
Ready.on(fn, scope, opt);
};
Ext.onReady = function(fn, scope, options) {
Ready.on(fn, scope, options);
};
Ext.onInternalReady = function(fn, scope, options) {
Ready.on(fn, scope, Ext.apply({
priority: 1000
}, options));
};
Ready.bind();
}());
Ext.Loader = (new function() {
var Loader = this,
Manager = Ext.ClassManager,
Boot = Ext.Boot,
Class = Ext.Class,
Ready = Ext.env.Ready,
alias = Ext.Function.alias,
dependencyProperties = [
'extend',
'mixins',
'requires'
],
isInHistory = {},
history = [],
readyListeners = [],
usedClasses = [],
_requiresMap = {},
_missingQueue = {},
_config = {
enabled: true,
scriptChainDelay: false,
disableCaching: true,
disableCachingParam: '_dc',
paths: Manager.paths,
preserveScripts: true,
scriptCharset: undefined
},
delegatedConfigs = {
disableCaching: true,
disableCachingParam: true,
preserveScripts: true,
scriptChainDelay: 'loadDelay'
};
Ext.apply(Loader, {
isInHistory: isInHistory,
isLoading: false,
history: history,
config: _config,
readyListeners: readyListeners,
optionalRequires: usedClasses,
requiresMap: _requiresMap,
hasFileLoadError: false,
scriptsLoading: 0,
classesLoading: [],
syncModeEnabled: false,
missingQueue: _missingQueue,
init: function() {
var scripts = document.getElementsByTagName('script'),
src = scripts[scripts.length - 1].src,
path = src.substring(0, src.lastIndexOf('/') + 1),
meta = Ext._classPathMetadata,
microloader = Ext.Microloader,
manifest = Ext.manifest,
loadOrder, baseUrl, loadlen, l, loadItem;
if (src.indexOf("packages/sencha-core/src/") !== -1) {
path = path + "../../";
} else if (src.indexOf("/core/src/class/") !== -1) {
path = path + "../../../";
}
if (!Manager.getPath("Ext")) {
Manager.setPath('Ext', path + 'src');
}
if (meta) {
Ext._classPathMetadata = null;
Loader.addClassPathMappings(meta);
}
if (manifest) {
loadOrder = manifest.loadOrder;
baseUrl = Ext.Boot.baseUrl;
if (loadOrder && manifest.bootRelative) {
for (loadlen = loadOrder.length , l = 0; l < loadlen; l++) {
loadItem = loadOrder[l];
loadItem.path = baseUrl + loadItem.path;
}
}
}
if (microloader) {
Ready.block();
microloader.onMicroloaderReady(function() {
Ready.unblock();
});
}
},
setConfig: Ext.Function.flexSetter(function(name, value) {
if (name === 'paths') {
Loader.setPath(value);
} else {
_config[name] = value;
var delegated = delegatedConfigs[name];
if (delegated) {
Boot.setConfig((delegated === true) ? name : delegated, value);
}
}
return Loader;
}),
getConfig: function(name) {
return name ? _config[name] : _config;
},
setPath: function() {
Manager.setPath.apply(Manager, arguments);
return Loader;
},
addClassPathMappings: function(paths) {
Manager.setPath(paths);
return Loader;
},
addBaseUrlClassPathMappings: function(pathConfig) {
for (var name in pathConfig) {
pathConfig[name] = Boot.baseUrl + pathConfig[name];
}
Ext.Loader.addClassPathMappings(pathConfig);
},
getPath: function(className) {
return Manager.getPath(className);
},
require: function(expressions, fn, scope, excludes) {
if (excludes) {
return Loader.exclude(excludes).require(expressions, fn, scope);
}
var classNames = Manager.getNamesByExpression(expressions);
return Loader.load(classNames, fn, scope);
},
syncRequire: function() {
var wasEnabled = Loader.syncModeEnabled;
Loader.syncModeEnabled = true;
var ret = Loader.require.apply(Loader, arguments);
Loader.syncModeEnabled = wasEnabled;
return ret;
},
exclude: function(excludes) {
var selector = Manager.select({
require: function(classNames, fn, scope) {
return Loader.load(classNames, fn, scope);
},
syncRequire: function(classNames, fn, scope) {
var wasEnabled = Loader.syncModeEnabled;
Loader.syncModeEnabled = true;
var ret = Loader.load(classNames, fn, scope);
Loader.syncModeEnabled = wasEnabled;
return ret;
}
});
selector.exclude(excludes);
return selector;
},
load: function(classNames, callback, scope) {
if (callback) {
if (callback.length) {
callback = Loader.makeLoadCallback(classNames, callback);
}
callback = callback.bind(scope || Ext.global);
}
var missingClassNames = [],
numClasses = classNames.length,
className, i, numMissing,
urls = [],
state = Manager.classState;
for (i = 0; i < numClasses; ++i) {
className = Manager.resolveName(classNames[i]);
if (!Manager.isCreated(className)) {
missingClassNames.push(className);
_missingQueue[className] = Loader.getPath(className);
if (!state[className]) {
urls.push(_missingQueue[className]);
}
}
}
numMissing = missingClassNames.length;
if (numMissing) {
Loader.missingCount += numMissing;
Ext.Array.push(Loader.classesLoading, missingClassNames);
Manager.onCreated(function() {
Ext.Array.remove(Loader.classesLoading, missingClassNames);
Ext.each(missingClassNames, function(name) {
Ext.Array.remove(Loader.classesLoading, name);
});
if (callback) {
Ext.callback(callback, scope, arguments);
}
Loader.checkReady();
}, Loader, missingClassNames);
if (!_config.enabled) {
Ext.Error.raise("Ext.Loader is not enabled, so dependencies cannot be resolved dynamically. " + "Missing required class" + ((missingClassNames.length > 1) ? "es" : "") + ": " + missingClassNames.join(', '));
}
if (urls.length) {
Loader.loadScripts({
url: urls,
_classNames: missingClassNames
});
} else {
Loader.checkReady();
}
} else {
if (callback) {
callback.call(scope);
}
Loader.checkReady();
}
if (Loader.syncModeEnabled) {
if (numClasses === 1) {
return Manager.get(classNames[0]);
}
}
return Loader;
},
makeLoadCallback: function(classNames, callback) {
return function() {
var classes = [],
i = classNames.length;
while (i-- > 0) {
classes[i] = Manager.get(classNames[i]);
}
return callback.apply(this, classes);
};
},
onLoadFailure: function() {
var options = this,
onError = options.onError;
Loader.hasFileLoadError = true;
--Loader.scriptsLoading;
if (onError) {
onError.call(options.userScope, options);
} else {
Ext.log.error("[Ext.Loader] Some requested files failed to load.");
}
Loader.checkReady();
},
onLoadSuccess: function() {
var options = this,
onLoad = options.onLoad;
--Loader.scriptsLoading;
if (onLoad) {
onLoad.call(options.userScope, options);
}
Loader.checkReady();
},
reportMissingClasses: function() {
if (!Loader.syncModeEnabled && !Loader.scriptsLoading && Loader.isLoading && !Loader.hasFileLoadError) {
var missingClasses = [],
missingPaths = [];
for (var missingClassName in _missingQueue) {
missingClasses.push(missingClassName);
missingPaths.push(_missingQueue[missingClassName]);
}
if (missingClasses.length) {
throw new Error("The following classes are not declared even if their files have been " + "loaded: '" + missingClasses.join("', '") + "'. Please check the source code of their " + "corresponding files for possible typos: '" + missingPaths.join("', '"));
}
}
},
onReady: function(fn, scope, withDomReady, options) {
if (withDomReady) {
Ready.on(fn, scope, options);
} else {
var listener = Ready.makeListener(fn, scope, options);
if (Loader.isLoading) {
readyListeners.push(listener);
} else {
Ready.invoke(listener);
}
}
},
addUsedClasses: function(classes) {
var cls, i, ln;
if (classes) {
classes = (typeof classes === 'string') ? [
classes
] : classes;
for (i = 0 , ln = classes.length; i < ln; i++) {
cls = classes[i];
if (typeof cls === 'string' && !Ext.Array.contains(usedClasses, cls)) {
usedClasses.push(cls);
}
}
}
return Loader;
},
triggerReady: function() {
var listener,
refClasses = usedClasses;
if (Loader.isLoading && refClasses.length) {
usedClasses = [];
Loader.require(refClasses);
} else {
Loader.isLoading = false;
readyListeners.sort(Ready.sortFn);
while (readyListeners.length && !Loader.isLoading) {
listener = readyListeners.pop();
Ready.invoke(listener);
}
Ready.unblock();
}
},
historyPush: function(className) {
if (className && !isInHistory[className] && !Manager.overrideMap[className]) {
isInHistory[className] = true;
history.push(className);
}
return Loader;
},
loadScripts: function(params) {
var manifest = Ext.manifest,
loadOrder = manifest && manifest.loadOrder,
loadOrderMap = manifest && manifest.loadOrderMap,
options;
++Loader.scriptsLoading;
if (loadOrder && !loadOrderMap) {
manifest.loadOrderMap = loadOrderMap = Boot.createLoadOrderMap(loadOrder);
}
Loader.checkReady();
options = Ext.apply({
loadOrder: loadOrder,
loadOrderMap: loadOrderMap,
charset: _config.scriptCharset,
success: Loader.onLoadSuccess,
failure: Loader.onLoadFailure,
sync: Loader.syncModeEnabled,
_classNames: []
}, params);
options.userScope = options.scope;
options.scope = options;
Boot.load(options);
},
loadScriptsSync: function(urls) {
var syncwas = Loader.syncModeEnabled;
Loader.syncModeEnabled = true;
Loader.loadScripts({
url: urls
});
Loader.syncModeEnabled = syncwas;
},
loadScriptsSyncBasePrefix: function(urls) {
var syncwas = Loader.syncModeEnabled;
Loader.syncModeEnabled = true;
Loader.loadScripts({
url: urls,
prependBaseUrl: true
});
Loader.syncModeEnabled = syncwas;
},
loadScript: function(options) {
var isString = typeof options === 'string',
isArray = options instanceof Array,
isObject = !isArray && !isString,
url = isObject ? options.url : options,
onError = isObject && options.onError,
onLoad = isObject && options.onLoad,
scope = isObject && options.scope,
request = {
url: url,
scope: scope,
onLoad: onLoad,
onError: onError,
_classNames: []
};
Loader.loadScripts(request);
},
flushMissingQueue: function() {
var name, val,
missingwas = 0,
missing = 0;
for (name in _missingQueue) {
missingwas++;
val = _missingQueue[name];
if (Manager.isCreated(name)) {
delete _missingQueue[name];
} else if (Manager.existCache[name] === 2) {
delete _missingQueue[name];
} else {
++missing;
}
}
this.missingCount = missing;
},
checkReady: function() {
var wasLoading = Loader.isLoading,
isLoading;
Loader.flushMissingQueue();
isLoading = Loader.missingCount + Loader.scriptsLoading;
if (isLoading && !wasLoading) {
Ready.block();
Loader.isLoading = !!isLoading;
} else if (!isLoading && wasLoading) {
Loader.triggerReady();
}
}
});
Ext.require = alias(Loader, 'require');
Ext.syncRequire = alias(Loader, 'syncRequire');
Ext.exclude = alias(Loader, 'exclude');
Class.registerPreprocessor('loader', function(cls, data, hooks, continueFn) {
Ext.classSystemMonitor && Ext.classSystemMonitor(cls, 'Ext.Loader#loaderPreprocessor', arguments);
var me = this,
dependencies = [],
dependency,
className = Manager.getName(cls),
i, j, ln, subLn, value, propertyName, propertyValue, requiredMap;
for (i = 0 , ln = dependencyProperties.length; i < ln; i++) {
propertyName = dependencyProperties[i];
if (data.hasOwnProperty(propertyName)) {
propertyValue = data[propertyName];
if (typeof propertyValue === 'string') {
dependencies.push(propertyValue);
} else if (propertyValue instanceof Array) {
for (j = 0 , subLn = propertyValue.length; j < subLn; j++) {
value = propertyValue[j];
if (typeof value === 'string') {
dependencies.push(value);
}
}
} else if (typeof propertyValue !== 'function') {
for (j in propertyValue) {
if (propertyValue.hasOwnProperty(j)) {
value = propertyValue[j];
if (typeof value === 'string') {
dependencies.push(value);
}
}
}
}
}
}
if (dependencies.length === 0) {
return;
}
if (className) {
_requiresMap[className] = dependencies;
}
var deadlockPath = [],
detectDeadlock;
if (className) {
requiredMap = Loader.requiredByMap || (Loader.requiredByMap = {});
for (i = 0 , ln = dependencies.length; i < ln; i++) {
dependency = dependencies[i];
(requiredMap[dependency] || (requiredMap[dependency] = [])).push(className);
}
detectDeadlock = function(cls) {
deadlockPath.push(cls);
if (_requiresMap[cls]) {
if (Ext.Array.contains(_requiresMap[cls], className)) {
Ext.Error.raise("Circular requirement detected! '" + className + "' and '" + deadlockPath[1] + "' mutually require each other. Path: " + deadlockPath.join(' -> ') + " -> " + deadlockPath[0]);
}
for (i = 0 , ln = _requiresMap[cls].length; i < ln; i++) {
detectDeadlock(_requiresMap[cls][i]);
}
}
};
detectDeadlock(className);
}
(className ? Loader.exclude(className) : Loader).require(dependencies, function() {
for (i = 0 , ln = dependencyProperties.length; i < ln; i++) {
propertyName = dependencyProperties[i];
if (data.hasOwnProperty(propertyName)) {
propertyValue = data[propertyName];
if (typeof propertyValue === 'string') {
data[propertyName] = Manager.get(propertyValue);
} else if (propertyValue instanceof Array) {
for (j = 0 , subLn = propertyValue.length; j < subLn; j++) {
value = propertyValue[j];
if (typeof value === 'string') {
data[propertyName][j] = Manager.get(value);
}
}
} else if (typeof propertyValue !== 'function') {
for (var k in propertyValue) {
if (propertyValue.hasOwnProperty(k)) {
value = propertyValue[k];
if (typeof value === 'string') {
data[propertyName][k] = Manager.get(value);
}
}
}
}
}
}
continueFn.call(me, cls, data, hooks);
});
return false;
}, true, 'after', 'className');
Manager.registerPostprocessor('uses', function(name, cls, data) {
Ext.classSystemMonitor && Ext.classSystemMonitor(cls, 'Ext.Loader#usesPostprocessor', arguments);
var manifest = Ext.manifest,
loadOrder = manifest && manifest.loadOrder,
classes = manifest && manifest.classes,
uses, clazz, item, len, i, indexMap;
if (loadOrder) {
clazz = classes[name];
if (clazz && !isNaN(i = clazz.idx)) {
item = loadOrder[i];
uses = item.uses;
indexMap = {};
for (len = uses.length , i = 0; i < len; i++) {
indexMap[uses[i]] = true;
}
uses = Ext.Boot.getPathsFromIndexes(indexMap, loadOrder, true);
if (uses.length > 0) {
Loader.loadScripts({
url: uses,
sequential: true
});
}
}
}
if (data.uses) {
uses = data.uses;
Loader.addUsedClasses(uses);
}
});
Manager.onCreated(Loader.historyPush);
Loader.init();
}());
Ext._endTime = new Date().getTime();
if (Ext._beforereadyhandler) {
Ext._beforereadyhandler();
}
Ext.define('Ext.Mixin', function(Mixin) {
return {
statics: {
addHook: function(hookFn, targetClass, methodName, mixinClassPrototype) {
var isFunc = Ext.isFunction(hookFn),
hook = function() {
var a = arguments,
fn = isFunc ? hookFn : mixinClassPrototype[hookFn],
result = this.callParent(a);
fn.apply(this, a);
return result;
},
existingFn = targetClass.hasOwnProperty(methodName) && targetClass[methodName];
if (isFunc) {
hookFn.$previous = Ext.emptyFn;
}
hook.$name = methodName;
hook.$owner = targetClass.self;
if (existingFn) {
hook.$previous = existingFn.$previous;
existingFn.$previous = hook;
} else {
targetClass[methodName] = hook;
}
}
},
onClassExtended: function(cls, data) {
var mixinConfig = data.mixinConfig,
hooks = data.xhooks,
superclass = cls.superclass,
onClassMixedIn = data.onClassMixedIn,
parentMixinConfig, befores, afters, extended;
if (hooks) {
delete data.xhooks;
(mixinConfig || (data.mixinConfig = mixinConfig = {})).on = hooks;
}
if (mixinConfig) {
parentMixinConfig = superclass.mixinConfig;
if (parentMixinConfig) {
data.mixinConfig = mixinConfig = Ext.merge({}, parentMixinConfig, mixinConfig);
}
data.mixinId = mixinConfig.id;
if (mixinConfig.beforeHooks) {
Ext.Error.raise('Use of "beforeHooks" is deprecated - use "before" instead');
}
if (mixinConfig.hooks) {
Ext.Error.raise('Use of "hooks" is deprecated - use "after" instead');
}
if (mixinConfig.afterHooks) {
Ext.Error.raise('Use of "afterHooks" is deprecated - use "after" instead');
}
befores = mixinConfig.before;
afters = mixinConfig.after;
hooks = mixinConfig.on;
extended = mixinConfig.extended;
}
if (befores || afters || hooks || extended) {
data.onClassMixedIn = function(targetClass) {
var mixin = this.prototype,
targetProto = targetClass.prototype,
key;
if (befores) {
Ext.Object.each(befores, function(key, value) {
targetClass.addMember(key, function() {
if (mixin[value].apply(this, arguments) !== false) {
return this.callParent(arguments);
}
});
});
}
if (afters) {
Ext.Object.each(afters, function(key, value) {
targetClass.addMember(key, function() {
var ret = this.callParent(arguments);
mixin[value].apply(this, arguments);
return ret;
});
});
}
if (hooks) {
for (key in hooks) {
Mixin.addHook(hooks[key], targetProto, key, mixin);
}
}
if (extended) {
targetClass.onExtended(function() {
var args = Ext.Array.slice(arguments, 0);
args.unshift(targetClass);
return extended.apply(this, args);
}, this);
}
if (onClassMixedIn) {
onClassMixedIn.apply(this, arguments);
}
};
}
}
};
});
Ext.util = Ext.util || {};
Ext.util.DelayedTask = function(fn, scope, args, cancelOnDelay, fireIdleEvent) {
var me = this,
delay,
call = function() {
var globalEvents = Ext.GlobalEvents;
clearInterval(me.id);
me.id = null;
fn.apply(scope, args || []);
if (fireIdleEvent !== false && globalEvents.hasListeners.idle) {
globalEvents.fireEvent('idle');
}
};
cancelOnDelay = typeof cancelOnDelay === 'boolean' ? cancelOnDelay : true;
me.id = null;
me.delay = function(newDelay, newFn, newScope, newArgs) {
if (cancelOnDelay) {
me.cancel();
}
if (typeof newDelay === 'number') {
delay = newDelay;
}
fn = newFn || fn;
scope = newScope || scope;
args = newArgs || args;
if (!me.id) {
me.id = Ext.interval(call, delay);
}
};
me.cancel = function() {
if (me.id) {
clearInterval(me.id);
me.id = null;
}
};
};
Ext.define('Ext.util.Event', function() {
var arraySlice = Array.prototype.slice,
arrayInsert = Ext.Array.insert,
toArray = Ext.Array.toArray,
fireArgs = {};
return {
requires: 'Ext.util.DelayedTask',
isEvent: true,
suspended: 0,
noOptions: {},
constructor: function(observable, name) {
this.name = name;
this.observable = observable;
this.listeners = [];
},
addListener: function(fn, scope, options, caller, manager) {
var me = this,
added = false,
observable = me.observable,
eventName = me.name,
listeners, listener, priority, isNegativePriority, highestNegativePriorityIndex, hasNegativePriorityIndex, length, index, i, listenerPriority;
if (scope && !Ext._namedScopes[scope] && (typeof fn === 'string') && (typeof scope[fn] !== 'function')) {
Ext.Error.raise("No method named '" + fn + "' found on scope object");
}
if (me.findListener(fn, scope) === -1) {
listener = me.createListener(fn, scope, options, caller, manager);
if (me.firing) {
me.listeners = me.listeners.slice(0);
}
listeners = me.listeners;
index = length = listeners.length;
priority = options && options.priority;
highestNegativePriorityIndex = me._highestNegativePriorityIndex;
hasNegativePriorityIndex = highestNegativePriorityIndex !== undefined;
if (priority) {
isNegativePriority = (priority < 0);
if (!isNegativePriority || hasNegativePriorityIndex) {
for (i = (isNegativePriority ? highestNegativePriorityIndex : 0); i < length; i++) {
listenerPriority = listeners[i].o ? listeners[i].o.priority || 0 : 0;
if (listenerPriority < priority) {
index = i;
break;
}
}
} else {
me._highestNegativePriorityIndex = index;
}
} else if (hasNegativePriorityIndex) {
index = highestNegativePriorityIndex;
}
if (!isNegativePriority && index <= highestNegativePriorityIndex) {
me._highestNegativePriorityIndex++;
}
if (index === length) {
listeners[length] = listener;
} else {
arrayInsert(listeners, index, [
listener
]);
}
if (observable.isElement) {
observable._getPublisher(eventName).subscribe(observable, eventName, options.delegated !== false, options.capture);
}
added = true;
}
return added;
},
createListener: function(fn, scope, o, caller, manager) {
var me = this,
namedScope = Ext._namedScopes[scope],
listener = {
fn: fn,
scope: scope,
ev: me,
caller: caller,
manager: manager,
namedScope: namedScope,
defaultScope: namedScope ? (scope || me.observable) : undefined,
lateBound: typeof fn === 'string'
},
handler = fn,
wrapped = false,
type;
if (o) {
listener.o = o;
if (o.single) {
handler = me.createSingle(handler, listener, o, scope);
wrapped = true;
}
if (o.target) {
handler = me.createTargeted(handler, listener, o, scope, wrapped);
wrapped = true;
}
if (o.delay) {
handler = me.createDelayed(handler, listener, o, scope, wrapped);
wrapped = true;
}
if (o.buffer) {
handler = me.createBuffered(handler, listener, o, scope, wrapped);
wrapped = true;
}
if (me.observable.isElement) {
type = o.type;
if (type) {
listener.type = type;
}
}
}
listener.fireFn = handler;
listener.wrapped = wrapped;
return listener;
},
findListener: function(fn, scope) {
var listeners = this.listeners,
i = listeners.length,
listener;
while (i--) {
listener = listeners[i];
if (listener) {
if (listener.fn === fn && listener.scope == scope) {
return i;
}
}
}
return -1;
},
removeListener: function(fn, scope, index) {
var me = this,
removed = false,
observable = me.observable,
eventName = me.name,
listener, highestNegativePriorityIndex, options, k, manager, managedListeners, managedListener, i;
index = index || me.findListener(fn, scope);
if (index != -1) {
listener = me.listeners[index];
options = listener.o;
highestNegativePriorityIndex = me._highestNegativePriorityIndex;
if (me.firing) {
me.listeners = me.listeners.slice(0);
}
if (listener.task) {
listener.task.cancel();
delete listener.task;
}
k = listener.tasks && listener.tasks.length;
if (k) {
while (k--) {
listener.tasks[k].cancel();
}
delete listener.tasks;
}
me.listeners.splice(index, 1);
manager = listener.manager;
if (manager) {
managedListeners = manager.managedListeners;
if (managedListeners) {
for (i = managedListeners.length; i--; ) {
managedListener = managedListeners[i];
if (managedListener.item === me.observable && managedListener.ename === eventName && managedListener.fn === fn && managedListener.scope === scope) {
managedListeners.splice(i, 1);
}
}
}
}
if (highestNegativePriorityIndex) {
if (index < highestNegativePriorityIndex) {
me._highestNegativePriorityIndex--;
} else if (index === highestNegativePriorityIndex && index === me.listeners.length) {
delete me._highestNegativePriorityIndex;
}
}
if (observable.isElement) {
observable._getPublisher(eventName).unsubscribe(observable, eventName, options.delegated !== false, options.capture);
}
removed = true;
}
return removed;
},
clearListeners: function() {
var listeners = this.listeners,
i = listeners.length,
listener;
while (i--) {
listener = listeners[i];
this.removeListener(listener.fn, listener.scope);
}
},
suspend: function() {
++this.suspended;
},
resume: function() {
if (this.suspended) {
--this.suspended;
}
},
isSuspended: function() {
return this.suspended > 0;
},
fire: function() {
var me = this,
listeners = me.listeners,
count = listeners.length,
isElement = me.observable.isElement,
options, delegate, fireInfo, i, args, listener, len, delegateEl, currentTarget, type, chained, firingArgs, e;
if (!me.suspended && count > 0) {
me.firing = true;
args = arguments.length ? arraySlice.call(arguments, 0) : [];
len = args.length;
if (isElement) {
e = args[0];
}
for (i = 0; i < count; i++) {
listener = listeners[i];
options = listener.o;
if (isElement) {
if (currentTarget) {
e.setCurrentTarget(currentTarget);
}
type = listener.type;
if (type) {
chained = e;
e = args[0] = chained.chain({
type: type
});
}
Ext.EventObject = e;
}
firingArgs = args;
if (options) {
if (isElement) {
delegate = options.delegate;
if (delegate) {
delegateEl = e.getTarget('#' + e.currentTarget.id + ' ' + delegate);
if (delegateEl) {
args[1] = delegateEl;
currentTarget = e.currentTarget;
e.setCurrentTarget(delegateEl);
} else {
continue;
}
}
if (options.preventDefault) {
e.preventDefault();
}
if (options.stopPropagation) {
e.stopPropagation();
}
if (options.stopEvent) {
e.stopEvent();
}
}
args[len] = options;
if (options.args) {
firingArgs = options.args.concat(args);
}
}
fireInfo = me.getFireInfo(listener);
if (fireInfo.fn.apply(fireInfo.scope, firingArgs) === false) {
return (me.firing = false);
}
if (chained) {
e = args[0] = chained;
chained = null;
}
}
}
me.firing = false;
return true;
},
getFireInfo: function(listener, fromWrapped) {
var observable = this.observable,
fireFn = listener.fireFn,
scope = listener.scope,
namedScope = listener.namedScope,
fn;
if (!fromWrapped && listener.wrapped) {
fireArgs.fn = fireFn;
return fireArgs;
}
fn = fromWrapped ? listener.fn : fireFn;
var name = fn;
if (listener.lateBound) {
if (!scope || namedScope) {
scope = (listener.caller || observable).resolveListenerScope(listener.defaultScope);
}
if (!scope) {
Ext.Error.raise('Unable to dynamically resolve scope for "' + listener.ev.name + '" listener on ' + this.observable.id);
}
if (!Ext.isFunction(scope[fn])) {
Ext.Error.raise('No method named "' + fn + '" on ' + (scope.$className || 'scope object.'));
}
fn = scope[fn];
} else if (namedScope && namedScope.isController) {
scope = (listener.caller || observable).resolveListenerScope(listener.defaultScope);
if (!scope) {
Ext.Error.raise('Unable to dynamically resolve scope for "' + listener.ev.name + '" listener on ' + this.observable.id);
}
} else if (!scope || namedScope) {
scope = observable;
}
fireArgs.fn = fn;
fireArgs.scope = scope;
if (!fn) {
Ext.Error.raise('Unable to dynamically resolve method "' + name + '" on ' + this.observable.$className);
}
return fireArgs;
},
createTargeted: function(handler, listener, o, scope, wrapped) {
return function() {
if (o.target === arguments[0]) {
var fireInfo;
if (!wrapped) {
fireInfo = listener.ev.getFireInfo(listener, true);
handler = fireInfo.fn;
scope = fireInfo.scope;
}
return handler.apply(scope, arguments);
}
};
},
createBuffered: function(handler, listener, o, scope, wrapped) {
listener.task = new Ext.util.DelayedTask();
return function() {
var fireInfo;
if (!wrapped) {
fireInfo = listener.ev.getFireInfo(listener, true);
handler = fireInfo.fn;
scope = fireInfo.scope;
}
listener.task.delay(o.buffer, handler, scope, toArray(arguments));
};
},
createDelayed: function(handler, listener, o, scope, wrapped) {
return function() {
var task = new Ext.util.DelayedTask(),
fireInfo;
if (!wrapped) {
fireInfo = listener.ev.getFireInfo(listener, true);
handler = fireInfo.fn;
scope = fireInfo.scope;
}
if (!listener.tasks) {
listener.tasks = [];
}
listener.tasks.push(task);
task.delay(o.delay || 10, handler, scope, toArray(arguments));
};
},
createSingle: function(handler, listener, o, scope, wrapped) {
return function() {
var event = listener.ev,
fireInfo;
if (event.removeListener(listener.fn, scope) && event.observable) {
event.observable.hasListeners[event.name]--;
}
if (!wrapped) {
fireInfo = event.getFireInfo(listener, true);
handler = fireInfo.fn;
scope = fireInfo.scope;
}
return handler.apply(scope, arguments);
};
}
};
});
//@tag dom,core
Ext.define('Ext.mixin.Identifiable', {
statics: {
uniqueIds: {}
},
isIdentifiable: true,
mixinId: 'identifiable',
idCleanRegex: /\.|[^\w\-]/g,
defaultIdPrefix: 'ext-',
defaultIdSeparator: '-',
getOptimizedId: function() {
return this.id;
},
getUniqueId: function() {
var id = this.id,
prototype, separator, xtype, uniqueIds, prefix;
if (!(id || id === 0)) {
prototype = this.self.prototype;
separator = this.defaultIdSeparator;
uniqueIds = Ext.mixin.Identifiable.uniqueIds;
if (!prototype.hasOwnProperty('identifiablePrefix')) {
xtype = this.xtype;
if (xtype) {
prefix = this.defaultIdPrefix + xtype.replace(this.idCleanRegex, separator) + separator;
} else if (!(prefix = prototype.$className)) {
prefix = this.defaultIdPrefix + 'anonymous' + separator;
} else {
prefix = prefix.replace(this.idCleanRegex, separator).toLowerCase() + separator;
}
prototype.identifiablePrefix = prefix;
}
prefix = this.identifiablePrefix;
if (!uniqueIds.hasOwnProperty(prefix)) {
uniqueIds[prefix] = 0;
}
id = this.id = prefix + (++uniqueIds[prefix]);
}
this.getUniqueId = this.getOptimizedId;
return id;
},
setId: function(id) {
this.id = id;
},
getId: function() {
var id = this.id;
if (!id) {
id = this.getUniqueId();
}
this.getId = this.getOptimizedId;
return id;
}
});
Ext.define('Ext.mixin.Observable', function(Observable) {
var emptyFn = Ext.emptyFn,
emptyArray = [],
arrayProto = Array.prototype,
arraySlice = arrayProto.slice,
ListenerRemover = function(observable) {
if (observable instanceof ListenerRemover) {
return observable;
}
this.observable = observable;
if (arguments[1].isObservable) {
this.managedListeners = true;
}
this.args = arraySlice.call(arguments, 1);
};
ListenerRemover.prototype.destroy = function() {
this.destroy = Ext.emptyFn;
var observable = this.observable;
observable[this.managedListeners ? 'mun' : 'un'].apply(observable, this.args);
};
return {
extend: 'Ext.Mixin',
mixinConfig: {
id: 'observable',
after: {
destroy: 'clearListeners'
}
},
requires: [
'Ext.util.Event'
],
mixins: [
'Ext.mixin.Identifiable'
],
statics: {
releaseCapture: function(o) {
o.fireEventArgs = this.prototype.fireEventArgs;
},
capture: function(o, fn, scope) {
var newFn = function(eventName, args) {
return fn.apply(scope, [
eventName
].concat(args));
};
this.captureArgs(o, newFn, scope);
},
captureArgs: function(o, fn, scope) {
o.fireEventArgs = Ext.Function.createInterceptor(o.fireEventArgs, fn, scope);
},
observe: function(cls, listeners) {
if (cls) {
if (!cls.isObservable) {
Ext.applyIf(cls, new this());
this.captureArgs(cls.prototype, cls.fireEventArgs, cls);
}
if (Ext.isObject(listeners)) {
cls.on(listeners);
}
}
return cls;
},
prepareClass: function(T, mixin, data) {
var listeners = T.listeners = [],
target = data || T.prototype,
targetListeners = target.listeners,
superListeners = mixin ? mixin.listeners : T.superclass.self.listeners,
name, scope, namedScope;
if (superListeners) {
listeners.push(superListeners);
}
if (targetListeners) {
scope = targetListeners.scope;
if (!scope) {
targetListeners.scope = 'self';
} else {
namedScope = Ext._namedScopes[scope];
if (namedScope && namedScope.isController) {
targetListeners.scope = 'self.controller';
}
}
listeners.push(targetListeners);
target.listeners = null;
}
if (!T.HasListeners) {
var HasListeners = function() {},
SuperHL = T.superclass.HasListeners || (mixin && mixin.HasListeners) || Observable.HasListeners;
T.prototype.HasListeners = T.HasListeners = HasListeners;
HasListeners.prototype = T.hasListeners = new SuperHL();
}
}
},
isObservable: true,
eventsSuspended: 0,
constructor: function(config) {
var me = this,
self = me.self,
declaredListeners, listeners, bubbleEvents, len, i;
if (me.$observableInitialized) {
return;
}
me.$observableInitialized = true;
me.hasListeners = new me.HasListeners();
me.events = me.events || {};
declaredListeners = self.listeners;
if (declaredListeners && !me._addDeclaredListeners(declaredListeners)) {
self.listeners = null;
}
listeners = (config && config.listeners) || me.listeners;
if (listeners) {
if (listeners instanceof Array) {
for (i = 0 , len = listeners.length; i < len; ++i) {
me.addListener(listeners[i]);
}
} else {
me.addListener(listeners);
}
}
bubbleEvents = (config && config.bubbleEvents) || me.bubbleEvents;
if (bubbleEvents) {
me.enableBubble(bubbleEvents);
}
if (me.$applyConfigs) {
Ext.apply(me, config);
} else {
me.initConfig(config);
}
if (listeners) {
me.listeners = null;
}
},
onClassExtended: function(T, data) {
if (!T.HasListeners) {
Observable.prepareClass(T, T.prototype.$observableMixedIn ? undefined : data);
}
},
$eventOptions: {
scope: 1,
delay: 1,
buffer: 1,
onFrame: 1,
single: 1,
args: 1,
destroyable: 1,
priority: 1,
order: 1
},
$orderToPriority: {
before: 100,
current: 0,
after: -100
},
_addDeclaredListeners: function(listeners) {
var me = this;
if (listeners instanceof Array) {
Ext.each(listeners, me._addDeclaredListeners, me);
} else {
me._addedDeclaredListeners = true;
me.addListener(listeners);
}
return me._addedDeclaredListeners;
},
addManagedListener: function(item, ename, fn, scope, options,
noDestroy) {
var me = this,
managedListeners = me.managedListeners = me.managedListeners || [],
config, passedOptions;
if (typeof ename !== 'string') {
passedOptions = arguments.length > 4 ? options : ename;
options = ename;
for (ename in options) {
if (options.hasOwnProperty(ename)) {
config = options[ename];
if (!item.$eventOptions[ename]) {
me.addManagedListener(item, ename, config.fn || config, config.scope || options.scope || scope, config.fn ? config : passedOptions, true);
}
}
}
if (options && options.destroyable) {
return new ListenerRemover(me, item, options);
}
} else {
if (fn !== emptyFn) {
item.doAddListener(ename, fn, scope, options, null, me, me);
if (!noDestroy && options && options.destroyable) {
return new ListenerRemover(me, item, ename, fn, scope);
}
}
}
},
removeManagedListener: function(item, ename, fn, scope) {
var me = this,
options, config, managedListeners, length, i;
if (typeof ename !== 'string') {
options = ename;
for (ename in options) {
if (options.hasOwnProperty(ename)) {
config = options[ename];
if (!item.$eventOptions[ename]) {
me.removeManagedListener(item, ename, config.fn || config, config.scope || options.scope || scope);
}
}
}
} else {
managedListeners = me.managedListeners ? me.managedListeners.slice() : [];
ename = Ext.canonicalEventName(ename);
for (i = 0 , length = managedListeners.length; i < length; i++) {
me.removeManagedListenerItem(false, managedListeners[i], item, ename, fn, scope);
}
}
},
fireEvent: function(eventName) {
return this.fireEventArgs(eventName, arraySlice.call(arguments, 1));
},
resolveListenerScope: function(defaultScope) {
var namedScope = Ext._namedScopes[defaultScope];
if (namedScope) {
if (namedScope.isController) {
Ext.Error.raise('scope: "controller" can only be specified on classes that derive from Ext.Component or Ext.Widget');
}
if (namedScope.isSelf || namedScope.isThis) {
defaultScope = null;
}
}
return defaultScope || this;
},
fireEventArgs: function(eventName, args) {
eventName = Ext.canonicalEventName(eventName);
var me = this,
events = me.events,
event = events && events[eventName],
ret = true;
if (me.hasListeners[eventName]) {
ret = me.doFireEvent(eventName, args || emptyArray, event ? event.bubble : false);
}
return ret;
},
fireAction: function(eventName, args, fn, scope, options, order) {
options = options ? Ext.Object.chain(options) : {};
options.single = true;
options.priority = ((order === 'after') ? -99.5 : 99.5);
this.doAddListener(eventName, fn, scope, options);
this.fireEventArgs(eventName, args);
},
doFireEvent: function(eventName, args, bubbles) {
var target = this,
queue, event,
ret = true;
do {
if (target.eventsSuspended) {
if ((queue = target.eventQueue)) {
queue.push([
eventName,
args
]);
}
return ret;
} else {
event = target.events && target.events[eventName];
if (event && event !== true) {
if ((ret = event.fire.apply(event, args)) === false) {
break;
}
}
}
} while (
bubbles && (target = target.getBubbleParent()));
return ret;
},
getBubbleParent: function() {
var me = this,
parent = me.getBubbleTarget && me.getBubbleTarget();
if (parent && parent.isObservable) {
return parent;
}
return null;
},
addListener: function(ename, fn, scope, options, order,
caller) {
var me = this,
namedScopes = Ext._namedScopes,
config, namedScope, isClassListener, innerScope, eventOptions;
if (typeof ename !== 'string') {
options = ename;
scope = options.scope;
namedScope = scope && namedScopes[scope];
isClassListener = namedScope && namedScope.isSelf;
eventOptions = ((me.isComponent || me.isWidget) && options.element) ? me.$elementEventOptions : me.$eventOptions;
for (ename in options) {
config = options[ename];
if (!eventOptions[ename]) {
innerScope = config.scope;
if (innerScope && isClassListener) {
namedScope = namedScopes[innerScope];
if (namedScope && namedScope.isController) {
innerScope = 'self.controller';
}
}
me.doAddListener(ename, config.fn || config, innerScope || scope, config.fn ? config : options, order, caller);
}
}
if (options && options.destroyable) {
return new ListenerRemover(me, options);
}
} else {
me.doAddListener(ename, fn, scope, options, order, caller);
if (options && options.destroyable) {
return new ListenerRemover(me, ename, fn, scope, options);
}
}
return me;
},
removeListener: function(ename, fn, scope,
eventOptions) {
var me = this,
config, options;
if (typeof ename !== 'string') {
options = ename;
eventOptions = eventOptions || me.$eventOptions;
for (ename in options) {
if (options.hasOwnProperty(ename)) {
config = options[ename];
if (!me.$eventOptions[ename]) {
me.doRemoveListener(ename, config.fn || config, config.scope || options.scope);
}
}
}
} else {
me.doRemoveListener(ename, fn, scope);
}
return me;
},
clearListeners: function() {
var me = this,
events = me.events,
hasListeners = me.hasListeners,
event, key;
if (events) {
for (key in events) {
if (events.hasOwnProperty(key)) {
event = events[key];
if (event.isEvent) {
delete hasListeners[key];
event.clearListeners();
}
}
}
}
me.clearManagedListeners();
},
purgeListeners: function() {
if (Ext.global.console) {
Ext.global.console.warn('Observable: purgeListeners has been deprecated. Please use clearListeners.');
}
return this.clearListeners.apply(this, arguments);
},
clearManagedListeners: function() {
var me = this,
managedListeners = me.managedListeners ? me.managedListeners.slice() : [],
i = 0,
len = managedListeners.length;
for (; i < len; i++) {
me.removeManagedListenerItem(true, managedListeners[i]);
}
me.managedListeners = [];
},
removeManagedListenerItem: function(isClear, managedListener, item, ename, fn, scope) {
if (isClear || (managedListener.item === item && managedListener.ename === ename && (!fn || managedListener.fn === fn) && (!scope || managedListener.scope === scope))) {
managedListener.item.doRemoveListener(managedListener.ename, managedListener.fn, managedListener.scope, managedListener.options);
if (!isClear) {
Ext.Array.remove(this.managedListeners, managedListener);
}
}
},
purgeManagedListeners: function() {
if (Ext.global.console) {
Ext.global.console.warn('Observable: purgeManagedListeners has been deprecated. Please use clearManagedListeners.');
}
return this.clearManagedListeners.apply(this, arguments);
},
hasListener: function(ename) {
ename = Ext.canonicalEventName(ename);
return !!this.hasListeners[ename];
},
isSuspended: function(event) {
var suspended = this.eventsSuspended > 0,
events = this.events;
if (!suspended && event && events) {
event = events[event];
if (event && event.isEvent) {
return event.isSuspended();
}
}
return suspended;
},
suspendEvents: function(queueSuspended) {
++this.eventsSuspended;
if (queueSuspended && !this.eventQueue) {
this.eventQueue = [];
}
},
suspendEvent: function() {
var me = this,
events = me.events,
len = arguments.length,
i, event, ename;
for (i = 0; i < len; i++) {
ename = arguments[i];
ename = Ext.canonicalEventName(ename);
event = events[ename];
if (!event || !event.isEvent) {
event = me._initEvent(ename);
}
event.suspend();
}
},
resumeEvent: function() {
var events = this.events || 0,
len = events && arguments.length,
i, event;
for (i = 0; i < len; i++) {
event = events[arguments[i]];
if (event && event.resume) {
event.resume();
}
}
},
resumeEvents: function(discardQueue) {
var me = this,
queued = me.eventQueue,
qLen, q;
if (me.eventsSuspended && !--me.eventsSuspended) {
delete me.eventQueue;
if (!discardQueue && queued) {
qLen = queued.length;
for (q = 0; q < qLen; q++) {
me.fireEventArgs.apply(me, queued[q]);
}
}
}
},
relayEvents: function(origin, events, prefix) {
var me = this,
len = events.length,
i = 0,
oldName,
relayers = {};
for (; i < len; i++) {
oldName = events[i];
relayers[oldName] = me.createRelayer(prefix ? prefix + oldName : oldName);
}
me.mon(origin, relayers, null, null, undefined);
return new ListenerRemover(me, origin, relayers);
},
createRelayer: function(newName, beginEnd) {
var me = this;
return function() {
return me.fireEventArgs.call(me, newName, beginEnd ? arraySlice.apply(arguments, beginEnd) : arguments);
};
},
enableBubble: function(eventNames) {
if (eventNames) {
var me = this,
names = (typeof eventNames == 'string') ? arguments : eventNames,
events = me.events,
length = events && names.length,
ename, event, i;
for (i = 0; i < length; ++i) {
ename = names[i];
ename = Ext.canonicalEventName(ename);
event = events[ename];
if (!event || !event.isEvent) {
event = me._initEvent(ename);
}
me.hasListeners._incr_(ename);
event.bubble = true;
}
}
},
destroy: function() {
this.clearListeners();
this.callParent();
},
privates: {
doAddListener: function(ename, fn, scope, options, order, caller, manager) {
var me = this,
event, managedListeners, priority;
order = order || (options && options.order);
if (order) {
priority = (options && options.priority);
if (!priority) {
options = options ? Ext.Object.chain(options) : {};
options.priority = me.$orderToPriority[order];
}
}
ename = Ext.canonicalEventName(ename);
if (!fn) {
Ext.Error.raise("Cannot add '" + ename + "' listener to " + me.$className + " instance. No function specified.");
}
if (!manager && (scope && scope.isObservable && (scope !== me))) {
manager = scope;
}
if (manager) {
managedListeners = manager.managedListeners = manager.managedListeners || [];
managedListeners.push({
item: me,
ename: ename,
fn: fn,
scope: scope,
options: options
});
}
event = (me.events || (me.events = {}))[ename];
if (!event || !event.isEvent) {
event = me._initEvent(ename);
}
if (fn !== emptyFn) {
if (event.addListener(fn, scope, options, caller, manager)) {
me.hasListeners._incr_(ename);
}
}
},
doRemoveListener: function(ename, fn, scope) {
var me = this,
events = me.events,
event;
ename = Ext.canonicalEventName(ename);
event = events && events[ename];
if (!fn) {
Ext.Error.raise("Cannot remove '" + ename + "' listener to " + me.$className + " instance. No function specified.");
}
if (event && event.isEvent) {
if (event.removeListener(fn, scope)) {
me.hasListeners._decr_(ename);
}
}
},
_initEvent: function(eventName) {
return (this.events[eventName] = new Ext.util.Event(this, eventName));
}
},
deprecated: {
'5.0': {
methods: {
addEvents: null
}
},
'5.1': {
methods: {
addBeforeListener: function(eventName, fn, scope, options) {
return this.addListener(eventName, fn, scope, options, 'before');
},
addAfterListener: function(eventName, fn, scope, options) {
return this.addListener(eventName, fn, scope, options, 'after');
},
removeBeforeListener: function(eventName, fn, scope, options) {
return this.removeListener(eventName, fn, scope, options, 'before');
},
removeAfterListener: function(eventName, fn, scope, options) {
return this.removeListener(eventName, fn, scope, options, 'after');
},
onBefore: 'addBeforeListener',
onAfter: 'addAfterListener',
unBefore: 'removeBeforeListener',
unAfter: 'removeAfterListener'
}
}
}
};
}, function() {
var Observable = this,
proto = Observable.prototype,
HasListeners = function() {},
prepareMixin = function(T) {
if (!T.HasListeners) {
var proto = T.prototype;
proto.$observableMixedIn = 1;
Observable.prepareClass(T, this);
T.onExtended(function(U, data) {
Ext.classSystemMonitor && Ext.classSystemMonitor('extend mixin', arguments);
Observable.prepareClass(U, null, data);
});
if (proto.onClassMixedIn) {
Ext.override(T, {
onClassMixedIn: function(U) {
prepareMixin.call(this, U);
this.callParent(arguments);
}
});
} else {
proto.onClassMixedIn = function(U) {
prepareMixin.call(this, U);
};
}
}
superOnClassMixedIn.call(this, T);
},
superOnClassMixedIn = proto.onClassMixedIn;
HasListeners.prototype = {
_decr_: function(ev) {
if (!--this[ev]) {
delete this[ev];
}
},
_incr_: function(ev) {
if (this.hasOwnProperty(ev)) {
++this[ev];
} else {
this[ev] = 1;
}
}
};
proto.HasListeners = Observable.HasListeners = HasListeners;
Observable.createAlias({
on: 'addListener',
un: 'removeListener',
mon: 'addManagedListener',
mun: 'removeManagedListener',
setListeners: 'addListener'
});
Observable.observeClass = Observable.observe;
function getMethodEvent(method) {
var e = (this.methodEvents = this.methodEvents || {})[method],
returnValue, v, cancel,
obj = this,
makeCall;
if (!e) {
this.methodEvents[method] = e = {};
e.originalFn = this[method];
e.methodName = method;
e.before = [];
e.after = [];
makeCall = function(fn, scope, args) {
if ((v = fn.apply(scope || obj, args)) !== undefined) {
if (typeof v == 'object') {
if (v.returnValue !== undefined) {
returnValue = v.returnValue;
} else {
returnValue = v;
}
cancel = !!v.cancel;
} else if (v === false) {
cancel = true;
} else {
returnValue = v;
}
}
};
this[method] = function() {
var args = Array.prototype.slice.call(arguments, 0),
b, i, len;
returnValue = v = undefined;
cancel = false;
for (i = 0 , len = e.before.length; i < len; i++) {
b = e.before[i];
makeCall(b.fn, b.scope, args);
if (cancel) {
return returnValue;
}
}
if ((v = e.originalFn.apply(obj, args)) !== undefined) {
returnValue = v;
}
for (i = 0 , len = e.after.length; i < len; i++) {
b = e.after[i];
makeCall(b.fn, b.scope, args);
if (cancel) {
return returnValue;
}
}
return returnValue;
};
}
return e;
}
Ext.apply(proto, {
onClassMixedIn: prepareMixin,
beforeMethod: function(method, fn, scope) {
getMethodEvent.call(this, method).before.push({
fn: fn,
scope: scope
});
},
afterMethod: function(method, fn, scope) {
getMethodEvent.call(this, method).after.push({
fn: fn,
scope: scope
});
},
removeMethodListener: function(method, fn, scope) {
var e = this.getMethodEvent(method),
i, len;
for (i = 0 , len = e.before.length; i < len; i++) {
if (e.before[i].fn == fn && e.before[i].scope == scope) {
Ext.Array.erase(e.before, i, 1);
return;
}
}
for (i = 0 , len = e.after.length; i < len; i++) {
if (e.after[i].fn == fn && e.after[i].scope == scope) {
Ext.Array.erase(e.after, i, 1);
return;
}
}
},
toggleEventLogging: function(toggle) {
Ext.util.Observable[toggle ? 'capture' : 'releaseCapture'](this, function(en) {
if (Ext.isDefined(Ext.global.console)) {
Ext.global.console.log(en, arguments);
}
});
}
});
});
Ext.define('Ext.util.HashMap', {
mixins: [
'Ext.mixin.Observable'
],
generation: 0,
config: {
keyFn: null
},
constructor: function(config) {
var me = this,
fn;
me.mixins.observable.constructor.call(me, config);
me.clear(true);
fn = me.getKeyFn();
if (fn) {
me.getKey = fn;
}
},
getCount: function() {
return this.length;
},
getData: function(key, value) {
if (value === undefined) {
value = key;
key = this.getKey(value);
}
return [
key,
value
];
},
getKey: function(o) {
return o.id;
},
add: function(key, value) {
var me = this;
if (arguments.length === 1) {
value = key;
key = me.getKey(value);
}
if (me.containsKey(key)) {
return me.replace(key, value);
}
me.map[key] = value;
++me.length;
me.generation++;
if (me.hasListeners.add) {
me.fireEvent('add', me, key, value);
}
return value;
},
replace: function(key, value) {
var me = this,
map = me.map,
old;
if (arguments.length === 1) {
value = key;
key = me.getKey(value);
}
if (!me.containsKey(key)) {
me.add(key, value);
}
old = map[key];
map[key] = value;
me.generation++;
if (me.hasListeners.replace) {
me.fireEvent('replace', me, key, value, old);
}
return value;
},
remove: function(o) {
var key = this.findKey(o);
if (key !== undefined) {
return this.removeAtKey(key);
}
return false;
},
removeAtKey: function(key) {
var me = this,
value;
if (me.containsKey(key)) {
value = me.map[key];
delete me.map[key];
--me.length;
me.generation++;
if (me.hasListeners.remove) {
me.fireEvent('remove', me, key, value);
}
return true;
}
return false;
},
get: function(key) {
var map = this.map;
return map.hasOwnProperty(key) ? map[key] : undefined;
},
clear: function(
initial) {
var me = this;
if (initial || me.generation) {
me.map = {};
me.length = 0;
me.generation = initial ? 0 : me.generation + 1;
}
if (initial !== true && me.hasListeners.clear) {
me.fireEvent('clear', me);
}
return me;
},
containsKey: function(key) {
var map = this.map;
return map.hasOwnProperty(key) && map[key] !== undefined;
},
contains: function(value) {
return this.containsKey(this.findKey(value));
},
getKeys: function() {
return this.getArray(true);
},
getValues: function() {
return this.getArray(false);
},
getArray: function(isKey) {
var arr = [],
key,
map = this.map;
for (key in map) {
if (map.hasOwnProperty(key)) {
arr.push(isKey ? key : map[key]);
}
}
return arr;
},
each: function(fn, scope) {
var items = Ext.apply({}, this.map),
key,
length = this.length;
scope = scope || this;
for (key in items) {
if (items.hasOwnProperty(key)) {
if (fn.call(scope, key, items[key], length) === false) {
break;
}
}
}
return this;
},
clone: function() {
var hash = new this.self(this.initialConfig),
map = this.map,
key;
hash.suspendEvents();
for (key in map) {
if (map.hasOwnProperty(key)) {
hash.add(key, map[key]);
}
}
hash.resumeEvents();
return hash;
},
findKey: function(value) {
var key,
map = this.map;
for (key in map) {
if (map.hasOwnProperty(key) && map[key] === value) {
return key;
}
}
return undefined;
}
});
Ext.define('Ext.AbstractManager', {
requires: [
'Ext.util.HashMap'
],
typeName: 'type',
constructor: function(config) {
Ext.apply(this, config || {});
this.all = new Ext.util.HashMap();
this.types = {};
},
get: function(id) {
return this.all.get(id);
},
register: function(item) {
var key = this.all.getKey(item);
if (key === undefined) {
Ext.Error.raise('Key is undefined. Please ensure the item has a key before registering the item.');
}
if (this.all.containsKey(key)) {
Ext.Error.raise('Registering duplicate id "' + key + '" with ' + this.$className);
}
this.all.add(item);
},
unregister: function(item) {
this.all.remove(item);
},
registerType: function(type, cls) {
this.types[type] = cls;
cls[this.typeName] = type;
},
isRegistered: function(type) {
return this.types[type] !== undefined;
},
create: function(config, defaultType) {
var type = config[this.typeName] || config.type || defaultType,
Constructor = this.types[type];
if (Constructor === undefined) {
Ext.Error.raise("The '" + type + "' type has not been registered with this manager");
}
return new Constructor(config);
},
onAvailable: function(id, fn, scope) {
var all = this.all,
item, callback;
if (all.containsKey(id)) {
item = all.get(id);
fn.call(scope || item, item);
} else {
callback = function(map, key, item) {
if (key == id) {
fn.call(scope || item, item);
all.un('add', callback);
}
};
all.on('add', callback);
}
},
each: function(fn, scope) {
this.all.each(fn, scope || this);
},
getCount: function() {
return this.all.getCount();
}
});
Ext.define('Ext.data.flash.BinaryXhr', {
statics: {
flashPluginActivated: function() {
Ext.data.flash.BinaryXhr.flashPluginActive = true;
Ext.data.flash.BinaryXhr.flashPlugin = document.getElementById("ext-flash-polyfill");
Ext.GlobalEvents.fireEvent("flashready");
},
flashPluginActive: false,
flashPluginInjected: false,
connectionIndex: 1,
liveConnections: {},
flashPlugin: null,
onFlashStateChange: function(javascriptId, state, data) {
var connection;
connection = this.liveConnections[Number(javascriptId)];
if (connection) {
connection.onFlashStateChange(state, data);
} else {
Ext.warn.log("onFlashStateChange for unknown connection ID: " + javascriptId);
}
},
registerConnection: function(conn) {
var i = this.connectionIndex;
this.conectionIndex = this.connectionIndex + 1;
this.liveConnections[i] = conn;
return i;
},
injectFlashPlugin: function() {
var me = this,
flashLoaderPath, flashObjectPath;
me.flashPolyfillEl = Ext.getBody().appendChild({
id: 'ext-flash-polyfill',
cn: [
{
tag: 'p',
html: 'To view this page ensure that Adobe Flash Player version 11.1.0 or greater is installed.'
},
{
tag: 'a',
href: 'http://www.adobe.com/go/getflashplayer',
cn: [
{
tag: 'img',
src: window.location.protocol + '//www.adobe.com/images/shared/download_buttons/get_flash_player.gif',
alt: 'Get Adobe Flash player'
}
]
}
]
});
flashLoaderPath = [
Ext.Loader.getPath('Ext.data.Connection'),
'../../../plugins/flash/swfobject.js'
].join('/');
flashObjectPath = "/plugins/flash/FlashPlugin.swf";
flashObjectPath = [
Ext.Loader.getPath('Ext.data.Connection'),
'../../plugins/flash/FlashPlugin.swf'
].join('/');
if (Ext.flashPluginPath) {
flashObjectPath = Ext.flashPluginPath;
}
Ext.Loader.loadScript({
url: flashLoaderPath,
onLoad: function() {
var swfVersionStr = "11.4.0";
var xiSwfUrlStr = "playerProductInstall.swf";
var flashvars = {};
var params = {};
params.quality = "high";
params.bgcolor = "#ffffff";
params.allowscriptaccess = "sameDomain";
params.allowfullscreen = "true";
var attributes = {};
attributes.id = "ext-flash-polyfill";
attributes.name = "polyfill";
attributes.align = "middle";
swfobject.embedSWF(flashObjectPath, "ext-flash-polyfill", "0", "0",
swfVersionStr, xiSwfUrlStr, flashvars, params, attributes);
},
onError: function() {
Ext.Error.raise("Could not load flash-loader file swfobject.js from " + flashLoader);
},
scope: me
});
Ext.data.flash.BinaryXhr.flashPluginInjected = true;
}
},
readyState: 0,
status: 0,
statusText: "",
responseBytes: null,
javascriptId: null,
constructor: function(config) {
if (!Ext.data.flash.BinaryXhr.flashPluginInjected) {
Ext.data.flash.BinaryXhr.injectFlashPlugin();
}
var me = this;
Ext.apply(me, config);
me.requestHeaders = {};
},
abort: function() {
var me = this;
if (me.readyState == 4) {
Ext.warn.log("Aborting a connection that's completed its transfer: " + this.url);
return;
}
me.aborted = true;
if (!Ext.data.flash.BinaryXhr.flashPluginActive) {
Ext.GlobalEvents.removeListener("flashready", me.onFlashReady, me);
return;
}
Ext.data.flash.BinaryXhr.flashPlugin.abortRequest(me.javascriptId);
delete Ext.data.flash.BinaryXhr.liveConnections[me.javascriptId];
},
getAllResponseHeaders: function() {
var headers = [];
Ext.Object.each(this.responseHeaders, function(name, value) {
headers.push(name + ': ' + value);
});
return headers.join('\r\n');
},
getResponseHeader: function(header) {
var headers = this.responseHeaders;
return (headers && headers[header]) || null;
},
open: function(method, url, async, user, password) {
var me = this;
me.method = method;
me.url = url;
me.async = async !== false;
me.user = user;
me.password = password;
if (!me.async) {
Ext.Error.raise("Binary posts are only supported in async mode: " + url);
}
if (me.method != "POST") {
Ext.log.warn("Binary data can only be sent as a POST request: " + url);
}
},
overrideMimeType: function(mimeType) {
this.mimeType = mimeType;
},
send: function(body) {
var me = this;
me.body = body;
if (!Ext.data.flash.BinaryXhr.flashPluginActive) {
Ext.GlobalEvents.addListener("flashready", me.onFlashReady, me);
} else {
this.onFlashReady();
}
},
onFlashReady: function() {
var me = this,
req, status;
me.javascriptId = Ext.data.flash.BinaryXhr.registerConnection(me);
req = {
method: me.method,
url: me.url,
user: me.user,
password: me.password,
mimeType: me.mimeType,
requestHeaders: me.requestHeaders,
body: me.body,
javascriptId: me.javascriptId
};
status = Ext.data.flash.BinaryXhr.flashPlugin.postBinary(req);
},
setReadyState: function(state) {
var me = this;
if (me.readyState != state) {
me.readyState = state;
me.onreadystatechange();
}
},
setRequestHeader: function(header, value) {
this.requestHeaders[header] = value;
},
onreadystatechange: Ext.emptyFn,
parseData: function(data) {
var me = this;
this.status = data.status || 0;
me.responseHeaders = {};
if (me.mimeType) {
me.responseHeaders["content-type"] = me.mimeType;
}
if (data.reason == "complete") {
this.responseBytes = data.data;
me.responseHeaders["content-length"] = data.data.length;
} else if (data.reason == "error" || data.reason == "securityError") {
this.statusText = data.text;
me.responseHeaders["content-length"] = 0;
} else
{
Ext.Error.raise("Unkown reason code in data: " + data.reason);
}
},
onFlashStateChange: function(state, data) {
var me = this;
if (state == 4) {
me.parseData(data);
delete Ext.data.flash.BinaryXhr.liveConnections[me.javascriptId];
}
me.setReadyState(state);
}
});
Ext.define('Ext.data.Connection', {
mixins: {
observable: 'Ext.mixin.Observable'
},
requires: [
'Ext.data.flash.BinaryXhr'
],
statics: {
requestId: 0
},
config: {
url: null,
async: true,
username: '',
password: '',
disableCaching: true,
withCredentials: false,
binary: false,
cors: false,
isXdr: false,
defaultXdrContentType: 'text/plain',
disableCachingParam: '_dc',
timeout: 30000,
extraParams: null,
autoAbort: false,
method: null,
defaultHeaders: null,
defaultPostHeader: 'application/x-www-form-urlencoded; charset=UTF-8',
useDefaultXhrHeader: true,
defaultXhrHeader: 'XMLHttpRequest'
},
constructor: function(config) {
this.mixins.observable.constructor.call(this, config);
this.requests = {};
},
request: function(options) {
options = options || {};
var me = this,
scope = options.scope || window,
username = options.username || me.getUsername(),
password = options.password || me.getPassword() || '',
async, requestOptions, request, headers, xdr, xhr;
if (me.fireEvent('beforerequest', me, options) !== false) {
requestOptions = me.setOptions(options, scope);
if (me.isFormUpload(options)) {
me.upload(options.form, requestOptions.url, requestOptions.data, options);
return null;
}
if (options.autoAbort || me.getAutoAbort()) {
me.abort();
}
async = options.async !== false ? (options.async || me.getAsync()) : false;
xhr = me.openRequest(options, requestOptions, async, username, password);
xdr = me.getIsXdr();
if (!xdr) {
headers = me.setupHeaders(xhr, options, requestOptions.data, requestOptions.params);
}
request = {
id: ++Ext.data.Connection.requestId,
xhr: xhr,
headers: headers,
options: options,
async: async,
binary: options.binary || me.getBinary(),
timeout: Ext.defer(function() {
request.timedout = true;
me.abort(request);
}, options.timeout || me.getTimeout())
};
me.requests[request.id] = request;
me.latestId = request.id;
if (async) {
if (!xdr) {
xhr.onreadystatechange = Ext.Function.bind(me.onStateChange, me, [
request
]);
}
}
if (xdr) {
me.processXdrRequest(request, xhr);
}
xhr.send(requestOptions.data);
if (!async) {
return me.onComplete(request);
}
return request;
} else {
Ext.callback(options.callback, options.scope, [
options,
undefined,
undefined
]);
return null;
}
},
processXdrRequest: function(request, xhr) {
var me = this;
delete request.headers;
request.contentType = request.options.contentType || me.getDefaultXdrContentType();
xhr.onload = Ext.Function.bind(me.onStateChange, me, [
request,
true
]);
xhr.onerror = xhr.ontimeout = Ext.Function.bind(me.onStateChange, me, [
request,
false
]);
},
processXdrResponse: function(response, xhr) {
response.getAllResponseHeaders = function() {
return [];
};
response.getResponseHeader = function() {
return '';
};
response.contentType = xhr.contentType || this.getDefaultXdrContentType();
},
upload: function(form, url, params, options) {
form = Ext.getDom(form);
options = options || {};
var id = Ext.id(),
frame = document.createElement('iframe'),
hiddens = [],
encoding = 'multipart/form-data',
buf = {
target: form.target,
method: form.method,
encoding: form.encoding,
enctype: form.enctype,
action: form.action
},
addField = function(name, value) {
hiddenItem = document.createElement('input');
Ext.fly(hiddenItem).set({
type: 'hidden',
value: value,
name: name
});
form.appendChild(hiddenItem);
hiddens.push(hiddenItem);
},
hiddenItem, obj, value, name, vLen, v, hLen, h;
Ext.fly(frame).set({
id: id,
name: id,
cls: Ext.baseCSSPrefix + 'hidden-display',
src: Ext.SSL_SECURE_URL,
tabIndex: -1
});
document.body.appendChild(frame);
if (document.frames) {
document.frames[id].name = id;
}
Ext.fly(form).set({
target: id,
method: 'POST',
enctype: encoding,
encoding: encoding,
action: url || buf.action
});
if (params) {
obj = Ext.Object.fromQueryString(params) || {};
for (name in obj) {
if (obj.hasOwnProperty(name)) {
value = obj[name];
if (Ext.isArray(value)) {
vLen = value.length;
for (v = 0; v < vLen; v++) {
addField(name, value[v]);
}
} else {
addField(name, value);
}
}
}
}
Ext.get(frame).on({
load: Ext.Function.bind(this.onUploadComplete, this, [
frame,
options
]),
single: !Ext.isOpera
});
form.submit();
Ext.fly(form).set(buf);
for (hLen = hiddens.length , h = 0; h < hLen; h++) {
Ext.removeNode(hiddens[h]);
}
},
onUploadComplete: function(frame, options) {
var me = this,
response = {
responseText: '',
responseXML: null
},
callback, success, doc, contentNode;
try {
doc = (frame && (frame.contentWindow.document || frame.contentDocument)) || (window.frames[frame.id] || {}).document;
if (doc) {
if (Ext.isOpera && doc.location == Ext.SSL_SECURE_URL) {
return;
}
if (doc.body) {
if ((contentNode = doc.body.firstChild) && /pre/i.test(contentNode.tagName)) {
response.responseText = contentNode.textContent || contentNode.innerText;
}
else if ((contentNode = doc.getElementsByTagName('textarea')[0])) {
response.responseText = contentNode.value;
} else
{
response.responseText = doc.body.textContent || doc.body.innerText;
}
}
response.responseXML = doc.XMLDocument || doc;
callback = options.success;
success = true;
} else {
Ext.Error.raise("Could not acquire a suitable connection for the file upload service.");
}
} catch (e) {
response.responseText = '{success:false,message:"' + Ext.String.trim(e.message || e.description) + '"}';
callback = options.failure;
success = false;
}
me.fireEvent(success ? 'requestcomplete' : 'requestexception', me, response, options);
Ext.callback(callback, options.scope, [
response,
options
]);
Ext.callback(options.callback, options.scope, [
options,
success,
response
]);
Ext.defer(Ext.removeNode, 100, Ext, [
frame
]);
},
isFormUpload: function(options) {
var form = this.getForm(options);
if (form) {
return (options.isUpload || (/multipart\/form-data/i).test(form.getAttribute('enctype')));
}
return false;
},
getForm: function(options) {
var form = options.form || null;
if (form) {
form = Ext.getDom(form);
}
return form;
},
setOptions: function(options, scope) {
var me = this,
params = options.params || {},
extraParams = me.getExtraParams(),
urlParams = options.urlParams,
url = options.url || me.getUrl(),
cors = options.cors,
jsonData = options.jsonData,
method, disableCache, data;
if (cors !== undefined) {
me.setCors(cors);
}
if (Ext.isFunction(params)) {
params = params.call(scope, options);
}
if (Ext.isFunction(url)) {
url = url.call(scope, options);
}
url = this.setupUrl(options, url);
if (!url) {
Ext.Error.raise({
options: options,
msg: 'No URL specified'
});
}
data = options.rawData || options.binaryData || options.xmlData || jsonData || null;
if (jsonData && !Ext.isPrimitive(jsonData)) {
data = Ext.encode(data);
}
if (options.binaryData) {
if (!Ext.isArray(options.binaryData)) {
Ext.log.warn("Binary submission data must be an array of byte values! Instead got " + typeof (options.binaryData));
}
if (me.nativeBinaryPostSupport()) {
data = (new Uint8Array(options.binaryData));
if ((Ext.isChrome && Ext.chromeVersion < 22) || Ext.isSafari || Ext.isGecko) {
data = data.buffer;
}
}
}
if (Ext.isObject(params)) {
params = Ext.Object.toQueryString(params);
}
if (Ext.isObject(extraParams)) {
extraParams = Ext.Object.toQueryString(extraParams);
}
params = params + ((extraParams) ? ((params) ? '&' : '') + extraParams : '');
urlParams = Ext.isObject(urlParams) ? Ext.Object.toQueryString(urlParams) : urlParams;
params = this.setupParams(options, params);
method = (options.method || me.getMethod() || ((params || data) ? 'POST' : 'GET')).toUpperCase();
this.setupMethod(options, method);
disableCache = options.disableCaching !== false ? (options.disableCaching || me.getDisableCaching()) : false;
if (method === 'GET' && disableCache) {
url = Ext.urlAppend(url, (options.disableCachingParam || me.getDisableCachingParam()) + '=' + (new Date().getTime()));
}
if ((method == 'GET' || data) && params) {
url = Ext.urlAppend(url, params);
params = null;
}
if (urlParams) {
url = Ext.urlAppend(url, urlParams);
}
return {
url: url,
method: method,
data: data || params || null
};
},
setupUrl: function(options, url) {
var form = this.getForm(options);
if (form) {
url = url || form.action;
}
return url;
},
setupParams: function(options, params) {
var form = this.getForm(options),
serializedForm;
if (form && !this.isFormUpload(options)) {
serializedForm = Ext.Element.serializeForm(form);
params = params ? (params + '&' + serializedForm) : serializedForm;
}
return params;
},
setupMethod: function(options, method) {
if (this.isFormUpload(options)) {
return 'POST';
}
return method;
},
setupHeaders: function(xhr, options, data, params) {
var me = this,
headers = Ext.apply({}, options.headers || {}, me.getDefaultHeaders() || {}),
contentType = me.getDefaultPostHeader(),
jsonData = options.jsonData,
xmlData = options.xmlData,
type = 'Content-Type',
useHeader = Ext.isDefined(options.useDefaultXhrHeader) ? options.useDefaultXhrHeader : me.getUseDefaultXhrHeader(),
key, header;
if (!headers.hasOwnProperty(type) && (data || params)) {
if (data) {
if (options.rawData) {
contentType = 'text/plain';
} else {
if (xmlData && Ext.isDefined(xmlData)) {
contentType = 'text/xml';
} else if (jsonData && Ext.isDefined(jsonData)) {
contentType = 'application/json';
}
}
}
headers[type] = contentType;
}
if (useHeader && !headers['X-Requested-With']) {
headers['X-Requested-With'] = me.getDefaultXhrHeader();
}
if (headers[type] === undefined || headers[type] === null) {
delete headers[type];
}
try {
for (key in headers) {
if (headers.hasOwnProperty(key)) {
header = headers[key];
xhr.setRequestHeader(key, header);
}
}
} catch (e) {
me.fireEvent('exception', key, header);
}
return headers;
},
newRequest: function(options) {
var me = this,
xhr;
if (options.binaryData) {
if (me.nativeBinaryPostSupport()) {
xhr = me.getXhrInstance();
} else
{
xhr = new Ext.data.flash.BinaryXhr();
}
} else if (me.getCors() && Ext.isIE && Ext.ieVersion <= 9) {
xhr = me.getXdrInstance();
me.setIsXdr(true);
} else {
xhr = me.getXhrInstance();
me.setIsXdr(false);
}
return xhr;
},
openRequest: function(options, requestOptions, async, username, password) {
var me = this,
xhr = me.newRequest(options);
if (username) {
xhr.open(requestOptions.method, requestOptions.url, async, username, password);
} else {
if (me.getIsXdr()) {
xhr.open(requestOptions.method, requestOptions.url);
} else {
xhr.open(requestOptions.method, requestOptions.url, async);
}
}
if (options.binary || me.getBinary()) {
if (window.Uint8Array) {
xhr.responseType = 'arraybuffer';
} else if (xhr.overrideMimeType) {
xhr.overrideMimeType('text/plain; charset=x-user-defined');
} else if (!Ext.isIE) {
Ext.log.warn("Your browser does not support loading binary data using Ajax.");
}
}
if (options.withCredentials || me.getWithCredentials()) {
xhr.withCredentials = true;
}
return xhr;
},
getXdrInstance: function() {
var xdr;
if (Ext.ieVersion >= 8) {
xdr = new XDomainRequest();
} else {
Ext.Error.raise({
msg: 'Your browser does not support CORS'
});
}
return xdr;
},
getXhrInstance: (function() {
var options = [
function() {
return new XMLHttpRequest();
},
function() {
return new ActiveXObject('MSXML2.XMLHTTP.3.0');
},
function() {
return new ActiveXObject('MSXML2.XMLHTTP');
},
function() {
return new ActiveXObject('Microsoft.XMLHTTP');
}
],
i = 0,
len = options.length,
xhr;
for (; i < len; ++i) {
try {
xhr = options[i];
xhr();
break;
} catch (e) {}
}
return xhr;
}()),
isLoading: function(request) {
if (!request) {
request = this.getLatest();
}
if (!(request && request.xhr)) {
return false;
}
var state = request.xhr.readyState,
Cls = Ext.data.flash && Ext.data.flash.BinaryXhr;
return ((request.xhr instanceof Cls) && state != 4) || !(state === 0 || state == 4);
},
abort: function(request) {
var me = this,
xhr;
if (!request) {
request = me.getLatest();
}
if (request && me.isLoading(request)) {
xhr = request.xhr;
try {
xhr.onreadystatechange = null;
} catch (e) {
xhr.onreadystatechange = Ext.emptyFn;
}
xhr.abort();
me.clearTimeout(request);
if (!request.timedout) {
request.aborted = true;
}
me.onComplete(request);
me.cleanup(request);
}
},
abortAll: function() {
var requests = this.requests,
id;
for (id in requests) {
if (requests.hasOwnProperty(id)) {
this.abort(requests[id]);
}
}
},
getLatest: function() {
var id = this.latestId,
request;
if (id) {
request = this.requests[id];
}
return request || null;
},
onStateChange: function(request, xdrResult) {
var me = this,
globalEvents = Ext.GlobalEvents;
if ((request.xhr && request.xhr.readyState == 4) || me.getIsXdr()) {
me.clearTimeout(request);
me.onComplete(request, xdrResult);
me.cleanup(request);
if (globalEvents.hasListeners.idle) {
globalEvents.fireEvent('idle');
}
}
},
clearTimeout: function(request) {
clearTimeout(request.timeout);
delete request.timeout;
},
cleanup: function(request) {
request.xhr = null;
delete request.xhr;
},
onComplete: function(request, xdrResult) {
var me = this,
options = request.options,
xhr, result, success, response;
try {
xhr = request.xhr;
result = me.parseStatus(xhr.status);
if (result.success) {
result.success = xhr.readyState === 4;
}
} catch (e) {
result = {
success: false,
isException: false
};
}
success = me.getIsXdr() ? xdrResult : result.success;
if (success) {
response = me.createResponse(request);
me.fireEvent('requestcomplete', me, response, options);
Ext.callback(options.success, options.scope, [
response,
options
]);
} else {
if (result.isException || request.aborted || request.timedout) {
response = me.createException(request);
} else {
response = me.createResponse(request);
}
me.fireEvent('requestexception', me, response, options);
Ext.callback(options.failure, options.scope, [
response,
options
]);
}
Ext.callback(options.callback, options.scope, [
options,
success,
response
]);
delete me.requests[request.id];
return response;
},
parseStatus: function(status) {
status = status == 1223 ? 204 : status;
var success = (status >= 200 && status < 300) || status == 304,
isException = false;
if (!success) {
switch (status) {
case 12002:
case 12029:
case 12030:
case 12031:
case 12152:
case 13030:
isException = true;
break;
}
}
return {
success: success,
isException: isException
};
},
createResponse: function(request) {
var me = this,
xhr = request.xhr,
isXdr = me.getIsXdr(),
headers = {},
lines = isXdr ? [] : xhr.getAllResponseHeaders().replace(/\r\n/g, '\n').split('\n'),
count = lines.length,
line, index, key, response, byteArray;
while (count--) {
line = lines[count];
index = line.indexOf(':');
if (index >= 0) {
key = line.substr(0, index).toLowerCase();
if (line.charAt(index + 1) == ' ') {
++index;
}
headers[key] = line.substr(index + 1);
}
}
request.xhr = null;
delete request.xhr;
response = {
request: request,
requestId: request.id,
status: xhr.status,
statusText: xhr.statusText,
getResponseHeader: function(header) {
return headers[header.toLowerCase()];
},
getAllResponseHeaders: function() {
return headers;
}
};
if (isXdr) {
me.processXdrResponse(response, xhr);
}
if (request.binary) {
response.responseBytes = me.getByteArray(xhr);
} else {
response.responseText = xhr.responseText;
response.responseXML = xhr.responseXML;
}
xhr = null;
return response;
},
createException: function(request) {
return {
request: request,
requestId: request.id,
status: request.aborted ? -1 : 0,
statusText: request.aborted ? 'transaction aborted' : 'communication failure',
aborted: request.aborted,
timedout: request.timedout
};
},
getByteArray: function(xhr) {
var response = xhr.response,
responseBody = xhr.responseBody,
Cls = Ext.data.flash && Ext.data.flash.BinaryXhr,
byteArray, responseText, len, i;
if (xhr instanceof Cls) {
byteArray = xhr.responseBytes;
} else if (window.Uint8Array) {
byteArray = response ? new Uint8Array(response) : [];
} else if (Ext.isIE9p) {
try {
byteArray = new VBArray(responseBody).toArray();
}
catch (e) {
byteArray = [];
}
} else if (Ext.isIE) {
if (!this.self.vbScriptInjected) {
this.injectVBScript();
}
getIEByteArray(xhr.responseBody, byteArray = []);
} else
{
byteArray = [];
responseText = xhr.responseText;
len = responseText.length;
for (i = 0; i < len; i++) {
byteArray.push(responseText.charCodeAt(i) & 255);
}
}
return byteArray;
},
injectVBScript: function() {
var scriptTag = document.createElement('script');
scriptTag.type = 'text/vbscript';
scriptTag.text = [
'Function getIEByteArray(byteArray, out)',
'Dim len, i',
'len = LenB(byteArray)',
'For i = 1 to len',
'out.push(AscB(MidB(byteArray, i, 1)))',
'Next',
'End Function'
].join('\n');
Ext.getHead().dom.appendChild(scriptTag);
this.self.vbScriptInjected = true;
},
nativeBinaryPostSupport: function() {
return Ext.isChrome || (Ext.isSafari && Ext.isDefined(window.Uint8Array)) || (Ext.isGecko && Ext.isDefined(window.Uint8Array));
}
});
Ext.define('Ext.Ajax', {
extend: 'Ext.data.Connection',
singleton: true,
autoAbort: false
});
Ext.define('Ext.AnimationQueue', {
singleton: true,
constructor: function() {
this.queue = [];
this.taskQueue = [];
this.runningQueue = [];
this.idleQueue = [];
this.isRunning = false;
this.isIdle = true;
this.run = Ext.Function.bind(this.run, this);
if (Ext.os.is.iOS) {
Ext.interval(this.watch, 500, this);
}
},
start: function(fn, scope, args) {
this.queue.push(arguments);
if (!this.isRunning) {
if (this.hasOwnProperty('idleTimer')) {
clearTimeout(this.idleTimer);
delete this.idleTimer;
}
if (this.hasOwnProperty('idleQueueTimer')) {
clearTimeout(this.idleQueueTimer);
delete this.idleQueueTimer;
}
this.isIdle = false;
this.isRunning = true;
this.startCountTime = Ext.now();
this.count = 0;
this.doStart();
}
},
watch: function() {
if (this.isRunning && Ext.now() - this.lastRunTime >= 500) {
this.run();
}
},
run: function() {
if (!this.isRunning) {
return;
}
var queue = this.runningQueue,
i, ln;
this.lastRunTime = Ext.now();
this.frameStartTime = Ext.now();
queue.push.apply(queue, this.queue);
for (i = 0 , ln = queue.length; i < ln; i++) {
this.invoke(queue[i]);
}
queue.length = 0;
var now = this.frameStartTime,
startCountTime = this.startCountTime,
elapse = now - startCountTime,
count = ++this.count;
if (elapse >= 200) {
this.onFpsChanged(count * 1000 / elapse, count, elapse);
this.startCountTime = now;
this.count = 0;
}
this.doIterate();
},
onFpsChanged: Ext.emptyFn,
onStop: Ext.emptyFn,
doStart: function() {
this.animationFrameId = Ext.Function.requestAnimationFrame(this.run);
this.lastRunTime = Ext.now();
},
doIterate: function() {
this.animationFrameId = Ext.Function.requestAnimationFrame(this.run);
},
doStop: function() {
Ext.Function.cancelAnimationFrame(this.animationFrameId);
},
stop: function(fn, scope, args) {
if (!this.isRunning) {
return;
}
var queue = this.queue,
ln = queue.length,
i, item;
for (i = 0; i < ln; i++) {
item = queue[i];
if (item[0] === fn && item[1] === scope && item[2] === args) {
queue.splice(i, 1);
i--;
ln--;
}
}
if (ln === 0) {
this.doStop();
this.onStop();
this.isRunning = false;
this.idleTimer = Ext.defer(this.whenIdle, 100, this);
}
},
onIdle: function(fn, scope, args) {
var listeners = this.idleQueue,
i, ln, listener;
for (i = 0 , ln = listeners.length; i < ln; i++) {
listener = listeners[i];
if (fn === listener[0] && scope === listener[1] && args === listener[2]) {
return;
}
}
listeners.push(arguments);
if (this.isIdle) {
this.processIdleQueue();
}
},
unIdle: function(fn, scope, args) {
var listeners = this.idleQueue,
i, ln, listener;
for (i = 0 , ln = listeners.length; i < ln; i++) {
listener = listeners[i];
if (fn === listener[0] && scope === listener[1] && args === listener[2]) {
listeners.splice(i, 1);
return true;
}
}
return false;
},
queueTask: function(fn, scope, args) {
this.taskQueue.push(arguments);
this.processTaskQueue();
},
dequeueTask: function(fn, scope, args) {
var listeners = this.taskQueue,
i, ln, listener;
for (i = 0 , ln = listeners.length; i < ln; i++) {
listener = listeners[i];
if (fn === listener[0] && scope === listener[1] && args === listener[2]) {
listeners.splice(i, 1);
i--;
ln--;
}
}
},
invoke: function(listener) {
var fn = listener[0],
scope = listener[1],
args = listener[2];
fn = (typeof fn == 'string' ? scope[fn] : fn);
if (Ext.isArray(args)) {
fn.apply(scope, args);
} else {
fn.call(scope, args);
}
},
whenIdle: function() {
this.isIdle = true;
this.processIdleQueue();
},
processIdleQueue: function() {
if (!this.hasOwnProperty('idleQueueTimer')) {
this.idleQueueTimer = Ext.defer(this.processIdleQueueItem, 1, this);
}
},
processIdleQueueItem: function() {
delete this.idleQueueTimer;
if (!this.isIdle) {
return;
}
var listeners = this.idleQueue,
listener;
if (listeners.length > 0) {
listener = listeners.shift();
this.invoke(listener);
this.processIdleQueue();
}
},
processTaskQueue: function() {
if (!this.hasOwnProperty('taskQueueTimer')) {
this.taskQueueTimer = Ext.defer(this.processTaskQueueItem, 15, this);
}
},
processTaskQueueItem: function() {
delete this.taskQueueTimer;
var listeners = this.taskQueue,
listener;
if (listeners.length > 0) {
listener = listeners.shift();
this.invoke(listener);
this.processTaskQueue();
}
},
showFps: function() {
Ext.onInternalReady(function() {
Ext.Viewport.add([
{
xtype: 'component',
bottom: 50,
left: 0,
width: 50,
height: 20,
html: 'Average',
style: 'background-color: black; color: white; text-align: center; line-height: 20px; font-size: 8px;'
},
{
id: '__averageFps',
xtype: 'component',
bottom: 0,
left: 0,
width: 50,
height: 50,
html: '0',
style: 'background-color: red; color: white; text-align: center; line-height: 50px;'
},
{
xtype: 'component',
bottom: 50,
left: 50,
width: 50,
height: 20,
html: 'Min (Last 1k)',
style: 'background-color: black; color: white; text-align: center; line-height: 20px; font-size: 8px;'
},
{
id: '__minFps',
xtype: 'component',
bottom: 0,
left: 50,
width: 50,
height: 50,
html: '0',
style: 'background-color: orange; color: white; text-align: center; line-height: 50px;'
},
{
xtype: 'component',
bottom: 50,
left: 100,
width: 50,
height: 20,
html: 'Max (Last 1k)',
style: 'background-color: black; color: white; text-align: center; line-height: 20px; font-size: 8px;'
},
{
id: '__maxFps',
xtype: 'component',
bottom: 0,
left: 100,
width: 50,
height: 50,
html: '0',
style: 'background-color: yellow; color: black; text-align: center; line-height: 50px;'
},
{
xtype: 'component',
bottom: 50,
left: 150,
width: 50,
height: 20,
html: 'Current',
style: 'background-color: black; color: white; text-align: center; line-height: 20px; font-size: 8px;'
},
{
id: '__currentFps',
xtype: 'component',
bottom: 0,
left: 150,
width: 50,
height: 50,
html: '0',
style: 'background-color: green; color: white; text-align: center; line-height: 50px;'
}
]);
Ext.AnimationQueue.resetFps();
});
},
resetFps: function() {
var currentFps = Ext.getCmp('__currentFps'),
averageFps = Ext.getCmp('__averageFps'),
minFps = Ext.getCmp('__minFps'),
maxFps = Ext.getCmp('__maxFps'),
min = 1000,
max = 0,
count = 0,
sum = 0;
Ext.AnimationQueue.onFpsChanged = function(fps) {
count++;
if (!(count % 10)) {
min = 1000;
max = 0;
}
sum += fps;
min = Math.min(min, fps);
max = Math.max(max, fps);
currentFps.setHtml(Math.round(fps));
averageFps.setHtml(Math.round(sum / count));
minFps.setHtml(Math.round(min));
maxFps.setHtml(Math.round(max));
};
}
}, function() {
var paramsString = window.location.search.substr(1),
paramsArray = paramsString.split("&");
if (Ext.Array.contains(paramsArray, "showfps")) {
Ext.AnimationQueue.showFps();
}
});
Ext.define('Ext.ComponentManager', {
alternateClassName: 'Ext.ComponentMgr',
singleton: true,
count: 0,
typeName: 'xtype',
constructor: function(config) {
var me = this;
Ext.apply(me, config || {});
me.all = {};
me.references = {};
me.onAvailableCallbacks = {};
},
create: function(config, defaultType) {
if (typeof config === 'string') {
return Ext.widget(config);
}
if (config.isComponent) {
return config;
}
if ('xclass' in config) {
return Ext.create(config.xclass, config);
}
return Ext.widget(config.xtype || defaultType, config);
},
get: function(id) {
return this.all[id];
},
register: function(component) {
var me = this,
all = me.all,
key = component.getId(),
onAvailableCallbacks = me.onAvailableCallbacks;
if (key === undefined) {
Ext.Error.raise('Component id is undefined. Please ensure the component has an id.');
}
if (key in all) {
Ext.Error.raise('Registering duplicate component id "' + key + '"');
}
all[key] = component;
if (component.reference) {
me.references[key] = component;
}
++me.count;
if (!me.hasFocusListener) {
Ext.on('focus', me.onGlobalFocus, me);
me.hasFocusListener = true;
}
onAvailableCallbacks = onAvailableCallbacks && onAvailableCallbacks[key];
if (onAvailableCallbacks && onAvailableCallbacks.length) {
me.notifyAvailable(component);
}
},
unregister: function(component) {
var id = component.getId();
if (component.reference) {
delete this.references[id];
}
delete this.all[id];
this.count--;
},
markReferencesDirty: function() {
this.referencesDirty = true;
},
fixReferences: function() {
var me = this,
references = me.references,
key;
if (me.referencesDirty) {
for (key in references) {
if (references.hasOwnProperty(key)) {
references[key].fixReference();
}
}
me.referencesDirty = false;
}
},
onAvailable: function(id, fn, scope) {
var me = this,
callbacks = me.onAvailableCallbacks,
all = me.all,
item;
if (id in all) {
item = all[id];
fn.call(scope || item, item);
} else if (id) {
if (!Ext.isArray(callbacks[id])) {
callbacks[id] = [];
}
callbacks[id].push(function(item) {
fn.call(scope || item, item);
});
}
},
notifyAvailable: function(item) {
var callbacks = this.onAvailableCallbacks[item && item.getId()] || [];
while (callbacks.length) {
(callbacks.shift())(item);
}
},
each: function(fn, scope) {
return Ext.Object.each(this.all, fn, scope);
},
getCount: function() {
return this.count;
},
getAll: function() {
return Ext.Object.getValues(this.all);
},
getActiveComponent: function() {
return Ext.Component.fromElement(Ext.dom.Element.getActiveElement());
},
onGlobalFocus: function(e) {
var me = this,
toElement = e.toElement,
fromElement = e.fromElement,
toComponent = Ext.Component.fromElement(toElement),
fromComponent = Ext.Component.fromElement(fromElement),
commonAncestor = me.getCommonAncestor(fromComponent, toComponent),
event, targetComponent;
if (fromComponent && !(fromComponent.isDestroyed || fromComponent.destroying)) {
if (fromComponent.focusable && fromElement === fromComponent.getFocusEl().dom) {
event = new Ext.event.Event(e.event);
event.type = 'blur';
event.target = fromElement;
event.relatedTarget = toElement;
fromComponent.onBlur(event);
}
for (targetComponent = fromComponent; targetComponent && targetComponent !== commonAncestor; targetComponent = targetComponent.getRefOwner()) {
if (!(targetComponent.isDestroyed || targetComponent.destroying)) {
targetComponent.onFocusLeave({
event: e.event,
type: 'focusleave',
target: fromElement,
relatedTarget: toElement,
fromComponent: fromComponent,
toComponent: toComponent
});
}
}
}
if (toComponent && !toComponent.isDestroyed) {
if (toComponent.focusable && toElement === toComponent.getFocusEl().dom) {
event = new Ext.event.Event(e.event);
event.type = 'focus';
event.relatedTarget = fromElement;
event.target = toElement;
toComponent.onFocus(event);
}
for (targetComponent = toComponent; targetComponent && targetComponent !== commonAncestor; targetComponent = targetComponent.getRefOwner()) {
targetComponent.onFocusEnter({
event: e.event,
type: 'focusenter',
relatedTarget: fromElement,
target: toElement,
fromComponent: fromComponent,
toComponent: toComponent
});
}
}
},
getCommonAncestor: function(compA, compB) {
if (compA === compB) {
return compA;
}
while (compA && !(compA.isAncestor(compB) || compA === compB)) {
compA = compA.getRefOwner();
}
return compA;
},
deprecated: {
5: {
methods: {
isRegistered: null,
registerType: null
}
}
}
}, function() {
Ext.getCmp = function(id) {
return Ext.ComponentManager.get(id);
};
});
Ext.ns('Ext.util').Operators = {
"=": function(a, v) {
return a == v;
},
"!=": function(a, v) {
return a != v;
},
"^=": function(a, v) {
return a && a.substr(0, v.length) == v;
},
"$=": function(a, v) {
return a && a.substr(a.length - v.length) == v;
},
"*=": function(a, v) {
return a && a.indexOf(v) !== -1;
},
"%=": function(a, v) {
return (a % v) === 0;
},
"|=": function(a, v) {
return a && (a == v || a.substr(0, v.length + 1) == v + '-');
},
"~=": function(a, v) {
return a && (' ' + a + ' ').indexOf(' ' + v + ' ') != -1;
}
};
Ext.define('Ext.util.LruCache', {
extend: 'Ext.util.HashMap',
config: {
maxSize: null
},
add: function(key, newValue) {
var me = this,
entry, last;
me.removeAtKey(key);
last = me.last;
entry = {
prev: last,
next: null,
key: key,
value: newValue
};
if (last) {
last.next = entry;
} else {
me.first = entry;
}
me.last = entry;
me.callParent([
key,
entry
]);
me.prune();
return newValue;
},
insertBefore: function(key, newValue, sibling) {
var me = this,
existingKey, entry;
if (sibling = this.map[this.findKey(sibling)]) {
existingKey = me.findKey(newValue);
if (existingKey) {
me.unlinkEntry(entry = me.map[existingKey]);
} else
{
entry = {
prev: sibling.prev,
next: sibling,
key: key,
value: newValue
};
}
if (sibling.prev) {
entry.prev.next = entry;
} else {
me.first = entry;
}
entry.next = sibling;
sibling.prev = entry;
me.prune();
return newValue;
} else
{
return me.add(key, newValue);
}
},
get: function(key) {
var entry = this.map[key];
if (entry) {
if (entry.next) {
this.moveToEnd(entry);
}
return entry.value;
}
},
removeAtKey: function(key) {
this.unlinkEntry(this.map[key]);
return this.callParent(arguments);
},
clear: function(
initial) {
this.first = this.last = null;
return this.callParent(arguments);
},
unlinkEntry: function(entry) {
if (entry) {
if (entry.next) {
entry.next.prev = entry.prev;
} else {
this.last = entry.prev;
}
if (entry.prev) {
entry.prev.next = entry.next;
} else {
this.first = entry.next;
}
entry.prev = entry.next = null;
}
},
moveToEnd: function(entry) {
this.unlinkEntry(entry);
if (entry.prev = this.last) {
this.last.next = entry;
} else
{
this.first = entry;
}
this.last = entry;
},
getArray: function(isKey) {
var arr = [],
entry = this.first;
while (entry) {
arr.push(isKey ? entry.key : entry.value);
entry = entry.next;
}
return arr;
},
each: function(fn, scope, reverse) {
var me = this,
entry = reverse ? me.last : me.first,
length = me.length;
scope = scope || me;
while (entry) {
if (fn.call(scope, entry.key, entry.value, length) === false) {
break;
}
entry = reverse ? entry.prev : entry.next;
}
return me;
},
findKey: function(value) {
var key,
map = this.map;
for (key in map) {
if (map.hasOwnProperty(key) && map[key].value === value) {
return key;
}
}
return undefined;
},
clone: function() {
var newCache = new this.self(this.initialConfig),
map = this.map,
key;
newCache.suspendEvents();
for (key in map) {
if (map.hasOwnProperty(key)) {
newCache.add(key, map[key].value);
}
}
newCache.resumeEvents();
return newCache;
},
prune: function() {
var me = this,
max = me.getMaxSize(),
purgeCount = max ? (me.length - max) : 0;
if (purgeCount > 0) {
for (; me.first && purgeCount; purgeCount--) {
me.removeAtKey(me.first.key);
}
}
}
});
Ext.define('Ext.ComponentQuery', {
singleton: true,
requires: [
'Ext.ComponentManager',
'Ext.util.Operators',
'Ext.util.LruCache'
]
}, function() {
var cq = this,
queryOperators = Ext.util.Operators,
nthRe = /(\d*)n\+?(\d*)/,
nthRe2 = /\D/,
stripLeadingSpaceRe = /^(\s)+/,
unescapeRe = /\\(.)/g,
regexCache = new Ext.util.LruCache({
maxSize: 100
}),
filterFnPattern = [
'var r = [],',
'i = 0,',
'it = items,',
'l = it.length,',
'c;',
'for (; i < l; i++) {',
'c = it[i];',
'if (c.{0}) {',
'r.push(c);',
'}',
'}',
'return r;'
].join(''),
filterItems = function(items, operation) {
return operation.method.apply(this, [
items
].concat(operation.args));
},
getItems = function(items, mode) {
var result = [],
i = 0,
length = items.length,
candidate,
deep = mode !== '>';
for (; i < length; i++) {
candidate = items[i];
if (candidate.getRefItems) {
result = result.concat(candidate.getRefItems(deep));
}
}
return result;
},
getAncestors = function(items) {
var result = [],
i = 0,
length = items.length,
candidate;
for (; i < length; i++) {
candidate = items[i];
while (!!(candidate = candidate.getRefOwner())) {
result.push(candidate);
}
}
return result;
},
filterByXType = function(items, xtype, shallow) {
if (xtype === '*') {
return items.slice();
} else {
var result = [],
i = 0,
length = items.length,
candidate;
for (; i < length; i++) {
candidate = items[i];
if (candidate.isXType(xtype, shallow)) {
result.push(candidate);
}
}
return result;
}
},
filterByAttribute = function(items, property, operator, compareTo) {
var result = [],
i = 0,
length = items.length,
mustBeOwnProperty, presenceOnly, candidate, propValue, j, propLen, config;
if (property.charAt(0) === '@') {
mustBeOwnProperty = true;
property = property.substr(1);
}
if (property.charAt(0) === '?') {
mustBeOwnProperty = true;
presenceOnly = true;
property = property.substr(1);
}
for (; i < length; i++) {
candidate = items[i];
config = candidate.self.$config.configs[property];
if (config) {
propValue = candidate[config.names.get]();
} else if (mustBeOwnProperty && !candidate.hasOwnProperty(property)) {
continue;
} else {
propValue = candidate[property];
}
if (presenceOnly) {
result.push(candidate);
}
else if (operator === '~=') {
if (propValue) {
if (!Ext.isArray(propValue)) {
propValue = propValue.split(' ');
}
for (j = 0 , propLen = propValue.length; j < propLen; j++) {
if (queryOperators[operator](Ext.coerce(propValue[j], compareTo), compareTo)) {
result.push(candidate);
break;
}
}
}
} else if (operator === '/=') {
if (propValue != null && compareTo.test(propValue)) {
result.push(candidate);
}
} else if (!compareTo ? !!candidate[property] : queryOperators[operator](Ext.coerce(propValue, compareTo), compareTo)) {
result.push(candidate);
}
}
return result;
},
filterById = function(items, id) {
var result = [],
i = 0,
length = items.length,
candidate;
for (; i < length; i++) {
candidate = items[i];
if (candidate.getItemId() === id) {
result.push(candidate);
}
}
return result;
},
filterByPseudo = function(items, name, value) {
return cq.pseudos[name](items, value);
},
modeRe = /^(\s?([>\^])\s?|\s|$)/,
tokenRe = /^(#)?((?:\\\.|[\w\-])+|\*)(?:\((true|false)\))?/,
matchers = [
{
re: /^\.((?:\\\.|[\w\-])+)(?:\((true|false)\))?/,
method: filterByXType,
argTransform: function(args) {
var selector = args[0];
Ext.log.warn('"' + selector + '" ComponentQuery selector style is deprecated,' + ' use "' + selector.replace(/^\./, '') + '" without the leading dot instead');
if (args[1] !== undefined) {
args[1] = args[1].replace(unescapeRe, '$1');
}
return args.slice(1);
}
},
{
re: /^(?:\[((?:[@?$])?[\w\-]*)\s*(?:([\^$*~%!\/]?=)\s*(['"])?((?:\\\]|.)*?)\3)?(?!\\)\])/,
method: filterByAttribute,
argTransform: function(args) {
var selector = args[0],
property = args[1],
operator = args[2],
compareTo = args[4],
compareRe;
if (compareTo !== undefined) {
compareTo = compareTo.replace(unescapeRe, '$1');
var format = Ext.String.format,
msg = "ComponentQuery selector '{0}' has an unescaped ({1}) character at the {2} " + "of the attribute value pattern. Usually that indicates an error " + "where the opening quote is not followed by the closing quote. " + "If you need to match a ({1}) character at the {2} of the attribute " + "value, escape the quote character in your pattern: (\\{1})",
match;
if (match = /^(['"]).*?[^'"]$/.exec(compareTo)) {
Ext.log.warn(format(msg, selector, match[1], 'beginning'));
} else if (match = /^[^'"].*?(['"])$/.exec(compareTo)) {
Ext.log.warn(format(msg, selector, match[1], 'end'));
}
}
if (operator === '/=') {
compareRe = regexCache.get(compareTo);
if (compareRe) {
compareTo = compareRe;
} else {
compareTo = regexCache.add(compareTo, new RegExp(compareTo));
}
}
return [
property,
operator,
compareTo
];
}
},
{
re: /^#((?:\\\.|[\w\-])+)/,
method: filterById
},
{
re: /^\:([\w\-]+)(?:\(((?:\{[^\}]+\})|(?:(?!\{)[^\s>\/]*?(?!\})))\))?/,
method: filterByPseudo,
argTransform: function(args) {
if (args[2] !== undefined) {
args[2] = args[2].replace(unescapeRe, '$1');
}
return args.slice(1);
}
},
{
re: /^(?:\{([^\}]+)\})/,
method: filterFnPattern
}
];
cq.Query = Ext.extend(Object, {
constructor: function(cfg) {
cfg = cfg || {};
Ext.apply(this, cfg);
},
execute: function(root) {
var operations = this.operations,
result = [],
op, i, len;
for (i = 0 , len = operations.length; i < len; i++) {
op = operations[i];
result = result.concat(this._execute(root, op));
}
return result;
},
_execute: function(root, operations) {
var i = 0,
length = operations.length,
operation, workingItems;
if (!root) {
workingItems = Ext.ComponentManager.getAll();
}
else if (Ext.isIterable(root)) {
workingItems = root;
}
else if (root.isMixedCollection) {
workingItems = root.items;
}
for (; i < length; i++) {
operation = operations[i];
if (operation.mode === '^') {
workingItems = getAncestors(workingItems || [
root
]);
} else if (operation.mode) {
workingItems = getItems(workingItems || [
root
], operation.mode);
} else {
workingItems = filterItems(workingItems || getItems([
root
]), operation);
}
if (i === length - 1) {
return workingItems;
}
}
return [];
},
is: function(component) {
var operations = this.operations,
result = false,
len = operations.length,
op, i;
if (len === 0) {
return true;
}
for (i = 0; i < len; i++) {
op = operations[i];
result = this._is(component, op);
if (result) {
return result;
}
}
return false;
},
_is: function(component, operations) {
var len = operations.length,
active = [
component
],
operation, i, j, mode, items, item;
for (i = len - 1; i >= 0; --i) {
operation = operations[i];
mode = operation.mode;
if (mode) {
if (mode === '^') {
active = getItems(active, ' ');
} else if (mode === '>') {
items = [];
for (j = 0 , len = active.length; j < len; ++j) {
item = active[j].getRefOwner();
if (item) {
items.push(item);
}
}
active = items;
} else {
active = getAncestors(active);
}
if (active.length === 0) {
return false;
}
} else {
active = filterItems(active, operation);
if (active.length === 0) {
return false;
}
}
}
return true;
},
getMatches: function(components, operations) {
var len = operations.length,
i;
for (i = 0; i < len; ++i) {
components = filterItems(components, operations[i]);
if (components.length === 0) {
break;
}
}
return components;
},
isMultiMatch: function() {
return this.operations.length > 1;
}
});
Ext.apply(cq, {
cache: new Ext.util.LruCache({
maxSize: 100
}),
pseudos: {
not: function(components, selector) {
var i = 0,
length = components.length,
results = [],
index = -1,
component;
for (; i < length; ++i) {
component = components[i];
if (!cq.is(component, selector)) {
results[++index] = component;
}
}
return results;
},
first: function(components) {
var ret = [];
if (components.length > 0) {
ret.push(components[0]);
}
return ret;
},
last: function(components) {
var len = components.length,
ret = [];
if (len > 0) {
ret.push(components[len - 1]);
}
return ret;
},
focusable: function(cmps) {
var len = cmps.length,
results = [],
i = 0,
c;
for (; i < len; i++) {
c = cmps[i];
if (c.isFocusable && c.isFocusable()) {
results.push(c);
}
}
return results;
},
"nth-child": function(c, a) {
var result = [],
m = nthRe.exec(a === "even" && "2n" || a === "odd" && "2n+1" || !nthRe2.test(a) && "n+" + a || a),
f = (m[1] || 1) - 0,
len = m[2] - 0,
i, n, nodeIndex;
for (i = 0; n = c[i]; i++) {
nodeIndex = i + 1;
if (f === 1) {
if (len === 0 || nodeIndex === len) {
result.push(n);
}
} else if ((nodeIndex + len) % f === 0) {
result.push(n);
}
}
return result;
}
},
query: function(selector, root) {
if (!selector) {
return Ext.ComponentManager.all.getArray();
}
var results = [],
noDupResults = [],
dupMatcher = {},
query = cq.cache.get(selector),
resultsLn, cmp, i;
if (!query) {
query = cq.cache.add(selector, cq.parse(selector));
}
results = query.execute(root);
if (query.isMultiMatch()) {
resultsLn = results.length;
for (i = 0; i < resultsLn; i++) {
cmp = results[i];
if (!dupMatcher[cmp.id]) {
noDupResults.push(cmp);
dupMatcher[cmp.id] = true;
}
}
results = noDupResults;
}
return results;
},
visitPreOrder: function(selector, root, fn, scope, extraArgs) {
cq._visit(true, selector, root, fn, scope, extraArgs);
},
visitPostOrder: function(selector, root, fn, scope, extraArgs) {
cq._visit(false, selector, root, fn, scope, extraArgs);
},
_visit: function(preOrder, selector, root, fn, scope, extraArgs) {
var query = cq.cache.get(selector),
callArgs = [
root
],
children,
len = 0,
i, rootMatch;
if (!query) {
query = cq.cache.add(selector, cq.parse(selector));
}
rootMatch = query.is(root);
if (root.getRefItems) {
children = root.getRefItems();
len = children.length;
}
if (extraArgs) {
Ext.Array.push(callArgs, extraArgs);
}
if (preOrder) {
if (rootMatch) {
if (fn.apply(scope || root, callArgs) === false) {
return false;
}
}
}
for (i = 0; i < len; i++) {
if (cq._visit.call(cq, preOrder, selector, children[i], fn, scope, extraArgs) === false) {
return false;
}
}
if (!preOrder) {
if (rootMatch) {
if (fn.apply(scope || root, callArgs) === false) {
return false;
}
}
}
},
is: function(component, selector) {
if (!selector) {
return true;
}
var query = cq.cache.get(selector);
if (!query) {
query = cq.cache.add(selector, cq.parse(selector));
}
return query.is(component);
},
parse: function(selector) {
var operations = [],
selectors, sel, i, len;
selectors = Ext.splitAndUnescape(selector, ',');
for (i = 0 , len = selectors.length; i < len; i++) {
sel = Ext.String.trim(selectors[i]);
if (sel === '') {
Ext.Error.raise('Invalid ComponentQuery selector: ""');
}
operations.push(cq._parse(sel));
}
return new cq.Query({
operations: operations
});
},
_parse: function(selector) {
var operations = [],
trim = Ext.String.trim,
length = matchers.length,
lastSelector, tokenMatch, token, matchedChar, modeMatch, selectorMatch, transform, i, matcher, method, args;
while (selector && lastSelector !== selector) {
lastSelector = selector;
tokenMatch = selector.match(tokenRe);
if (tokenMatch) {
matchedChar = tokenMatch[1];
token = trim(tokenMatch[2]).replace(unescapeRe, '$1');
if (matchedChar === '#') {
operations.push({
method: filterById,
args: [
token
]
});
} else
{
operations.push({
method: filterByXType,
args: [
token,
Boolean(tokenMatch[3])
]
});
}
selector = selector.replace(tokenMatch[0], '').replace(stripLeadingSpaceRe, '$1');
}
while (!(modeMatch = selector.match(modeRe))) {
for (i = 0; selector && i < length; i++) {
matcher = matchers[i];
selectorMatch = selector.match(matcher.re);
method = matcher.method;
transform = matcher.argTransform;
if (selectorMatch) {
if (transform) {
args = transform(selectorMatch);
} else {
args = selectorMatch.slice(1);
}
operations.push({
method: Ext.isString(matcher.method) ?
Ext.functionFactory('items', Ext.String.format.apply(Ext.String, [
method
].concat(selectorMatch.slice(1)))) : matcher.method,
args: args
});
selector = selector.replace(selectorMatch[0], '').replace(stripLeadingSpaceRe, '$1');
break;
}
if (i === (length - 1)) {
Ext.Error.raise('Invalid ComponentQuery selector: "' + arguments[0] + '"');
}
}
}
if (modeMatch[1]) {
operations.push({
mode: modeMatch[2] || modeMatch[1]
});
selector = selector.replace(modeMatch[0], '').replace(stripLeadingSpaceRe, '');
}
}
return operations;
}
});
});
Ext.define('Ext.Evented', {
alternateClassName: 'Ext.EventedBase',
mixins: [
'Ext.mixin.Observable'
],
statics: {
generateSetter: function(cfg) {
var names = cfg.names,
name = cfg.name,
prefixedName = names.internal,
applyName = names.apply,
changeEventName = names.changeEvent,
doSetName = names.doSet;
return function(value) {
var me = this,
internalName = me.$configPrefixed ? prefixedName : name,
initialized = me.initialized,
oldValue,
applier = me[applyName];
if (applier) {
value = applier.call(me, value, me[internalName]);
if (value === undefined) {
return me;
}
}
oldValue = me[internalName];
if (value !== oldValue) {
if (initialized) {
me.fireAction(changeEventName, [
me,
value,
oldValue
], me.doSet, me, {
nameMap: names
});
} else {
me[internalName] = value;
if (me[doSetName]) {
me[doSetName](value, oldValue);
}
}
}
return this;
};
}
},
initialized: false,
constructor: function(config) {
this.mixins.observable.constructor.call(this, config);
this.initialized = true;
},
doSet: function(me, value, oldValue, options) {
var nameMap = options.nameMap;
me[nameMap.internal] = value;
if (me[nameMap.doSet]) {
me[nameMap.doSet].call(this, value, oldValue);
}
},
onClassExtended: function(cls, data) {
if (!data.hasOwnProperty('eventedConfig')) {
return;
}
var config = data.config,
eventedConfig = data.eventedConfig,
cacheName = 'eventedSetter',
name, cfg;
if (config) {
Ext.applyIf(config, eventedConfig);
} else {
cls.addConfig(eventedConfig);
}
for (name in eventedConfig) {
if (eventedConfig.hasOwnProperty(name)) {
cfg = Ext.Config.get(name);
data[cfg.names.set] = cfg[cacheName] || (cfg[cacheName] = this.generateSetter(cfg));
}
}
}
});
Ext.define('Ext.util.Positionable', {
mixinId: 'positionable',
_positionTopLeft: [
'position',
'top',
'left'
],
_alignRe: /^([a-z]+)-([a-z]+)(\?)?$/,
afterSetPosition: Ext.emptyFn,
getAnchorToXY: function() {
Ext.Error.raise("getAnchorToXY is not implemented in " + this.$className);
},
getBorderPadding: function() {
Ext.Error.raise("getBorderPadding is not implemented in " + this.$className);
},
getLocalX: function() {
Ext.Error.raise("getLocalX is not implemented in " + this.$className);
},
getLocalXY: function() {
Ext.Error.raise("getLocalXY is not implemented in " + this.$className);
},
getLocalY: function() {
Ext.Error.raise("getLocalY is not implemented in " + this.$className);
},
getX: function() {
Ext.Error.raise("getX is not implemented in " + this.$className);
},
getXY: function() {
Ext.Error.raise("getXY is not implemented in " + this.$className);
},
getY: function() {
Ext.Error.raise("getY is not implemented in " + this.$className);
},
setLocalX: function() {
Ext.Error.raise("setLocalX is not implemented in " + this.$className);
},
setLocalXY: function() {
Ext.Error.raise("setLocalXY is not implemented in " + this.$className);
},
setLocalY: function() {
Ext.Error.raise("setLocalY is not implemented in " + this.$className);
},
setX: function() {
Ext.Error.raise("setX is not implemented in " + this.$className);
},
setXY: function() {
Ext.Error.raise("setXY is not implemented in " + this.$className);
},
setY: function() {
Ext.Error.raise("setY is not implemented in " + this.$className);
},
adjustForConstraints: function(xy, parent) {
var vector = this.getConstrainVector(parent, xy);
if (vector) {
xy[0] += vector[0];
xy[1] += vector[1];
}
return xy;
},
alignTo: function(element, position, offsets,
animate) {
var me = this,
el = me.el;
return me.setXY(me.getAlignToXY(element, position, offsets), el.anim && !!animate ? el.anim(animate) : false);
},
calculateAnchorXY: function(anchor, extraX, extraY, mySize) {
var me = this,
el = me.el,
doc = document,
isViewport = (el.dom === doc.body || el.dom === doc),
round = Math.round,
xy, myWidth, myHeight;
anchor = (anchor || "tl").toLowerCase();
mySize = mySize || {};
myWidth = mySize.width || (isViewport ? Ext.Element.getViewportWidth() : me.getWidth());
myHeight = mySize.height || (isViewport ? Ext.Element.getViewportHeight() : me.getHeight());
switch (anchor) {
case 'tl':
xy = [
0,
0
];
break;
case 'bl':
xy = [
0,
myHeight
];
break;
case 'tr':
xy = [
myWidth,
0
];
break;
case 'c':
xy = [
round(myWidth * 0.5),
round(myHeight * 0.5)
];
break;
case 't':
xy = [
round(myWidth * 0.5),
0
];
break;
case 'l':
xy = [
0,
round(myHeight * 0.5)
];
break;
case 'r':
xy = [
myWidth,
round(myHeight * 0.5)
];
break;
case 'b':
xy = [
round(myWidth * 0.5),
myHeight
];
break;
case 'tc':
xy = [
round(myWidth * 0.5),
0
];
break;
case 'bc':
xy = [
round(myWidth * 0.5),
myHeight
];
break;
case 'br':
xy = [
myWidth,
myHeight
];
}
return [
xy[0] + extraX,
xy[1] + extraY
];
},
convertPositionSpec: Ext.identityFn,
getAlignToXY: function(alignToEl, posSpec, offset) {
var me = this,
constrainToEl, constrainTo, alignMatch, myPosition, alignToElPosition, myWidth, myHeight, alignToElRegion, swapY, swapX, constrain, align1, align2, p1y, p1x, p2y, p2x, x, y;
alignToEl = Ext.get(alignToEl.el || alignToEl);
if (!alignToEl || !alignToEl.dom) {
Ext.Error.raise({
sourceClass: 'Ext.util.Positionable',
sourceMethod: 'getAlignToXY',
msg: 'Attempted to align an element that doesn\'t exist'
});
}
offset = offset || [
0,
0
];
posSpec = (!posSpec || posSpec === "?" ? "tl-bl?" : (!(/-/).test(posSpec) && posSpec !== "" ? "tl-" + posSpec : posSpec || "tl-bl")).toLowerCase();
posSpec = me.convertPositionSpec(posSpec);
alignMatch = posSpec.match(me._alignRe);
if (!alignMatch) {
Ext.Error.raise({
sourceClass: 'Ext.util.Positionable',
sourceMethod: 'getAlignToXY',
el: alignToEl,
position: posSpec,
offset: offset,
msg: 'Attemmpted to align an element with an invalid position: "' + posSpec + '"'
});
}
align1 = alignMatch[1];
align2 = alignMatch[2];
constrain = !!alignMatch[3];
myPosition = me.getAnchorXY(align1, true);
alignToElPosition = me.getAnchorToXY(alignToEl, align2, false);
x = alignToElPosition[0] - myPosition[0] + offset[0];
y = alignToElPosition[1] - myPosition[1] + offset[1];
if (constrain) {
constrainToEl = me.constrainTo || me.container || me.el.parent();
constrainToEl = Ext.get(constrainToEl.el || constrainToEl);
constrainTo = constrainToEl.getConstrainRegion();
constrainTo.right = constrainTo.left + constrainToEl.el.dom.clientWidth;
myWidth = me.getWidth();
myHeight = me.getHeight();
alignToElRegion = alignToEl.getRegion();
p1y = align1.charAt(0);
p1x = align1.charAt(align1.length - 1);
p2y = align2.charAt(0);
p2x = align2.charAt(align2.length - 1);
swapY = (x < alignToElRegion.right && x + myWidth >= alignToElRegion.left) && ((p1y == "t" && p2y == "b") || (p1y == "b" && p2y == "t"));
swapX = (y < alignToElRegion.bottom && y + myHeight >= alignToElRegion.top) && ((p1x == "r" && p2x == "l") || (p1x == "l" && p2x == "r"));
if (x + myWidth > constrainTo.right) {
if (swapX) {
x = alignToElRegion.left - myWidth;
swapX = false;
} else {
x = constrainTo.right - myWidth;
}
}
if (x < constrainTo.left) {
x = swapX ? alignToElRegion.right : constrainTo.left;
}
if (y + myHeight > constrainTo.bottom) {
if (swapY) {
y = alignToElRegion.top - myHeight;
swapY = false;
} else {
y = constrainTo.bottom - myHeight;
}
}
if (y < constrainTo.top) {
y = swapY ? alignToElRegion.bottom : constrainTo.top;
}
}
return [
x,
y
];
},
getAnchorXY: function(anchor, local, mySize) {
var me = this,
myPos = me.getXY(),
el = me.el,
doc = document,
isViewport = el.dom == doc.body || el.dom == doc,
scroll = el.getScroll(),
extraX = isViewport ? scroll.left : local ? 0 : myPos[0],
extraY = isViewport ? scroll.top : local ? 0 : myPos[1];
return me.calculateAnchorXY(anchor, extraX, extraY, mySize);
},
getBox: function(contentBox, local) {
var me = this,
xy = local ? me.getLocalXY() : me.getXY(),
x = xy[0],
y = xy[1],
w = me.getWidth(),
h = me.getHeight(),
borderPadding, beforeX, beforeY;
if (contentBox) {
borderPadding = me.getBorderPadding();
beforeX = borderPadding.beforeX;
beforeY = borderPadding.beforeY;
x += beforeX;
y += beforeY;
w -= (beforeX + borderPadding.afterX);
h -= (beforeY + borderPadding.afterY);
}
return {
x: x,
left: x,
0: x,
y: y,
top: y,
1: y,
width: w,
height: h,
right: x + w,
bottom: y + h
};
},
calculateConstrainedPosition: function(constrainTo, proposedPosition, local, proposedSize) {
var me = this,
vector,
fp = me.floatParent,
parentNode = fp ? fp.getTargetEl() : null,
parentOffset, borderPadding, proposedConstrainPosition,
xy = false,
localXY;
if (local && fp) {
parentOffset = parentNode.getXY();
borderPadding = parentNode.getBorderPadding();
parentOffset[0] += borderPadding.beforeX;
parentOffset[1] += borderPadding.beforeY;
if (proposedPosition) {
proposedConstrainPosition = [
proposedPosition[0] + parentOffset[0],
proposedPosition[1] + parentOffset[1]
];
}
} else {
proposedConstrainPosition = proposedPosition;
}
constrainTo = constrainTo || me.constrainTo || parentNode || me.container || me.el.parent();
if (local && proposedConstrainPosition) {
proposedConstrainPosition = me.reverseTranslateXY(proposedConstrainPosition);
}
vector = ((me.constrainHeader && me.header.rendered) ? me.header : me).getConstrainVector(constrainTo, proposedConstrainPosition, proposedSize);
if (vector) {
xy = proposedPosition || me.getPosition(local);
xy[0] += vector[0];
xy[1] += vector[1];
}
return xy;
},
getConstrainRegion: function() {
var me = this,
el = me.el,
isBody = el.dom.nodeName === 'BODY',
dom = el.dom,
borders = el.getBorders(),
pos = el.getXY(),
left = pos[0] + borders.beforeX,
top = pos[1] + borders.beforeY,
scroll, width, height;
if (isBody) {
scroll = el.getScroll();
left = scroll.left;
top = scroll.top;
width = Ext.Element.getViewportWidth();
height = Ext.Element.getViewportHeight();
} else {
width = dom.clientWidth;
height = dom.clientHeight;
}
return new Ext.util.Region(top, left + width, top + height, left);
},
getConstrainVector: function(constrainTo, proposedPosition, proposedSize) {
var thisRegion = this.getRegion(),
vector = [
0,
0
],
shadowSize = (this.shadow && this.constrainShadow && !this.shadowDisabled) ? this.shadow.getShadowSize() : undefined,
overflowed = false,
constrainSize,
constraintInsets = this.constraintInsets;
if (!(constrainTo instanceof Ext.util.Region)) {
constrainTo = Ext.get(constrainTo.el || constrainTo);
constrainSize = constrainTo.getViewSize();
constrainTo = constrainTo.getConstrainRegion();
constrainTo.right = constrainTo.left + constrainSize.width;
constrainTo.bottom = constrainTo.top + constrainSize.height;
}
if (constraintInsets) {
constraintInsets = Ext.isObject(constraintInsets) ? constraintInsets : Ext.Element.parseBox(constraintInsets);
constrainTo.adjust(constraintInsets.top, constraintInsets.right, constraintInsets.bottom, constraintInsets.length);
}
if (proposedPosition) {
thisRegion.translateBy(proposedPosition[0] - thisRegion.x, proposedPosition[1] - thisRegion.y);
}
if (proposedSize) {
thisRegion.right = thisRegion.left + proposedSize[0];
thisRegion.bottom = thisRegion.top + proposedSize[1];
}
if (shadowSize) {
constrainTo.adjust(shadowSize[0], -shadowSize[1], -shadowSize[2], shadowSize[3]);
}
if (thisRegion.right > constrainTo.right) {
overflowed = true;
vector[0] = (constrainTo.right - thisRegion.right);
}
if (thisRegion.left + vector[0] < constrainTo.left) {
overflowed = true;
vector[0] = (constrainTo.left - thisRegion.left);
}
if (thisRegion.bottom > constrainTo.bottom) {
overflowed = true;
vector[1] = (constrainTo.bottom - thisRegion.bottom);
}
if (thisRegion.top + vector[1] < constrainTo.top) {
overflowed = true;
vector[1] = (constrainTo.top - thisRegion.top);
}
return overflowed ? vector : false;
},
getOffsetsTo: function(offsetsTo) {
var o = this.getXY(),
e = Ext.fly(offsetsTo.el || offsetsTo).getXY();
return [
o[0] - e[0],
o[1] - e[1]
];
},
getRegion: function() {
var box = this.getBox();
return new Ext.util.Region(box.top, box.right, box.bottom, box.left);
},
getViewRegion: function() {
var me = this,
el = me.el,
isBody = el.dom.nodeName === 'BODY',
borderPadding, scroll, pos, top, left, width, height;
if (isBody) {
scroll = el.getScroll();
left = scroll.left;
top = scroll.top;
width = Ext.Element.getViewportWidth();
height = Ext.Element.getViewportHeight();
} else {
borderPadding = me.getBorderPadding();
pos = me.getXY();
left = pos[0] + borderPadding.beforeX;
top = pos[1] + borderPadding.beforeY;
width = me.getWidth(true);
height = me.getHeight(true);
}
return new Ext.util.Region(top, left + width, top + height, left);
},
move: function(direction, distance,
animate) {
var me = this,
xy = me.getXY(),
x = xy[0],
y = xy[1],
left = [
x - distance,
y
],
right = [
x + distance,
y
],
top = [
x,
y - distance
],
bottom = [
x,
y + distance
],
hash = {
l: left,
left: left,
r: right,
right: right,
t: top,
top: top,
up: top,
b: bottom,
bottom: bottom,
down: bottom
};
direction = direction.toLowerCase();
me.setXY([
hash[direction][0],
hash[direction][1]
], animate);
},
setBox: function(box) {
var me = this,
x, y;
if (box.isRegion) {
box = {
x: box.left,
y: box.top,
width: box.right - box.left,
height: box.bottom - box.top
};
}
me.constrainBox(box);
x = box.x;
y = box.y;
me.setXY([
x,
y
]);
me.setSize(box.width, box.height);
me.afterSetPosition(x, y);
return me;
},
constrainBox: function(box) {
var me = this,
constrainedPos, x, y;
if (me.constrain || me.constrainHeader) {
x = ('x' in box) ? box.x : box.left;
y = ('y' in box) ? box.y : box.top;
constrainedPos = me.calculateConstrainedPosition(null, [
x,
y
], false, [
box.width,
box.height
]);
if (constrainedPos) {
box.x = constrainedPos[0];
box.y = constrainedPos[1];
}
}
},
translatePoints: function(x, y) {
var pos = this.translateXY(x, y);
return {
left: pos.x,
top: pos.y
};
},
translateXY: function(x, y) {
var me = this,
el = me.el,
styles = el.getStyle(me._positionTopLeft),
relative = styles.position === 'relative',
left = parseFloat(styles.left),
top = parseFloat(styles.top),
xy = me.getXY();
if (Ext.isArray(x)) {
y = x[1];
x = x[0];
}
if (isNaN(left)) {
left = relative ? 0 : el.dom.offsetLeft;
}
if (isNaN(top)) {
top = relative ? 0 : el.dom.offsetTop;
}
left = (typeof x === 'number') ? x - xy[0] + left : undefined;
top = (typeof y === 'number') ? y - xy[1] + top : undefined;
return {
x: left,
y: top
};
},
reverseTranslateXY: function(xy) {
var coords = xy,
el = this.el,
translatedXY = [],
dom = el.dom,
offsetParent = dom.offsetParent,
relative, offsetParentXY, x, y;
if (offsetParent) {
relative = el.isStyle('position', 'relative') , offsetParentXY = Ext.fly(offsetParent).getXY() , x = xy[0] + offsetParentXY[0] + offsetParent.clientLeft;
y = xy[1] + offsetParentXY[1] + offsetParent.clientTop;
if (relative) {
x += el.getPadding('l');
y += el.getPadding('t');
}
coords = [
x,
y
];
}
return coords;
}
});
Ext.define('Ext.overrides.util.Positionable', {
override: 'Ext.util.Positionable',
anchorTo: function(anchorToEl, alignment, offsets, animate, monitorScroll, callback) {
var me = this,
scroll = !Ext.isEmpty(monitorScroll),
action = function() {
me.alignTo(anchorToEl, alignment, offsets, animate);
Ext.callback(callback, me);
},
anchor = me.getAnchor();
me.removeAnchor();
Ext.apply(anchor, {
fn: action,
scroll: scroll
});
Ext.on('resize', action, null);
if (scroll) {
Ext.getWin().on('scroll', action, null, {
buffer: !isNaN(monitorScroll) ? monitorScroll : 50
});
}
action();
return me;
},
getAnchor: function() {
var el = this.el,
data, anchor;
if (!el.dom) {
return;
}
data = el.getData();
anchor = data._anchor;
if (!anchor) {
anchor = data._anchor = {};
}
return anchor;
},
removeAnchor: function() {
var anchor = this.getAnchor();
if (anchor && anchor.fn) {
Ext.un('resize', anchor.fn);
if (anchor.scroll) {
Ext.getWin().on('scroll', anchor.fn);
}
delete anchor.fn;
}
return this;
},
setBox: function(box, animate) {
var me = this;
if (box.isRegion) {
box = {
x: box.left,
y: box.top,
width: box.right - box.left,
height: box.bottom - box.top
};
}
if (animate) {
me.constrainBox(box);
me.animate(Ext.applyIf({
to: box,
listeners: {
afteranimate: Ext.Function.bind(me.afterSetPosition, me, [
box.x,
box.y
])
}
}, animate));
} else {
me.callParent([
box
]);
}
return me;
}
});
Ext.define('Ext.dom.UnderlayPool', {
constructor: function(elementConfig) {
this.elementConfig = elementConfig;
this.cache = [];
},
checkOut: function() {
var el = this.cache.shift();
if (!el) {
el = Ext.Element.create(this.elementConfig);
el.setVisibilityMode(2);
el.dom.setAttribute('data-sticky', true);
}
return el;
},
checkIn: function(el) {
this.cache.push(el);
},
reset: function() {
var cache = this.cache,
i = cache.length;
while (i--) {
cache[i].destroy();
}
this.cache = [];
}
});
Ext.define('Ext.dom.Underlay', {
requires: [
'Ext.dom.UnderlayPool'
],
constructor: function(config) {
Ext.apply(this, config);
},
beforeShow: Ext.emptyFn,
getInsertionTarget: function() {
return this.target;
},
getPool: function() {
return this.pool || (this.self.prototype.pool = new Ext.dom.UnderlayPool(this.elementConfig));
},
hide: function() {
var me = this,
el = me.el;
if (el) {
el.hide();
me.getPool().checkIn(el);
me.el = null;
me.hidden = true;
}
},
realign: function(x, y, width, height) {
var me = this,
el = me.el,
target = me.target,
offsets = me.offsets,
max = Math.max;
if (el) {
if (x == null) {
x = target.getX();
}
if (y == null) {
y = target.getY();
}
if (width == null) {
width = target.getWidth();
}
if (height == null) {
height = target.getHeight();
}
if (offsets) {
x = x + offsets.x;
y = y + offsets.y;
width = max(width + offsets.w, 0);
height = max(height + offsets.h, 0);
}
el.setXY([
x,
y
]);
el.setSize(width, height);
}
},
setZIndex: function(zIndex) {
this.zIndex = zIndex;
if (this.el) {
this.el.setStyle("z-index", zIndex);
}
},
show: function() {
var me = this,
target = me.target,
zIndex = me.zIndex,
el = me.el,
insertionTarget = me.getInsertionTarget().dom,
dom;
if (!el) {
el = me.el = me.getPool().checkOut();
}
me.beforeShow();
if (zIndex == null) {
zIndex = (parseInt(target.getStyle("z-index"), 10));
}
if (zIndex) {
el.setStyle("z-index", zIndex);
}
el.setStyle('position', me.fixed ? 'fixed' : '');
dom = el.dom;
if (dom.nextSibling !== insertionTarget) {
target.dom.parentNode.insertBefore(dom, insertionTarget);
}
el.show();
me.realign();
me.hidden = false;
}
});
Ext.define('Ext.dom.Shadow', {
extend: 'Ext.dom.Underlay',
alternateClassName: 'Ext.Shadow',
mode: 'drop',
offset: 4,
cls: Ext.baseCSSPrefix + (!Ext.supports.CSS3BoxShadow ? 'ie' : 'css') + '-shadow',
constructor: function(config) {
var me = this,
outerOffsets, offsets, offset, rad;
me.callParent([
config
]);
me.elementConfig = {
cls: me.cls,
role: 'presentation'
};
offset = me.offset;
rad = Math.floor(offset / 2);
me.opacity = 50;
switch (me.mode.toLowerCase()) {
case "drop":
outerOffsets = {
x: 0,
y: 0,
w: offset,
h: offset
};
if (Ext.supports.CSS3BoxShadow) {
offsets = {
x: offset,
y: offset,
h: -offset,
w: -offset
};
} else {
offsets = {
x: -rad,
y: -rad,
h: -rad,
w: -rad
};
};
break;
case "sides":
outerOffsets = {
x: -offset,
y: 0,
w: offset * 2,
h: offset
};
if (Ext.supports.CSS3BoxShadow) {
offsets = {
x: 0,
y: offset,
h: -offset,
w: 0
};
} else {
offsets = {
x: 1 + rad - 2 * offset,
y: -(1 + rad),
h: -1,
w: rad - 1
};
};
break;
case "frame":
outerOffsets = {
x: -offset,
y: -offset,
w: offset * 2,
h: offset * 2
};
if (Ext.supports.CSS3BoxShadow) {
offsets = {
x: 0,
y: 0,
h: 0,
w: 0
};
} else {
offsets = {
x: 1 + rad - 2 * offset,
y: 1 + rad - 2 * offset,
h: offset - rad - 1,
w: offset - rad - 1
};
};
break;
case "bottom":
outerOffsets = {
x: -offset,
y: 0,
w: offset * 2,
h: offset
};
if (Ext.supports.CSS3BoxShadow) {
offsets = {
x: 0,
y: offset,
h: -offset,
w: 0
};
} else {
offsets = {
x: 0,
y: offset,
h: 0,
w: 0
};
};
break;
}
me.offsets = offsets;
me.outerOffsets = outerOffsets;
},
getShadowSize: function() {
var me = this,
offset = me.el ? me.offset : 0,
result = [
offset,
offset,
offset,
offset
],
mode = me.mode.toLowerCase();
if (me.el && mode !== 'frame') {
result[0] = 0;
if (mode == 'drop') {
result[3] = 0;
}
}
return result;
},
boxShadowProperty: (function() {
var property = 'boxShadow',
style = document.documentElement.style;
if (!('boxShadow' in style)) {
if ('WebkitBoxShadow' in style) {
property = 'WebkitBoxShadow';
} else if ('MozBoxShadow' in style) {
property = 'MozBoxShadow';
}
}
return property;
}()),
beforeShow: function() {
var me = this,
style = me.el.dom.style,
shim = me.shim;
if (Ext.supports.CSS3BoxShadow) {
style[me.boxShadowProperty] = '0 0 ' + (me.offset + 2) + 'px #888';
} else {
style.filter = "progid:DXImageTransform.Microsoft.alpha(opacity=" + me.opacity + ") progid:DXImageTransform.Microsoft.Blur(pixelradius=" + (me.offset) + ")";
}
if (shim) {
shim.realign();
}
},
setOpacity: function(opacity) {
var el = this.el;
if (el) {
if (Ext.isIE && !Ext.supports.CSS3BoxShadow) {
opacity = Math.floor(opacity * 100 / 2) / 100;
}
this.opacity = opacity;
el.setOpacity(opacity);
}
}
});
Ext.define('Ext.dom.Shim', {
extend: 'Ext.dom.Underlay',
cls: Ext.baseCSSPrefix + 'shim',
constructor: function(config) {
this.callParent([
config
]);
this.elementConfig = {
tag: 'iframe',
cls: this.cls,
role: 'presentation',
frameBorder: '0',
src: Ext.SSL_SECURE_URL,
tabindex: '-1'
};
},
getInsertionTarget: function() {
var shadow = this.shadow;
return (shadow && shadow.el) || this.target;
}
});
Ext.define('Ext.dom.ElementEvent', {
extend: 'Ext.util.Event',
addListener: function(fn, scope, options, caller, manager) {
var me = this,
added = false,
name = me.name,
captures, directs, directCaptures;
options = options || {};
if (options.delegated === false || Ext.event.publisher.Dom.instance.directEvents[name]) {
if (options.capture) {
directCaptures = me.directCaptures || (me.directCaptures = new Ext.util.Event(me.observable, name));
added = directCaptures.addListener(fn, scope, options, caller, manager);
} else {
directs = me.directs || (me.directs = new Ext.util.Event(me.observable, name));
added = directs.addListener(fn, scope, options, caller, manager);
}
} else if (options.capture) {
captures = me.captures || (me.captures = new Ext.util.Event(me.observable, name));
added = captures.addListener(fn, scope, options, caller, manager);
} else {
added = me.callParent([
fn,
scope,
options,
caller,
manager
]);
}
return added;
},
removeListener: function(fn, scope) {
var me = this,
captures = me.captures,
directs = me.directs,
directCaptures = me.directCaptures,
removed = false,
index = me.findListener(fn, scope);
if (index !== -1) {
removed = me.callParent([
fn,
scope,
index
]);
} else {
if (directs) {
index = directs.findListener(fn, scope);
}
if (index !== -1) {
removed = directs.removeListener(fn, scope, index);
} else {
if (captures) {
index = captures.findListener(fn, scope);
}
if (index !== -1) {
removed = captures.removeListener(fn, scope, index);
} else if (directCaptures) {
index = directCaptures.findListener(fn, scope);
if (index !== -1) {
removed = directCaptures.removeListener(fn, scope, index);
}
}
}
}
return removed;
},
clearListeners: function() {
var me = this,
directCaptures = me.directCaptures,
directs = me.directs,
captures = me.captures;
if (directCaptures) {
directCaptures.clearListeners();
}
if (directs) {
directs.clearListeners();
}
if (captures) {
captures.clearListeners();
}
me.callParent();
},
suspend: function() {
var me = this,
directCaptures = me.directCaptures,
directs = me.directs,
captures = me.captures;
if (directCaptures) {
directCaptures.suspend();
}
if (directs) {
directs.suspend();
}
if (captures) {
captures.suspend();
}
me.callParent();
},
resume: function() {
var me = this,
directCaptures = me.directCaptures,
directs = me.directs,
captures = me.captures;
if (directCaptures) {
directCaptures.resume();
}
if (directs) {
directs.resume();
}
if (captures) {
captures.resume();
}
me.callParent();
}
});
Ext.define('Ext.event.publisher.Publisher', {
handledEvents: [],
statics: {
publishers: {},
publishersByEvent: {}
},
constructor: function() {
var me = this,
type = me.type;
me.handles = {};
if (!type) {
Ext.Error.raise("Event publisher '" + me.$className + "' defined without a 'type' property.");
}
if (me.self.instance) {
Ext.Error.raise("Cannot create multiple instances of '" + me.$className + "'. " + "Use '" + me.$className + ".instance' to retrieve the singleton instance.");
}
me.registerEvents();
Ext.event.publisher.Publisher.publishers[type] = me;
},
registerEvents: function(events) {
var me = this,
publishersByEvent = Ext.event.publisher.Publisher.publishersByEvent,
handledEvents = events || me.handledEvents,
ln = handledEvents.length,
eventName, i;
for (i = 0; i < ln; i++) {
eventName = handledEvents[i];
me.handles[eventName] = 1;
publishersByEvent[eventName] = me;
}
},
fire: function(element, eventName, args) {
var event;
if (element.hasListeners[eventName]) {
event = element.events[eventName];
if (event) {
event.fire.apply(event, args);
}
}
},
subscribe: function() {
Ext.Error.raise("Ext.event.publisher.Publisher subclass '" + this.$className + '" has no subscribe method.');
},
unsubscribe: function() {
Ext.Error.raise("Ext.event.publisher.Publisher subclass '" + this.$className + '" has no unsubscribe method.');
},
destroy: Ext.emptyFn
});
Ext.define('Ext.util.Offset', {
statics: {
fromObject: function(obj) {
return new this(obj.x, obj.y);
}
},
constructor: function(x, y) {
this.x = (x != null && !isNaN(x)) ? x : 0;
this.y = (y != null && !isNaN(y)) ? y : 0;
return this;
},
copy: function() {
return new Ext.util.Offset(this.x, this.y);
},
copyFrom: function(p) {
this.x = p.x;
this.y = p.y;
},
toString: function() {
return "Offset[" + this.x + "," + this.y + "]";
},
equals: function(offset) {
if (!(offset instanceof this.statics())) {
Ext.Error.raise('Offset must be an instance of Ext.util.Offset');
}
return (this.x == offset.x && this.y == offset.y);
},
round: function(to) {
if (!isNaN(to)) {
var factor = Math.pow(10, to);
this.x = Math.round(this.x * factor) / factor;
this.y = Math.round(this.y * factor) / factor;
} else {
this.x = Math.round(this.x);
this.y = Math.round(this.y);
}
},
isZero: function() {
return this.x == 0 && this.y == 0;
}
});
Ext.define('Ext.util.Region', {
requires: [
'Ext.util.Offset'
],
isRegion: true,
statics: {
getRegion: function(el) {
return Ext.fly(el).getRegion();
},
from: function(o) {
return new this(o.top, o.right, o.bottom, o.left);
}
},
constructor: function(t, r, b, l) {
var me = this;
me.y = me.top = me[1] = t;
me.right = r;
me.bottom = b;
me.x = me.left = me[0] = l;
},
contains: function(region) {
var me = this;
return (region.x >= me.x && region.right <= me.right && region.y >= me.y && region.bottom <= me.bottom);
},
intersect: function(region) {
var me = this,
t = Math.max(me.y, region.y),
r = Math.min(me.right, region.right),
b = Math.min(me.bottom, region.bottom),
l = Math.max(me.x, region.x);
if (b > t && r > l) {
return new this.self(t, r, b, l);
} else {
return false;
}
},
union: function(region) {
var me = this,
t = Math.min(me.y, region.y),
r = Math.max(me.right, region.right),
b = Math.max(me.bottom, region.bottom),
l = Math.min(me.x, region.x);
return new this.self(t, r, b, l);
},
constrainTo: function(r) {
var me = this,
constrain = Ext.Number.constrain;
me.top = me.y = constrain(me.top, r.y, r.bottom);
me.bottom = constrain(me.bottom, r.y, r.bottom);
me.left = me.x = constrain(me.left, r.x, r.right);
me.right = constrain(me.right, r.x, r.right);
return me;
},
adjust: function(t, r, b, l) {
var me = this;
me.top = me.y += t;
me.left = me.x += l;
me.right += r;
me.bottom += b;
return me;
},
getOutOfBoundOffset: function(axis, p) {
if (!Ext.isObject(axis)) {
if (axis == 'x') {
return this.getOutOfBoundOffsetX(p);
} else {
return this.getOutOfBoundOffsetY(p);
}
} else {
p = axis;
var d = new Ext.util.Offset();
d.x = this.getOutOfBoundOffsetX(p.x);
d.y = this.getOutOfBoundOffsetY(p.y);
return d;
}
},
getOutOfBoundOffsetX: function(p) {
if (p <= this.x) {
return this.x - p;
} else if (p >= this.right) {
return this.right - p;
}
return 0;
},
getOutOfBoundOffsetY: function(p) {
if (p <= this.y) {
return this.y - p;
} else if (p >= this.bottom) {
return this.bottom - p;
}
return 0;
},
isOutOfBound: function(axis, p) {
if (!Ext.isObject(axis)) {
if (axis == 'x') {
return this.isOutOfBoundX(p);
} else {
return this.isOutOfBoundY(p);
}
} else {
p = axis;
return (this.isOutOfBoundX(p.x) || this.isOutOfBoundY(p.y));
}
},
isOutOfBoundX: function(p) {
return (p < this.x || p > this.right);
},
isOutOfBoundY: function(p) {
return (p < this.y || p > this.bottom);
},
restrict: function(axis, p, factor) {
if (Ext.isObject(axis)) {
var newP;
factor = p;
p = axis;
if (p.copy) {
newP = p.copy();
} else {
newP = {
x: p.x,
y: p.y
};
}
newP.x = this.restrictX(p.x, factor);
newP.y = this.restrictY(p.y, factor);
return newP;
} else {
if (axis == 'x') {
return this.restrictX(p, factor);
} else {
return this.restrictY(p, factor);
}
}
},
restrictX: function(p, factor) {
if (!factor) {
factor = 1;
}
if (p <= this.x) {
p -= (p - this.x) * factor;
} else if (p >= this.right) {
p -= (p - this.right) * factor;
}
return p;
},
restrictY: function(p, factor) {
if (!factor) {
factor = 1;
}
if (p <= this.y) {
p -= (p - this.y) * factor;
} else if (p >= this.bottom) {
p -= (p - this.bottom) * factor;
}
return p;
},
getSize: function() {
return {
width: this.right - this.x,
height: this.bottom - this.y
};
},
copy: function() {
return new this.self(this.y, this.right, this.bottom, this.x);
},
copyFrom: function(p) {
var me = this;
me.top = me.y = me[1] = p.y;
me.right = p.right;
me.bottom = p.bottom;
me.left = me.x = me[0] = p.x;
return this;
},
toString: function() {
return "Region[" + this.top + "," + this.right + "," + this.bottom + "," + this.left + "]";
},
translateBy: function(x, y) {
if (arguments.length == 1) {
y = x.y;
x = x.x;
}
var me = this;
me.top = me.y += y;
me.right += x;
me.bottom += y;
me.left = me.x += x;
return me;
},
round: function() {
var me = this;
me.top = me.y = Math.round(me.y);
me.right = Math.round(me.right);
me.bottom = Math.round(me.bottom);
me.left = me.x = Math.round(me.x);
return me;
},
equals: function(region) {
return (this.top === region.top && this.right === region.right && this.bottom === region.bottom && this.left === region.left);
}
});
Ext.define('Ext.util.Point', {
extend: 'Ext.util.Region',
radianToDegreeConstant: 180 / Math.PI,
origin: {
x: 0,
y: 0
},
statics: {
fromEvent: function(e) {
var changedTouches = e.changedTouches,
touch = (changedTouches && changedTouches.length > 0) ? changedTouches[0] : e;
return this.fromTouch(touch);
},
fromTouch: function(touch) {
return new this(touch.pageX, touch.pageY);
},
from: function(object) {
if (!object) {
return new this(0, 0);
}
if (!(object instanceof this)) {
return new this(object.x, object.y);
}
return object;
}
},
constructor: function(x, y) {
if (x == null) {
x = 0;
}
if (y == null) {
y = 0;
}
this.callParent([
y,
x,
y,
x
]);
},
clone: function() {
return new this.self(this.x, this.y);
},
copy: function() {
return this.clone.apply(this, arguments);
},
copyFrom: function(point) {
this.x = point.x;
this.y = point.y;
return this;
},
toString: function() {
return "Point[" + this.x + "," + this.y + "]";
},
isCloseTo: function(point, threshold) {
if (typeof threshold == 'number') {
return this.getDistanceTo(point) <= threshold;
}
var x = point.x,
y = point.y,
thresholdX = threshold.x,
thresholdY = threshold.y;
return (this.x <= x + thresholdX && this.x >= x - thresholdX && this.y <= y + thresholdY && this.y >= y - thresholdY);
},
isWithin: function() {
return this.isCloseTo.apply(this, arguments);
},
isContainedBy: function(region) {
if (!(region instanceof Ext.util.Region)) {
region = Ext.get(region.el || region).getRegion();
}
return region.contains(this);
},
roundedEquals: function(point) {
if (!point || typeof point !== 'object') {
point = this.origin;
}
return (Math.round(this.x) === Math.round(point.x) && Math.round(this.y) === Math.round(point.y));
},
getDistanceTo: function(point) {
if (!point || typeof point !== 'object') {
point = this.origin;
}
var deltaX = this.x - point.x,
deltaY = this.y - point.y;
return Math.sqrt(deltaX * deltaX + deltaY * deltaY);
},
getAngleTo: function(point) {
if (!point || typeof point !== 'object') {
point = this.origin;
}
var deltaX = this.x - point.x,
deltaY = this.y - point.y;
return Math.atan2(deltaY, deltaX) * this.radianToDegreeConstant;
}
}, function() {
this.prototype.translate = this.prototype.translateBy;
});
Ext.define('Ext.event.Event', {
alternateClassName: 'Ext.EventObjectImpl',
requires: [
'Ext.util.Point'
],
isStopped: false,
defaultPrevented: false,
isEvent: true,
statics: {
resolveTextNode: function(node) {
return (node && node.nodeType === 3) ? node.parentNode : node;
},
pointerEvents: {
pointerdown: 1,
pointermove: 1,
pointerup: 1,
pointercancel: 1,
pointerover: 1,
pointerout: 1,
pointerenter: 1,
pointerleave: 1,
MSPointerDown: 1,
MSPointerMove: 1,
MSPointerUp: 1,
MSPointerOver: 1,
MSPointerOut: 1,
MSPointerCancel: 1,
MSPointerEnter: 1,
MSPointerLeave: 1
},
mouseEvents: {
mousedown: 1,
mousemove: 1,
mouseup: 1,
mouseover: 1,
mouseout: 1,
mouseenter: 1,
mouseleave: 1
},
clickEvents: {
click: 1,
dblclick: 1
},
touchEvents: {
touchstart: 1,
touchmove: 1,
touchend: 1,
touchcancel: 1
},
focusEvents: {
focus: 1,
blur: 1,
focusin: 1,
focusout: 1,
focusenter: 1,
focusleave: 1
},
pointerTypes: {
2: 'touch',
3: 'pen',
4: 'mouse',
touch: 'touch',
pen: 'pen',
mouse: 'mouse'
}
},
constructor: function(event) {
var me = this,
self = me.self,
resolveTextNode = me.self.resolveTextNode,
changedTouches = event.changedTouches,
coordinateOwner = changedTouches ? changedTouches[0] : event,
type = event.type,
pointerType, relatedTarget;
me.pageX = coordinateOwner.pageX;
me.pageY = coordinateOwner.pageY;
me.target = me.delegatedTarget = resolveTextNode(event.target);
relatedTarget = event.relatedTarget;
if (relatedTarget) {
me.relatedTarget = resolveTextNode(relatedTarget);
}
me.browserEvent = me.event = event;
me.type = type;
me.button = event.button || 0;
me.shiftKey = event.shiftKey;
me.ctrlKey = event.ctrlKey || event.metaKey || false;
me.altKey = event.altKey;
me.charCode = event.charCode;
me.keyCode = event.keyCode;
me.buttons = event.buttons;
if (me.button === 0 && me.buttons === 0) {
me.buttons = 1;
}
if (self.forwardTab !== undefined && self.focusEvents[type]) {
me.forwardTab = self.forwardTab;
}
if (self.mouseEvents[type] || self.clickEvents[type]) {
pointerType = 'mouse';
} else if (self.pointerEvents[type]) {
pointerType = self.pointerTypes[event.pointerType];
} else if (self.touchEvents[type]) {
pointerType = 'touch';
}
if (pointerType) {
me.pointerType = pointerType;
}
me.timeStamp = me.time = +(event.timeStamp || new Date());
},
chain: function(props) {
var e = Ext.Object.chain(this);
e.parentEvent = this;
return Ext.apply(e, props);
},
correctWheelDelta: function(delta) {
var scale = this.WHEEL_SCALE,
ret = Math.round(delta / scale);
if (!ret && delta) {
ret = (delta < 0) ? -1 : 1;
}
return ret;
},
getCharCode: function() {
return this.charCode || this.keyCode;
},
getKey: function() {
return this.keyCode || this.charCode;
},
getPoint: function() {
var xy = this.getXY();
return new Ext.util.Point(xy[0], xy[1]);
},
getRelatedTarget: function(selector, maxDepth, returnEl) {
var relatedTarget = this.relatedTarget,
target = null;
if (relatedTarget) {
if (selector) {
target = Ext.fly(relatedTarget).findParent(selector, maxDepth, returnEl);
} else {
target = returnEl ? Ext.get(relatedTarget) : relatedTarget;
}
}
return target;
},
getTarget: function(selector, maxDepth, returnEl) {
return selector ? Ext.fly(this.target).findParent(selector, maxDepth, returnEl) : (returnEl ? Ext.get(this.target) : this.target);
},
getTime: function() {
return this.time;
},
getWheelDelta: function() {
var deltas = this.getWheelDeltas();
return deltas.y;
},
getWheelDeltas: function() {
var me = this,
event = me.browserEvent,
dx = 0,
dy = 0;
if (Ext.isDefined(event.wheelDeltaX)) {
dx = event.wheelDeltaX;
dy = event.wheelDeltaY;
} else if (event.wheelDelta) {
dy = event.wheelDelta;
} else if (event.detail) {
dy = -event.detail;
if (dy > 100) {
dy = 3;
} else if (dy < -100) {
dy = -3;
}
if (Ext.isDefined(event.axis) && event.axis === event.HORIZONTAL_AXIS) {
dx = dy;
dy = 0;
}
}
return {
x: me.correctWheelDelta(dx),
y: me.correctWheelDelta(dy)
};
},
getX: function() {
return this.getXY()[0];
},
getXY: function() {
var me = this,
xy = me.xy;
if (!xy) {
xy = me.xy = [
me.pageX,
me.pageY
];
var x = xy[0],
browserEvent, doc, docEl, body;
if (!x && x !== 0) {
browserEvent = me.browserEvent;
doc = document;
docEl = doc.documentElement;
body = doc.body;
xy[0] = browserEvent.clientX + (docEl && docEl.scrollLeft || body && body.scrollLeft || 0) - (docEl && docEl.clientLeft || body && body.clientLeft || 0);
xy[1] = browserEvent.clientY + (docEl && docEl.scrollTop || body && body.scrollTop || 0) - (docEl && docEl.clientTop || body && body.clientTop || 0);
}
}
return xy;
},
getY: function() {
return this.getXY()[1];
},
hasModifier: function() {
var me = this;
return !!(me.ctrlKey || me.altKey || me.shiftKey || me.metaKey);
},
isNavKeyPress: function(scrollableOnly) {
var me = this,
k = me.keyCode;
return (k >= 33 && k <= 40) ||
(!scrollableOnly && (k === me.RETURN || k === me.TAB || k === me.ESC));
},
isSpecialKey: function() {
var k = this.keyCode;
return (this.type === 'keypress' && this.ctrlKey) || this.isNavKeyPress() || (k === this.BACKSPACE) ||
(k >= 16 && k <= 20) ||
(k >= 44 && k <= 46);
},
makeUnpreventable: function() {
this.browserEvent.preventDefault = Ext.emptyFn;
},
preventDefault: function() {
var me = this,
parentEvent = me.parentEvent;
me.defaultPrevented = true;
if (parentEvent) {
parentEvent.defaultPrevented = true;
}
me.browserEvent.preventDefault();
return me;
},
setCurrentTarget: function(target) {
this.currentTarget = this.delegatedTarget = target;
},
stopEvent: function() {
return this.preventDefault().stopPropagation();
},
stopPropagation: function() {
var me = this,
browserEvent = me.browserEvent,
parentEvent = me.parentEvent;
me.isStopped = true;
if (parentEvent) {
parentEvent.isStopped = true;
}
if (!browserEvent.stopPropagation) {
browserEvent.cancelBubble = true;
return me;
}
browserEvent.stopPropagation();
return me;
},
within: function(el, related, allowEl) {
var t;
if (el) {
t = related ? this.getRelatedTarget() : this.getTarget();
}
return t ? Ext.fly(el).contains(t) || !!(allowEl && t === Ext.getDom(el)) : false;
},
deprecated: {
'4.0': {
methods: {
getPageX: 'getX',
getPageY: 'getY'
}
}
}
}, function(Event) {
var prototype = Event.prototype,
constants = {
BACKSPACE: 8,
TAB: 9,
NUM_CENTER: 12,
ENTER: 13,
RETURN: 13,
SHIFT: 16,
CTRL: 17,
ALT: 18,
PAUSE: 19,
CAPS_LOCK: 20,
ESC: 27,
SPACE: 32,
PAGE_UP: 33,
PAGE_DOWN: 34,
END: 35,
HOME: 36,
LEFT: 37,
UP: 38,
RIGHT: 39,
DOWN: 40,
PRINT_SCREEN: 44,
INSERT: 45,
DELETE: 46,
ZERO: 48,
ONE: 49,
TWO: 50,
THREE: 51,
FOUR: 52,
FIVE: 53,
SIX: 54,
SEVEN: 55,
EIGHT: 56,
NINE: 57,
A: 65,
B: 66,
C: 67,
D: 68,
E: 69,
F: 70,
G: 71,
H: 72,
I: 73,
J: 74,
K: 75,
L: 76,
M: 77,
N: 78,
O: 79,
P: 80,
Q: 81,
R: 82,
S: 83,
T: 84,
U: 85,
V: 86,
W: 87,
X: 88,
Y: 89,
Z: 90,
CONTEXT_MENU: 93,
NUM_ZERO: 96,
NUM_ONE: 97,
NUM_TWO: 98,
NUM_THREE: 99,
NUM_FOUR: 100,
NUM_FIVE: 101,
NUM_SIX: 102,
NUM_SEVEN: 103,
NUM_EIGHT: 104,
NUM_NINE: 105,
NUM_MULTIPLY: 106,
NUM_PLUS: 107,
NUM_MINUS: 109,
NUM_PERIOD: 110,
NUM_DIVISION: 111,
F1: 112,
F2: 113,
F3: 114,
F4: 115,
F5: 116,
F6: 117,
F7: 118,
F8: 119,
F9: 120,
F10: 121,
F11: 122,
F12: 123,
WHEEL_SCALE: (function() {
var scale;
if (Ext.isGecko) {
scale = 3;
} else if (Ext.isMac) {
if (Ext.isSafari && Ext.webKitVersion >= 532) {
scale = 120;
} else {
scale = 12;
}
scale *= 3;
} else {
scale = 120;
}
return scale;
}())
};
Ext.apply(Event, constants);
Ext.apply(prototype, constants);
prototype.getTrueXY = prototype.getXY;
});
Ext.define('Ext.overrides.event.Event', {
override: 'Ext.event.Event',
mousedownEvents: {
mousedown: 1,
pointerdown: 1,
touchstart: 1
},
injectEvent: (function() {
var API,
dispatchers = {},
crazyIEButtons;
if (!Ext.isIE9m && document.createEvent) {
API = {
createHtmlEvent: function(doc, type, bubbles, cancelable) {
var event = doc.createEvent('HTMLEvents');
event.initEvent(type, bubbles, cancelable);
return event;
},
createMouseEvent: function(doc, type, bubbles, cancelable, detail, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget) {
var event = doc.createEvent('MouseEvents'),
view = doc.defaultView || window;
if (event.initMouseEvent) {
event.initMouseEvent(type, bubbles, cancelable, view, detail, clientX, clientY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget);
} else {
event = doc.createEvent('UIEvents');
event.initEvent(type, bubbles, cancelable);
event.view = view;
event.detail = detail;
event.screenX = clientX;
event.screenY = clientY;
event.clientX = clientX;
event.clientY = clientY;
event.ctrlKey = ctrlKey;
event.altKey = altKey;
event.metaKey = metaKey;
event.shiftKey = shiftKey;
event.button = button;
event.relatedTarget = relatedTarget;
}
return event;
},
createUIEvent: function(doc, type, bubbles, cancelable, detail) {
var event = doc.createEvent('UIEvents'),
view = doc.defaultView || window;
event.initUIEvent(type, bubbles, cancelable, view, detail);
return event;
},
fireEvent: function(target, type, event) {
target.dispatchEvent(event);
}
};
} else if (document.createEventObject) {
crazyIEButtons = {
0: 1,
1: 4,
2: 2
};
API = {
createHtmlEvent: function(doc, type, bubbles, cancelable) {
var event = doc.createEventObject();
event.bubbles = bubbles;
event.cancelable = cancelable;
return event;
},
createMouseEvent: function(doc, type, bubbles, cancelable, detail, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget) {
var event = doc.createEventObject();
event.bubbles = bubbles;
event.cancelable = cancelable;
event.detail = detail;
event.screenX = clientX;
event.screenY = clientY;
event.clientX = clientX;
event.clientY = clientY;
event.ctrlKey = ctrlKey;
event.altKey = altKey;
event.shiftKey = shiftKey;
event.metaKey = metaKey;
event.button = crazyIEButtons[button] || button;
event.relatedTarget = relatedTarget;
return event;
},
createUIEvent: function(doc, type, bubbles, cancelable, detail) {
var event = doc.createEventObject();
event.bubbles = bubbles;
event.cancelable = cancelable;
return event;
},
fireEvent: function(target, type, event) {
target.fireEvent('on' + type, event);
}
};
}
Ext.Object.each({
load: [
false,
false
],
unload: [
false,
false
],
select: [
true,
false
],
change: [
true,
false
],
submit: [
true,
true
],
reset: [
true,
false
],
resize: [
true,
false
],
scroll: [
true,
false
]
}, function(name, value) {
var bubbles = value[0],
cancelable = value[1];
dispatchers[name] = function(targetEl, srcEvent) {
var e = API.createHtmlEvent(name, bubbles, cancelable);
API.fireEvent(targetEl, name, e);
};
});
function createMouseEventDispatcher(type, detail) {
var cancelable = (type !== 'mousemove');
return function(targetEl, srcEvent) {
var xy = srcEvent.getXY(),
e = API.createMouseEvent(targetEl.ownerDocument, type, true, cancelable, detail, xy[0], xy[1], srcEvent.ctrlKey, srcEvent.altKey, srcEvent.shiftKey, srcEvent.metaKey, srcEvent.button, srcEvent.relatedTarget);
API.fireEvent(targetEl, type, e);
};
}
Ext.each([
'click',
'dblclick',
'mousedown',
'mouseup',
'mouseover',
'mousemove',
'mouseout'
], function(eventName) {
dispatchers[eventName] = createMouseEventDispatcher(eventName, 1);
});
Ext.Object.each({
focusin: [
true,
false
],
focusout: [
true,
false
],
activate: [
true,
true
],
focus: [
false,
false
],
blur: [
false,
false
]
}, function(name, value) {
var bubbles = value[0],
cancelable = value[1];
dispatchers[name] = function(targetEl, srcEvent) {
var e = API.createUIEvent(targetEl.ownerDocument, name, bubbles, cancelable, 1);
API.fireEvent(targetEl, name, e);
};
});
if (!API) {
dispatchers = {};
API = {};
}
function cannotInject(target, srcEvent) {}
return function(target) {
var me = this,
dispatcher = dispatchers[me.type] || cannotInject,
t = target ? (target.dom || target) : me.getTarget();
dispatcher(t, me);
};
}()),
preventDefault: function() {
var me = this,
event = me.browserEvent,
parentEvent = me.parentEvent,
unselectable, target;
if (typeof event.type !== 'unknown') {
me.defaultPrevented = true;
if (parentEvent) {
parentEvent.defaultPrevented = true;
}
if (event.preventDefault) {
event.preventDefault();
} else {
if (event.type === 'mousedown') {
target = event.target;
unselectable = target.getAttribute('unselectable');
if (unselectable !== 'on') {
target.setAttribute('unselectable', 'on');
Ext.defer(function() {
target.setAttribute('unselectable', unselectable);
}, 1);
}
}
event.returnValue = false;
if (event.ctrlKey || event.keyCode > 111 && event.keyCode < 124) {
event.keyCode = -1;
}
}
}
return me;
},
stopPropagation: function() {
var me = this,
event = me.browserEvent;
if (typeof event.type !== 'unknown') {
if (me.mousedownEvents[me.type]) {
Ext.GlobalEvents.fireMouseDown(me);
}
me.callParent();
}
return me;
},
deprecated: {
'5.0': {
methods: {
clone: function() {
return new this.self(this.browserEvent, this);
}
}
}
}
}, function() {
var Event = this,
btnMap,
onKeyDown = function(e) {
if (e.keyCode === 9) {
Event.forwardTab = !e.shiftKey;
}
},
onKeyUp = function(e) {
if (e.keyCode === 9) {
delete Event.forwardTab;
}
};
if (Ext.isIE9m) {
btnMap = {
0: 0,
1: 0,
4: 1,
2: 2
};
Event.override({
statics: {
enableIEAsync: function(browserEvent) {
var name,
fakeEvent = {};
for (name in browserEvent) {
fakeEvent[name] = browserEvent[name];
}
return fakeEvent;
}
},
constructor: function(event, info, touchesMap, identifiers) {
var me = this;
me.callParent([
event,
info,
touchesMap,
identifiers
]);
me.button = btnMap[event.button];
if (event.type === 'contextmenu') {
me.button = 2;
}
me.toElement = event.toElement;
me.fromElement = event.fromElement;
},
mouseLeaveRe: /(mouseout|mouseleave)/,
mouseEnterRe: /(mouseover|mouseenter)/,
enableIEAsync: function(browserEvent) {
this.browserEvent = this.self.enableIEAsync(browserEvent);
},
getRelatedTarget: function(selector, maxDepth, returnEl) {
var me = this,
type, target;
if (!me.relatedTarget) {
type = me.type;
if (me.mouseLeaveRe.test(type)) {
target = me.toElement;
} else if (me.mouseEnterRe.test(type)) {
target = me.fromElement;
}
if (target) {
me.relatedTarget = me.self.resolveTextNode(target);
}
}
return me.callParent([
selector,
maxDepth,
returnEl
]);
}
});
document.attachEvent('onkeydown', onKeyDown);
document.attachEvent('onkeyup', onKeyUp);
window.attachEvent('onunload', function() {
document.detachEvent('onkeydown', onKeyDown);
document.detachEvent('onkeyup', onKeyUp);
});
} else if (document.addEventListener) {
document.addEventListener('keydown', onKeyDown, true);
document.addEventListener('keyup', onKeyUp, true);
}
});
Ext.define('Ext.event.publisher.Dom', {
extend: 'Ext.event.publisher.Publisher',
requires: [
'Ext.event.Event'
],
type: 'dom',
handledDomEvents: [],
reEnterCount: 0,
captureEvents: {
resize: 1,
focus: 1,
blur: 1,
paste: 1,
input: 1,
change: 1,
animationstart: 1,
animationend: 1,
scroll: 1
},
directEvents: {
mouseenter: 1,
mouseleave: 1,
pointerenter: 1,
pointerleave: 1,
MSPointerEnter: 1,
MSPointerLeave: 1,
load: 1,
unload: 1,
beforeunload: 1,
error: 1,
DOMContentLoaded: 1,
DOMFrameContentLoaded: 1,
hashchange: 1
},
blockedPointerEvents: {
pointerover: 1,
pointerout: 1,
pointerenter: 1,
pointerleave: 1,
MSPointerOver: 1,
MSPointerOut: 1,
MSPointerEnter: 1,
MSPointerLeave: 1
},
blockedCompatibilityMouseEvents: {
mouseenter: 1,
mouseleave: 1
},
constructor: function() {
var me = this;
me.bubbleSubscribers = {};
me.captureSubscribers = {};
me.directSubscribers = {};
me.directCaptureSubscribers = {};
me.delegatedListeners = {};
me.initHandlers();
Ext.onInternalReady(me.onReady, me);
me.callParent();
},
registerEvents: function() {
var me = this,
publishersByEvent = Ext.event.publisher.Publisher.publishersByEvent,
domEvents = me.handledDomEvents,
ln = domEvents.length,
i = 0,
eventName;
for (; i < ln; i++) {
eventName = domEvents[i];
me.handles[eventName] = 1;
publishersByEvent[eventName] = me;
}
this.callParent();
},
onReady: function() {
var me = this,
domEvents = me.handledDomEvents,
ln, i;
if (domEvents) {
for (i = 0 , ln = domEvents.length; i < ln; i++) {
me.addDelegatedListener(domEvents[i]);
}
}
Ext.getWin().on('unload', me.destroy, me);
},
initHandlers: function() {
var me = this;
me.onDelegatedEvent = Ext.bind(me.onDelegatedEvent, me);
me.onDirectEvent = Ext.bind(me.onDirectEvent, me);
me.onDirectCaptureEvent = Ext.bind(me.onDirectCaptureEvent, me);
},
addDelegatedListener: function(eventName) {
this.delegatedListeners[eventName] = 1;
this.target.addEventListener(eventName, this.onDelegatedEvent, !!this.captureEvents[eventName]);
},
removeDelegatedListener: function(eventName) {
delete this.delegatedListeners[eventName];
this.target.removeEventListener(eventName, this.onDelegatedEvent, !!this.captureEvents[eventName]);
},
addDirectListener: function(eventName, element, capture) {
element.dom.addEventListener(eventName, capture ? this.onDirectCaptureEvent : this.onDirectEvent, capture);
},
removeDirectListener: function(eventName, element, capture) {
element.dom.removeEventListener(eventName, capture ? this.onDirectCaptureEvent : this.onDirectEvent, capture);
},
subscribe: function(element, eventName, delegated, capture) {
var me = this,
subscribers, id;
if (delegated && !me.directEvents[eventName]) {
subscribers = capture ? me.captureSubscribers : me.bubbleSubscribers;
if (!me.handles[eventName] && !me.delegatedListeners[eventName]) {
me.addDelegatedListener(eventName);
}
if (subscribers[eventName]) {
++subscribers[eventName];
} else {
subscribers[eventName] = 1;
}
} else {
subscribers = capture ? me.directCaptureSubscribers : me.directSubscribers;
id = element.id;
subscribers = subscribers[eventName] || (subscribers[eventName] = {});
if (subscribers[id]) {
++subscribers[id];
} else {
subscribers[id] = 1;
me.addDirectListener(eventName, element, capture);
}
}
},
unsubscribe: function(element, eventName, delegated, capture) {
var me = this,
captureSubscribers, bubbleSubscribers, subscribers, id;
if (delegated && !me.directEvents[eventName]) {
captureSubscribers = me.captureSubscribers;
bubbleSubscribers = me.bubbleSubscribers;
subscribers = capture ? captureSubscribers : bubbleSubscribers;
if (subscribers[eventName]) {
--subscribers[eventName];
}
if (!me.handles[eventName] && !bubbleSubscribers[eventName] && !captureSubscribers[eventName]) {
this.removeDelegatedListener(eventName);
}
} else {
subscribers = capture ? me.directCaptureSubscribers : me.directSubscribers;
id = element.id;
subscribers = subscribers[eventName];
if (subscribers[id]) {
--subscribers[id];
}
if (!subscribers[id]) {
delete subscribers[id];
me.removeDirectListener(eventName, element, capture);
}
}
},
getPropagatingTargets: function(target) {
var currentNode = target,
targets = [],
parentNode;
while (currentNode) {
targets.push(currentNode);
parentNode = currentNode.parentNode;
if (!parentNode) {
parentNode = currentNode.defaultView;
}
currentNode = parentNode;
}
return targets;
},
publish: function(eventName, target, e) {
var me = this,
targets, el, i, ln;
if (Ext.isArray(target)) {
targets = target;
} else if (me.captureEvents[eventName]) {
el = Ext.cache[target.id];
targets = el ? [
el
] : [];
} else {
targets = me.getPropagatingTargets(target);
}
ln = targets.length;
if (me.captureSubscribers[eventName]) {
for (i = ln; i--; ) {
el = Ext.cache[targets[i].id];
if (el) {
me.fire(el, eventName, e, false, true);
if (e.isStopped) {
break;
}
}
}
}
if (!e.isStopped && me.bubbleSubscribers[eventName]) {
for (i = 0; i < ln; i++) {
el = Ext.cache[targets[i].id];
if (el) {
me.fire(el, eventName, e, false, false);
if (e.isStopped) {
break;
}
}
}
}
},
fire: function(element, eventName, e, direct, capture) {
var event;
if (element.hasListeners[eventName]) {
event = element.events[eventName];
if (event) {
if (capture && direct) {
event = event.directCaptures;
} else if (capture) {
event = event.captures;
} else if (direct) {
event = event.directs;
}
if (event) {
e.setCurrentTarget(element.dom);
event.fire(e, e.target);
}
}
}
},
onDelegatedEvent: function(e) {
if (Ext.elevateFunction) {
Ext.elevateFunction(this.doDelegatedEvent, this, [
e
]);
} else {
this.doDelegatedEvent(e);
}
},
doDelegatedEvent: function(e, invokeAfter) {
var me = this,
timeStamp = e.timeStamp;
e = new Ext.event.Event(e);
if (me.isEventBlocked(e)) {
return false;
}
me.beforeEvent(e);
Ext.frameStartTime = timeStamp;
me.reEnterCount++;
me.publish(e.type, e.target, e);
me.reEnterCount--;
if (invokeAfter !== false) {
me.afterEvent(e);
}
return e;
},
onDirectEvent: function(e) {
if (Ext.elevateFunction) {
Ext.elevateFunction(this.doDirectEvent, this, [
e,
false
]);
} else {
this.doDirectEvent(e, false);
}
},
onDirectCaptureEvent: function(e) {
if (Ext.elevateFunction) {
Ext.elevateFunction(this.doDirectEvent, this, [
e,
true
]);
} else {
this.doDirectEvent(e, true);
}
},
doDirectEvent: function(e, capture) {
var me = this,
currentTarget = e.currentTarget,
timeStamp = e.timeStamp;
e = new Ext.event.Event(e);
if (me.isEventBlocked(e)) {
return;
}
me.beforeEvent(e);
Ext.frameStartTime = timeStamp;
me.reEnterCount++;
me.fire(Ext.cache[currentTarget.id], e.type, e, true, capture);
me.reEnterCount--;
me.afterEvent(e);
},
beforeEvent: function(e) {
var browserEvent = e.browserEvent,
self = Ext.event.publisher.Dom,
touches, touch;
if (browserEvent.type === 'touchstart') {
touches = browserEvent.touches;
if (touches.length === 1) {
touch = touches[0];
self.lastTouchStartX = touch.pageX;
self.lastTouchStartY = touch.pageY;
}
}
},
afterEvent: function(e) {
var browserEvent = e.browserEvent,
type = browserEvent.type,
self = Ext.event.publisher.Dom,
GlobalEvents = Ext.GlobalEvents;
if (e.self.pointerEvents[type] && e.pointerType !== 'mouse') {
self.lastScreenPointerEventTime = Ext.now();
}
if (type === 'touchend') {
self.lastTouchEndTime = Ext.now();
}
if (!this.reEnterCount && GlobalEvents.hasListeners.idle && !GlobalEvents.idleEventMask[type]) {
GlobalEvents.fireEvent('idle');
}
},
isEventBlocked: function(e) {
var me = this,
type = e.type,
self = Ext.event.publisher.Dom,
now = Ext.now();
return (me.blockedPointerEvents[type] && e.pointerType !== 'mouse') ||
(me.blockedCompatibilityMouseEvents[type] && (now - self.lastScreenPointerEventTime < 1000)) || (Ext.supports.TouchEvents && e.self.mouseEvents[e.type] &&
Math.abs(e.pageX - self.lastTouchStartX) < 15 && Math.abs(e.pageY - self.lastTouchStartY) < 15 &&
(Ext.now() - self.lastTouchEndTime) < 1000);
},
destroy: function() {
var eventName;
for (eventName in this.delegatedListeners) {
this.removeDelegatedListener(eventName);
}
},
reset: function() {
var self = Ext.event.publisher.Dom;
self.lastScreenPointerEventTime = self.lastTouchEndTime = self.lastTouchStartX = self.lastTouchStartY = undefined;
}
}, function(Dom) {
var doc = document,
defaultView = doc.defaultView,
prototype = Dom.prototype;
if ((Ext.os.is.iOS && Ext.os.version.getMajor() < 5) || Ext.browser.is.AndroidStock || !(defaultView && defaultView.addEventListener)) {
prototype.target = doc;
} else {
prototype.target = defaultView;
}
Dom.instance = new Dom();
});
Ext.define('Ext.overrides.event.publisher.Dom', {
override: 'Ext.event.publisher.Dom'
}, function(DomPublisher) {
if (Ext.isIE9m) {
var docBody = document.body,
prototype = DomPublisher.prototype,
onDirectEvent, onDirectCaptureEvent;
prototype.target = document;
prototype.directBoundListeners = {};
onDirectEvent = function(e, publisher, capture) {
e.target = e.srcElement || window;
e.currentTarget = this;
if (capture) {
publisher.onDirectCaptureEvent(e);
} else {
publisher.onDirectEvent(e);
}
};
onDirectCaptureEvent = function(e, publisher) {
e.target = e.srcElement || window;
e.currentTarget = this;
publisher.onDirectCaptureEvent(e);
};
DomPublisher.override({
addDelegatedListener: function(eventName) {
this.delegatedListeners[eventName] = 1;
this.target.attachEvent('on' + eventName, this.onDelegatedEvent);
},
removeDelegatedListener: function(eventName) {
delete this.delegatedListeners[eventName];
this.target.detachEvent('on' + eventName, this.onDelegatedEvent);
},
addDirectListener: function(eventName, element, capture) {
var me = this,
dom = element.dom,
boundFn = Ext.Function.bind(onDirectEvent, dom, [
me,
capture
], true),
directBoundListeners = me.directBoundListeners,
handlers = directBoundListeners[eventName] || (directBoundListeners[eventName] = {});
handlers[dom.id] = boundFn;
if (dom.attachEvent) {
dom.attachEvent('on' + eventName, boundFn);
} else {
me.callParent(arguments);
}
},
removeDirectListener: function(eventName, element) {
var dom = element.dom;
if (dom.detachEvent) {
dom.detachEvent('on' + eventName, this.directBoundListeners[eventName][dom.id]);
} else {
this.callParent(arguments);
}
},
doDelegatedEvent: function(e, invokeAfter) {
e.target = e.srcElement || window;
if (e.type === 'focusin') {
e.relatedTarget = e.fromElement === docBody ? null : e.fromElement;
} else if (e.type === 'focusout') {
e.relatedTarget = e.toElement === docBody ? null : e.toElement;
}
return this.callParent([
e,
invokeAfter
]);
}
});
Ext.apply(prototype.directEvents, prototype.captureEvents);
prototype.captureEvents = {};
}
});
Ext.define('Ext.event.publisher.Gesture', {
extend: 'Ext.event.publisher.Dom',
requires: [
'Ext.util.Point',
'Ext.AnimationQueue'
],
uses: 'Ext.event.gesture.*',
type: 'gesture',
config: {
async: true
},
isCancelEvent: {
touchcancel: 1,
pointercancel: 1,
MSPointerCancel: 1
},
handledEvents: [],
handledDomEvents: [],
constructor: function(config) {
var me = this,
handledDomEvents = me.handledDomEvents,
supports = Ext.supports,
supportsTouchEvents = supports.TouchEvents,
Fn = Ext.Function,
onTouchStart = me.onTouchStart,
onTouchMove = me.onTouchMove,
onTouchEnd = me.onTouchEnd,
asyncTouchStart = Fn.createAnimationFrame(me.onTouchStart, me, null, 1),
asyncTouchMove = Fn.createAnimationFrame(me.onTouchMove, me),
asyncTouchEnd = Fn.createAnimationFrame(me.onTouchEnd, me, null, 1);
me._handlers = {
touchstart: onTouchStart,
touchmove: onTouchMove,
touchend: onTouchEnd,
touchcancel: onTouchEnd,
pointerdown: onTouchStart,
pointermove: onTouchMove,
pointerup: onTouchEnd,
pointercancel: onTouchEnd,
MSPointerDown: onTouchStart,
MSPointerMove: onTouchMove,
MSPointerUp: onTouchEnd,
MSPointerCancel: onTouchEnd,
mousedown: onTouchStart,
mousemove: onTouchMove,
mouseup: onTouchEnd
};
me._asyncHandlers = {
touchstart: asyncTouchStart,
touchmove: asyncTouchMove,
touchend: asyncTouchEnd,
touchcancel: asyncTouchEnd,
pointerdown: asyncTouchStart,
pointermove: asyncTouchMove,
pointerup: asyncTouchEnd,
pointercancel: asyncTouchEnd,
MSPointerDown: asyncTouchStart,
MSPointerMove: asyncTouchMove,
MSPointerUp: asyncTouchEnd,
MSPointerCancel: asyncTouchEnd,
mousedown: asyncTouchStart,
mousemove: asyncTouchMove,
mouseup: asyncTouchEnd
};
me.activeTouchesMap = {};
me.activeTouches = [];
me.changedTouches = [];
me.recognizers = [];
if (supportsTouchEvents) {
me.onTargetTouchMove = me.onTargetTouchMove.bind(me);
me.onTargetTouchEnd = me.onTargetTouchEnd.bind(me);
}
if (supports.PointerEvents) {
handledDomEvents.push('pointerdown', 'pointermove', 'pointerup', 'pointercancel');
me.mousePointerType = 'mouse';
} else if (supports.MSPointerEvents) {
handledDomEvents.push('MSPointerDown', 'MSPointerMove', 'MSPointerUp', 'MSPointerCancel');
me.mousePointerType = 4;
} else if (supportsTouchEvents) {
handledDomEvents.push('touchstart', 'touchmove', 'touchend', 'touchcancel');
}
if (!handledDomEvents.length || (supportsTouchEvents && Ext.isWebKit && Ext.os.is.Desktop)) {
handledDomEvents.push('mousedown', 'mousemove', 'mouseup');
}
me.initConfig(config);
return me.callParent();
},
onReady: function() {
this.callParent();
Ext.Array.sort(this.recognizers, function(recognizerA, recognizerB) {
var a = recognizerA.priority,
b = recognizerB.priority;
return (a > b) ? 1 : (a < b) ? -1 : 0;
});
},
registerRecognizer: function(recognizer) {
var me = this,
handledEvents = recognizer.handledEvents,
ln = handledEvents.length,
i;
recognizer.setOnRecognized(me.onRecognized);
recognizer.setCallbackScope(me);
for (i = 0; i < ln; i++) {
me.handledEvents.push(handledEvents[i]);
}
me.registerEvents(handledEvents);
me.recognizers.push(recognizer);
},
onRecognized: function(eventName, e, info) {
var me = this,
changedTouches = e.changedTouches,
ln = changedTouches.length,
targetGroups, targets, i, touch;
info = info || {};
info.type = eventName;
info.target = changedTouches[0].target;
info.isStopped = false;
e = e.chain(info);
if (ln > 1) {
targetGroups = [];
for (i = 0; i < ln; i++) {
touch = changedTouches[i];
targetGroups.push(touch.targets);
}
targets = me.getCommonTargets(targetGroups);
} else {
targets = changedTouches[0].targets;
}
me.publish(eventName, targets, e);
},
getCommonTargets: function(targetGroups) {
var firstTargetGroup = targetGroups[0],
ln = targetGroups.length;
if (ln === 1) {
return firstTargetGroup;
}
var commonTargets = [],
i = 1,
target, targets, j;
while (true) {
target = firstTargetGroup[firstTargetGroup.length - i];
if (!target) {
return commonTargets;
}
for (j = 1; j < ln; j++) {
targets = targetGroups[j];
if (targets[targets.length - i] !== target) {
return commonTargets;
}
}
commonTargets.unshift(target);
i++;
}
return commonTargets;
},
invokeRecognizers: function(methodName, e) {
var recognizers = this.recognizers,
ln = recognizers.length,
i, recognizer;
if (methodName === 'onStart') {
for (i = 0; i < ln; i++) {
recognizers[i].isActive = true;
}
}
for (i = 0; i < ln; i++) {
recognizer = recognizers[i];
if (recognizer.isActive && recognizer[methodName].call(recognizer, e) === false) {
recognizer.isActive = false;
}
}
},
updateTouches: function(e, isEnd) {
var me = this,
browserEvent = e.browserEvent,
touchSources = browserEvent.changedTouches || [
browserEvent
],
activeTouches = me.activeTouches,
activeTouchesMap = me.activeTouchesMap,
changedTouches = [],
touchSource, identifier, touch, target, i, ln, x, y;
for (i = 0 , ln = touchSources.length; i < ln; i++) {
touchSource = touchSources[i];
if ('identifier' in touchSource) {
identifier = touchSource.identifier;
} else if ('pointerId' in touchSource) {
identifier = touchSource.pointerId;
} else {
identifier = 1;
}
touch = activeTouchesMap[identifier];
if (!touch) {
target = Ext.event.Event.resolveTextNode(touchSource.target);
touch = activeTouchesMap[identifier] = {
identifier: identifier,
target: target,
targets: me.getPropagatingTargets(target)
};
activeTouches.push(touch);
}
if (isEnd) {
delete activeTouchesMap[identifier];
Ext.Array.remove(activeTouches, touch);
}
x = touchSource.pageX;
y = touchSource.pageY;
touch.pageX = x;
touch.pageY = y;
touch.point = new Ext.util.Point(x, y);
changedTouches.push(touch);
}
e.touches = Ext.Array.clone(activeTouches);
e.changedTouches = changedTouches;
},
doDelegatedEvent: function(e) {
var me = this;
e = me.callParent([
e,
false
]);
if (e) {
if (!e.button || e.button < 1) {
me.handlers[e.type].call(me, e);
}
me.afterEvent(e);
}
},
onTouchStart: function(e) {
var me = this,
target = e.target;
if (e.browserEvent.type === 'touchstart') {
target.addEventListener('touchmove', me.onTargetTouchMove);
target.addEventListener('touchend', me.onTargetTouchEnd);
target.addEventListener('touchcancel', me.onTargetTouchEnd);
}
me.updateTouches(e);
if (!me.isStarted) {
me.isStarted = true;
me.invokeRecognizers('onStart', e);
if (Ext.enableGarbageCollector) {
Ext.dom.GarbageCollector.pause();
}
}
me.invokeRecognizers('onTouchStart', e);
},
onTouchMove: function(e) {
var me = this,
mousePointerType = me.mousePointerType;
if (me.isStarted) {
if (mousePointerType && e.browserEvent.pointerType === mousePointerType && e.buttons === 0) {
e.type = Ext.dom.Element.prototype.eventMap.touchend;
e.button = 0;
me.onTouchEnd(e);
return;
}
me.updateTouches(e);
if (e.changedTouches.length > 0) {
me.invokeRecognizers('onTouchMove', e);
}
}
},
onTouchEnd: function(e) {
var me = this;
if (!me.isStarted) {
return;
}
me.updateTouches(e, true);
me.invokeRecognizers(me.isCancelEvent[e.type] ? 'onTouchCancel' : 'onTouchEnd', e);
if (!me.activeTouches.length) {
me.isStarted = false;
me.invokeRecognizers('onEnd', e);
if (Ext.enableGarbageCollector) {
Ext.dom.GarbageCollector.resume();
}
}
},
onTargetTouchMove: function(e) {
if (Ext.elevateFunction) {
Ext.elevateFunction(this.doTargetTouchMove, this, [
e
]);
} else {
this.doTargetTouchMove(e);
}
},
doTargetTouchMove: function(e) {
if (!Ext.getBody().contains(e.target)) {
this.onTouchMove(new Ext.event.Event(e));
}
},
onTargetTouchEnd: function(e) {
if (Ext.elevateFunction) {
Ext.elevateFunction(this.doTargetTouchEnd, this, [
e
]);
} else {
this.doTargetTouchEnd(e);
}
},
doTargetTouchEnd: function(e) {
var me = this,
target = e.target;
target.removeEventListener('touchmove', me.onTargetTouchMove);
target.removeEventListener('touchend', me.onTargetTouchEnd);
target.removeEventListener('touchcancel', me.onTargetTouchEnd);
if (!Ext.getBody().contains(target)) {
me.onTouchEnd(new Ext.event.Event(e));
}
},
updateAsync: function(async) {
this.handlers = async ? this._asyncHandlers : this._handlers;
},
reset: function() {
var me = this,
recognizers = me.recognizers,
ln = recognizers.length,
i, recognizer;
me.activeTouchesMap = {};
me.activeTouches = [];
me.changedTouches = [];
me.isStarted = false;
for (i = 0; i < ln; i++) {
recognizer = recognizers[i];
recognizer.reset();
recognizer.isActive = false;
}
this.callParent();
}
}, function(Gesture) {
Gesture.instance = new Gesture();
});
Ext.define('Ext.overrides.event.publisher.Gesture', {
override: 'Ext.event.publisher.Gesture'
}, function() {
if (Ext.isIE9m) {
this.override({
updateTouches: function(e, isEnd) {
var browserEvent = e.browserEvent,
xy = e.getXY();
browserEvent.pageX = xy[0];
browserEvent.pageY = xy[1];
this.callParent([
e,
isEnd
]);
},
doDelegatedEvent: function(e) {
this.callParent([
Ext.event.Event.enableIEAsync(e)
]);
}
});
}
});
Ext.define('Ext.event.publisher.Focus', {
extend: 'Ext.event.publisher.Dom',
type: 'focus',
handledEvents: [
'focusenter',
'focusleave'
],
handledDomEvents: [
'focusin',
'focusout'
],
doDelegatedEvent: function(e, invokeAfter) {
var me = this,
relatedTarget;
e = me.callParent([
e,
false
]);
if (e) {
if (e.type === 'focusout') {
if (e.relatedTarget == null) {
me.processFocusIn(e, e.target, document.body, invokeAfter);
}
} else {
relatedTarget = e.relatedTarget;
me.processFocusIn(e, (relatedTarget == null || !relatedTarget.tagName) ? document.body : relatedTarget, e.target, invokeAfter);
}
}
},
processFocusIn: function(e, fromElement, toElement, invokeAfter) {
var me = this,
commonAncestor = Ext.Element.getCommonAncestor(toElement, fromElement, true),
node,
targets = [],
event;
for (node = fromElement; node && node !== commonAncestor; node = node.parentNode) {
targets.push(node);
}
if (targets.length) {
event = me.createSyntheticEvent('focusleave', e, fromElement, toElement);
me.publish('focusleave', targets, event);
targets.length = 0;
if (event.isStopped) {
return;
}
}
for (node = toElement; node !== commonAncestor; node = node.parentNode) {
targets.push(node);
}
event = me.createSyntheticEvent('focusenter', e, toElement, fromElement);
me.publish('focusenter', targets, event);
if (event.isStopped) {
return;
}
if (invokeAfter) {
me.afterEvent(e);
}
Ext.GlobalEvents.fireEvent('focus', {
event: event,
toElement: toElement,
fromElement: fromElement
});
},
createSyntheticEvent: function(eventName, browserEvent, target, relatedTarget) {
var event = new Ext.event.Event(browserEvent);
event.type = eventName;
event.relatedTarget = relatedTarget;
event.target = target;
return event;
}
}, function(Focus) {
var focusTimeout;
if (!Ext.supports.FocusinFocusoutEvents) {
this.override({
handledDomEvents: [
'focus',
'blur'
],
doDelegatedEvent: function(e, invokeAfter) {
var me = this;
e = me.callSuper([
e,
false
]);
if (e) {
clearTimeout(focusTimeout);
focusTimeout = 0;
if (e.type === 'blur') {
var blurredEl = e.target === window ? document.body : e.target;
focusTimeout = setTimeout(function() {
focusTimeout = 0;
me.processFocusIn(e, blurredEl, document.body, invokeAfter);
Focus.previousActiveElement = null;
}, 0);
if (e.target === window || e.target === document) {
Focus.previousActiveElement = null;
} else {
Focus.previousActiveElement = e.target;
}
} else {
me.processFocusIn(e, Focus.previousActiveElement || document.body, e.target === window ? document.body : e.target, invokeAfter);
}
}
}
});
}
Focus.instance = new Focus();
});
Ext.define('Ext.mixin.Templatable', {
extend: 'Ext.Mixin',
mixinConfig: {
id: 'templatable'
},
referenceAttributeName: 'reference',
referenceSelector: '[reference]',
getElementConfig: function() {
return {
reference: 'element'
};
},
getElementTemplate: function() {
var elementTemplate = document.createDocumentFragment();
elementTemplate.appendChild(Ext.Element.create(this.getElementConfig(), true));
return elementTemplate;
},
initElement: function() {
var prototype = this.self.prototype;
prototype.elementTemplate = this.getElementTemplate();
prototype.initElement = prototype.doInitElement;
this.initElement.apply(this, arguments);
},
linkElement: function(reference, node) {
this.link(reference, node);
},
doInitElement: function() {
var referenceAttributeName = this.referenceAttributeName,
renderElement, referenceNodes, i, ln, referenceNode, reference;
renderElement = this.elementTemplate.cloneNode(true);
referenceNodes = renderElement.querySelectorAll(this.referenceSelector);
for (i = 0 , ln = referenceNodes.length; i < ln; i++) {
referenceNode = referenceNodes[i];
reference = referenceNode.getAttribute(referenceAttributeName);
referenceNode.removeAttribute(referenceAttributeName);
this.linkElement(reference, referenceNode);
}
}
});
Ext.define('Ext.TaskQueue', {
requires: 'Ext.AnimationQueue',
singleton: true,
pending: false,
mode: true,
constructor: function() {
this.readQueue = [];
this.writeQueue = [];
this.run = Ext.Function.bind(this.run, this);
if (Ext.os.is.iOS) {
Ext.interval(this.watch, 500, this);
}
},
requestRead: function(fn, scope, args) {
this.request(true);
this.readQueue.push(arguments);
},
requestWrite: function(fn, scope, args) {
this.request(false);
this.writeQueue.push(arguments);
},
request: function(mode) {
if (!this.pending) {
this.pendingTime = Date.now();
this.pending = true;
this.mode = mode;
if (mode) {
Ext.defer(this.run, 1, this);
} else {
Ext.Function.requestAnimationFrame(this.run);
}
}
},
watch: function() {
if (this.pending && Date.now() - this.pendingTime >= 500) {
this.run();
}
},
run: function() {
this.pending = false;
var readQueue = this.readQueue,
writeQueue = this.writeQueue,
request = null,
queue;
if (this.mode) {
queue = readQueue;
if (writeQueue.length > 0) {
request = false;
}
} else {
queue = writeQueue;
if (readQueue.length > 0) {
request = true;
}
}
var tasks = queue.slice(),
i, ln, task, fn, scope;
queue.length = 0;
for (i = 0 , ln = tasks.length; i < ln; i++) {
task = tasks[i];
fn = task[0];
scope = task[1];
if (typeof fn === 'string') {
fn = scope[fn];
}
if (task.length > 2) {
fn.apply(scope, task[2]);
} else {
fn.call(scope);
}
}
tasks.length = 0;
if (request !== null) {
this.request(request);
}
}
});
Ext.define('Ext.util.sizemonitor.Abstract', {
mixins: [
'Ext.mixin.Templatable'
],
requires: [
'Ext.TaskQueue'
],
config: {
element: null,
callback: Ext.emptyFn,
scope: null,
args: []
},
width: 0,
height: 0,
contentWidth: 0,
contentHeight: 0,
constructor: function(config) {
this.refresh = Ext.Function.bind(this.refresh, this);
this.info = {
width: 0,
height: 0,
contentWidth: 0,
contentHeight: 0,
flag: 0
};
this.initElement();
this.initConfig(config);
this.bindListeners(true);
},
bindListeners: Ext.emptyFn,
applyElement: function(element) {
if (element) {
return Ext.get(element);
}
},
updateElement: function(element) {
element.append(this.detectorsContainer);
element.addCls(Ext.baseCSSPrefix + 'size-monitored');
},
applyArgs: function(args) {
return args.concat([
this.info
]);
},
refreshMonitors: Ext.emptyFn,
forceRefresh: function() {
Ext.TaskQueue.requestRead('refresh', this);
},
getContentBounds: function() {
return this.detectorsContainer.getBoundingClientRect();
},
getContentWidth: function() {
return this.detectorsContainer.offsetWidth;
},
getContentHeight: function() {
return this.detectorsContainer.offsetHeight;
},
refreshSize: function() {
var element = this.getElement();
if (!element || element.isDestroyed) {
return false;
}
var width = element.getWidth(),
height = element.getHeight(),
contentWidth = this.getContentWidth(),
contentHeight = this.getContentHeight(),
currentContentWidth = this.contentWidth,
currentContentHeight = this.contentHeight,
info = this.info,
resized = false,
flag;
this.width = width;
this.height = height;
this.contentWidth = contentWidth;
this.contentHeight = contentHeight;
flag = ((currentContentWidth !== contentWidth ? 1 : 0) + (currentContentHeight !== contentHeight ? 2 : 0));
if (flag > 0) {
info.width = width;
info.height = height;
info.contentWidth = contentWidth;
info.contentHeight = contentHeight;
info.flag = flag;
resized = true;
this.getCallback().apply(this.getScope(), this.getArgs());
}
return resized;
},
refresh: function(force) {
if (this.refreshSize() || force) {
Ext.TaskQueue.requestWrite('refreshMonitors', this);
}
},
destroy: function() {
var element = this.getElement();
this.bindListeners(false);
if (element && !element.isDestroyed) {
element.removeCls(Ext.baseCSSPrefix + 'size-monitored');
}
delete this._element;
this.callParent();
}
});
Ext.define('Ext.util.sizemonitor.Default', {
extend: 'Ext.util.sizemonitor.Abstract',
updateElement: function(element) {},
bindListeners: function(bind) {
var element = this.getElement().dom;
if (!element) {
return;
}
if (bind) {
element.onresize = this.refresh;
} else {
delete element.onresize;
}
},
getContentBounds: function() {
return this.getElement().dom.getBoundingClientRect();
},
getContentWidth: function() {
return this.getElement().getWidth();
},
getContentHeight: function() {
return this.getElement().getHeight();
}
});
Ext.define('Ext.util.sizemonitor.Scroll', {
extend: 'Ext.util.sizemonitor.Abstract',
getElementConfig: function() {
return {
reference: 'detectorsContainer',
classList: [
Ext.baseCSSPrefix + 'size-monitors',
'scroll'
],
children: [
{
reference: 'expandMonitor',
className: 'expand'
},
{
reference: 'shrinkMonitor',
className: 'shrink'
}
]
};
},
constructor: function(config) {
this.onScroll = Ext.Function.bind(this.onScroll, this);
this.callParent(arguments);
},
bindListeners: function(bind) {
var method = bind ? 'addEventListener' : 'removeEventListener';
this.expandMonitor[method]('scroll', this.onScroll, true);
this.shrinkMonitor[method]('scroll', this.onScroll, true);
},
forceRefresh: function() {
Ext.TaskQueue.requestRead('refresh', this, [
true
]);
},
onScroll: function() {
Ext.TaskQueue.requestRead('refresh', this);
},
refreshMonitors: function() {
var expandMonitor = this.expandMonitor,
shrinkMonitor = this.shrinkMonitor,
end = 1000000;
if (expandMonitor && !expandMonitor.isDestroyed) {
expandMonitor.scrollLeft = end;
expandMonitor.scrollTop = end;
}
if (shrinkMonitor && !shrinkMonitor.isDestroyed) {
shrinkMonitor.scrollLeft = end;
shrinkMonitor.scrollTop = end;
}
}
});
Ext.define('Ext.util.sizemonitor.OverflowChange', {
extend: 'Ext.util.sizemonitor.Abstract',
constructor: function(config) {
this.onExpand = Ext.Function.bind(this.onExpand, this);
this.onShrink = Ext.Function.bind(this.onShrink, this);
this.callParent(arguments);
},
getElementConfig: function() {
return {
reference: 'detectorsContainer',
classList: [
Ext.baseCSSPrefix + 'size-monitors',
'overflowchanged'
],
children: [
{
reference: 'expandMonitor',
className: 'expand',
children: [
{
reference: 'expandHelper'
}
]
},
{
reference: 'shrinkMonitor',
className: 'shrink',
children: [
{
reference: 'shrinkHelper'
}
]
}
]
};
},
bindListeners: function(bind) {
var method = bind ? 'addEventListener' : 'removeEventListener';
this.expandMonitor[method](Ext.browser.is.Firefox ? 'underflow' : 'overflowchanged', this.onExpand, true);
this.shrinkMonitor[method](Ext.browser.is.Firefox ? 'overflow' : 'overflowchanged', this.onShrink, true);
},
onExpand: function(e) {
if (Ext.browser.is.Webkit && e.horizontalOverflow && e.verticalOverflow) {
return;
}
Ext.TaskQueue.requestRead('refresh', this);
},
onShrink: function(e) {
if (Ext.browser.is.Webkit && !e.horizontalOverflow && !e.verticalOverflow) {
return;
}
Ext.TaskQueue.requestRead('refresh', this);
},
refreshMonitors: function() {
if (this.isDestroyed) {
return;
}
var expandHelper = this.expandHelper,
shrinkHelper = this.shrinkHelper,
contentBounds = this.getContentBounds(),
width = contentBounds.width,
height = contentBounds.height,
style;
if (expandHelper && !expandHelper.isDestroyed) {
style = expandHelper.style;
style.width = (width + 1) + 'px';
style.height = (height + 1) + 'px';
}
if (shrinkHelper && !shrinkHelper.isDestroyed) {
style = shrinkHelper.style;
style.width = width + 'px';
style.height = height + 'px';
}
Ext.TaskQueue.requestRead('refresh', this);
}
});
Ext.define('Ext.util.SizeMonitor', {
requires: [
'Ext.util.sizemonitor.Default',
'Ext.util.sizemonitor.Scroll',
'Ext.util.sizemonitor.OverflowChange'
],
constructor: function(config) {
var namespace = Ext.util.sizemonitor;
if (Ext.browser.is.Firefox) {
return new namespace.OverflowChange(config);
} else if (Ext.browser.is.WebKit) {
if (!Ext.browser.is.Silk && Ext.browser.engineVersion.gtEq('535')) {
return new namespace.OverflowChange(config);
} else {
return new namespace.Scroll(config);
}
} else if (Ext.browser.is.IE11) {
return new namespace.Scroll(config);
} else {
return new namespace.Default(config);
}
}
});
Ext.define('Ext.event.publisher.ElementSize', {
extend: 'Ext.event.publisher.Publisher',
requires: [
'Ext.util.SizeMonitor'
],
type: 'size',
handledEvents: [
'resize'
],
constructor: function() {
this.monitors = {};
this.subscribers = {};
this.callParent(arguments);
},
subscribe: function(element) {
var id = element.id,
subscribers = this.subscribers,
monitors = this.monitors;
if (subscribers[id]) {
++subscribers[id];
} else {
subscribers[id] = 1;
monitors[id] = new Ext.util.SizeMonitor({
element: element,
callback: this.onElementResize,
scope: this,
args: [
element
]
});
}
element.on('painted', 'forceRefresh', monitors[id]);
return true;
},
unsubscribe: function(element) {
var id = element.id,
subscribers = this.subscribers,
monitors = this.monitors,
sizeMonitor;
if (subscribers[id] && !--subscribers[id]) {
delete subscribers[id];
sizeMonitor = monitors[id];
element.un('painted', 'forceRefresh', sizeMonitor);
sizeMonitor.destroy();
delete monitors[id];
}
},
onElementResize: function(element, info) {
Ext.TaskQueue.requestRead('fire', this, [
element,
'resize',
[
element,
info
]
]);
}
}, function(ElementSize) {
ElementSize.instance = new ElementSize();
});
Ext.define('Ext.util.paintmonitor.Abstract', {
config: {
element: null,
callback: Ext.emptyFn,
scope: null,
args: []
},
eventName: '',
monitorClass: '',
constructor: function(config) {
this.onElementPainted = Ext.Function.bind(this.onElementPainted, this);
this.initConfig(config);
},
bindListeners: function(bind) {
this.monitorElement[bind ? 'addEventListener' : 'removeEventListener'](this.eventName, this.onElementPainted, true);
},
applyElement: function(element) {
if (element) {
return Ext.get(element);
}
},
updateElement: function(element) {
this.monitorElement = Ext.Element.create({
classList: [
Ext.baseCSSPrefix + 'paint-monitor',
this.monitorClass
]
}, true);
element.appendChild(this.monitorElement);
element.addCls(Ext.baseCSSPrefix + 'paint-monitored');
this.bindListeners(true);
},
onElementPainted: function() {},
destroy: function() {
var monitorElement = this.monitorElement,
parentNode = monitorElement.parentNode,
element = this.getElement();
this.bindListeners(false);
delete this.monitorElement;
if (element && !element.isDestroyed) {
element.removeCls(Ext.baseCSSPrefix + 'paint-monitored');
delete this._element;
}
if (parentNode) {
parentNode.removeChild(monitorElement);
}
this.callParent();
}
});
Ext.define('Ext.util.paintmonitor.CssAnimation', {
extend: 'Ext.util.paintmonitor.Abstract',
eventName: Ext.browser.is.WebKit ? 'webkitAnimationEnd' : 'animationend',
monitorClass: 'cssanimation',
onElementPainted: function(e) {
if (e.animationName === Ext.baseCSSPrefix + 'paint-monitor-helper') {
this.getCallback().apply(this.getScope(), this.getArgs());
}
}
});
Ext.define('Ext.util.paintmonitor.OverflowChange', {
extend: 'Ext.util.paintmonitor.Abstract',
eventName: Ext.browser.is.Firefox ? 'overflow' : 'overflowchanged',
monitorClass: 'overflowchange',
onElementPainted: function(e) {
this.getCallback().apply(this.getScope(), this.getArgs());
}
});
Ext.define('Ext.util.PaintMonitor', {
requires: [
'Ext.util.paintmonitor.CssAnimation',
'Ext.util.paintmonitor.OverflowChange'
],
constructor: function(config) {
if (Ext.browser.is.Firefox || (Ext.browser.is.WebKit && Ext.browser.engineVersion.gtEq('536') && !Ext.os.is.Blackberry)) {
return new Ext.util.paintmonitor.OverflowChange(config);
} else {
return new Ext.util.paintmonitor.CssAnimation(config);
}
}
});
Ext.define('Ext.event.publisher.ElementPaint', {
extend: 'Ext.event.publisher.Publisher',
requires: [
'Ext.util.PaintMonitor',
'Ext.TaskQueue'
],
type: 'paint',
handledEvents: [
'painted'
],
constructor: function() {
this.monitors = {};
this.subscribers = {};
this.callParent(arguments);
},
subscribe: function(element) {
var id = element.id,
subscribers = this.subscribers;
if (subscribers[id]) {
++subscribers[id];
} else {
subscribers[id] = 1;
this.monitors[id] = new Ext.util.PaintMonitor({
element: element,
callback: this.onElementPainted,
scope: this,
args: [
element
]
});
}
},
unsubscribe: function(element) {
var id = element.id,
subscribers = this.subscribers,
monitors = this.monitors;
if (subscribers[id] && !--subscribers[id]) {
delete subscribers[id];
monitors[id].destroy();
delete monitors[id];
}
},
onElementPainted: function(element) {
Ext.TaskQueue.requestRead('fire', this, [
element,
'painted',
[
element
]
]);
}
}, function(ElementPaint) {
ElementPaint.instance = new ElementPaint();
});
Ext.define('Ext.dom.Element', function(Element) {
var WIN = window,
DOC = document,
windowId = 'ext-window',
documentId = 'ext-document',
WIDTH = 'width',
HEIGHT = 'height',
MIN_WIDTH = 'min-width',
MIN_HEIGHT = 'min-height',
MAX_WIDTH = 'max-width',
MAX_HEIGHT = 'max-height',
TOP = 'top',
RIGHT = 'right',
BOTTOM = 'bottom',
LEFT = 'left',
VISIBILITY = 'visibility',
HIDDEN = 'hidden',
DISPLAY = "display",
NONE = "none",
ZINDEX = "z-index",
POSITION = "position",
RELATIVE = "relative",
STATIC = "static",
SEPARATOR = '-',
wordsRe = /\w/g,
spacesRe = /\s+/,
classNameSplitRegex = /[\s]+/,
transparentRe = /^(?:transparent|(?:rgba[(](?:\s*\d+\s*[,]){3}\s*0\s*[)]))$/i,
adjustDirect2DTableRe = /table-row|table-.*-group/,
topRe = /top/i,
borders = {
t: 'border-top-width',
r: 'border-right-width',
b: 'border-bottom-width',
l: 'border-left-width'
},
paddings = {
t: 'padding-top',
r: 'padding-right',
b: 'padding-bottom',
l: 'padding-left'
},
margins = {
t: 'margin-top',
r: 'margin-right',
b: 'margin-bottom',
l: 'margin-left'
},
paddingsTLRB = [
paddings.l,
paddings.r,
paddings.t,
paddings.b
],
bordersTLRB = [
borders.l,
borders.r,
borders.t,
borders.b
],
numberRe = /\d+$/,
unitRe = /\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i,
defaultUnit = 'px',
camelRe = /(-[a-z])/gi,
cssRe = /([a-z0-9\-]+)\s*:\s*([^;\s]+(?:\s*[^;\s]+)*);?/gi,
pxRe = /^\d+(?:\.\d*)?px$/i,
propertyCache = {},
camelReplaceFn = function(m, a) {
return a.charAt(1).toUpperCase();
},
visibilityCls = Ext.baseCSSPrefix + 'hidden-visibility',
displayCls = Ext.baseCSSPrefix + 'hidden-display',
offsetsCls = Ext.baseCSSPrefix + 'hidden-offsets',
sizedCls = Ext.baseCSSPrefix + 'sized',
unsizedCls = Ext.baseCSSPrefix + 'unsized',
stretchedCls = Ext.baseCSSPrefix + 'stretched',
noTouchScrollCls = Ext.baseCSSPrefix + 'no-touch-scroll',
CREATE_ATTRIBUTES = {
style: 'style',
className: 'className',
cls: 'cls',
classList: 'classList',
text: 'text',
hidden: 'hidden',
html: 'html',
children: 'children'
},
visFly, scrollFly, caFly;
return {
alternateClassName: [
'Ext.Element'
],
mixins: [
'Ext.util.Positionable',
'Ext.mixin.Observable'
],
requires: [
'Ext.dom.Shadow',
'Ext.dom.Shim',
'Ext.dom.ElementEvent',
'Ext.event.publisher.Dom',
'Ext.event.publisher.Gesture',
'Ext.event.publisher.Focus',
'Ext.event.publisher.ElementSize',
'Ext.event.publisher.ElementPaint'
],
uses: [
'Ext.dom.Helper',
'Ext.dom.CompositeElement',
'Ext.dom.Fly'
],
observableType: 'element',
isElement: true,
skipGarbageCollection: true,
identifiablePrefix: 'ext-element-',
styleHooks: {},
validIdRe: Ext.validIdRe,
blockedEvents: Ext.supports.EmulatedMouseOver ? {
mouseover: 1
} : {},
longpressEvents: {
longpress: 1,
taphold: 1
},
constructor: function(dom) {
var me = this,
id;
if (typeof dom === 'string') {
dom = DOC.getElementById(dom);
}
if (!dom) {
Ext.Error.raise("Invalid domNode reference or an id of an existing domNode: " + dom);
return null;
}
if (Ext.cache[dom.id]) {
Ext.Error.raise("Element cache already contains an entry for id '" + dom.id + "'. Use Ext.get() to create or retrieve Element instances.");
}
me.dom = dom;
id = dom.id;
if (id) {
me.id = id;
} else {
id = dom.id = me.getUniqueId();
}
if (!me.validIdRe.test(me.id)) {
Ext.Error.raise('Invalid Element "id": "' + me.id + '"');
}
me.el = me;
Ext.cache[id] = me;
me.mixins.observable.constructor.call(me);
},
inheritableStatics: {
cache: Ext.cache = {},
VISIBILITY: 1,
DISPLAY: 2,
OFFSETS: 3,
unitRe: unitRe,
useDelegatedEvents: true,
validNodeTypes: {
1: 1,
9: 1
},
addUnits: function(size, units) {
if (typeof size === 'number') {
return size + (units || defaultUnit);
}
if (size === "" || size === "auto" || size == null) {
return size || '';
}
if (numberRe.test(size)) {
return size + (units || defaultUnit);
}
if (!unitRe.test(size)) {
Ext.Logger.warn("Warning, size detected (" + size + ") not a valid property value on Element.addUnits.");
return size || '';
}
return size;
},
create: function(attributes, domNode) {
var me = this,
hidden = CREATE_ATTRIBUTES.hidden,
element, elementStyle, tag, value, name, i, ln, className;
if (!attributes) {
attributes = {};
}
if (attributes.isElement) {
return domNode ? attributes.dom : attributes;
} else if ('nodeType' in attributes) {
return domNode ? attributes : Ext.get(attributes);
}
if (typeof attributes === 'string') {
return DOC.createTextNode(attributes);
}
tag = attributes.tag;
if (!tag) {
tag = 'div';
}
if (attributes.namespace) {
element = DOC.createElementNS(attributes.namespace, tag);
} else {
element = DOC.createElement(tag);
}
elementStyle = element.style;
if (attributes[hidden]) {
className = attributes.className;
className = (className == null) ? '' : className + ' ';
attributes.className = className + displayCls;
delete attributes[hidden];
}
for (name in attributes) {
if (name !== 'tag') {
value = attributes[name];
switch (name) {
case CREATE_ATTRIBUTES.style:
if (typeof value === 'string') {
element.setAttribute(name, value);
} else {
for (i in value) {
if (value.hasOwnProperty(i)) {
elementStyle[i] = value[i];
}
}
};
break;
case CREATE_ATTRIBUTES.className:
case CREATE_ATTRIBUTES.cls:
element.className = value;
break;
case CREATE_ATTRIBUTES.classList:
element.className = value.join(' ');
break;
case CREATE_ATTRIBUTES.text:
element.textContent = value;
break;
case CREATE_ATTRIBUTES.html:
element.innerHTML = value;
break;
case CREATE_ATTRIBUTES.children:
for (i = 0 , ln = value.length; i < ln; i++) {
element.appendChild(me.create(value[i], true));
};
break;
default:
if (value != null) {
element.setAttribute(name, value);
};
}
}
}
if (domNode) {
return element;
} else {
return me.get(element);
}
},
detach: function() {
var dom = this.dom;
if (dom && dom.parentNode && dom.tagName !== 'BODY') {
dom.parentNode.removeChild(dom);
}
return this;
},
fly: function(dom, named) {
return Ext.fly(dom, named);
},
fromPoint: function(x, y) {
return Ext.get(DOC.elementFromPoint(x, y));
},
get: function(el) {
var me = this,
cache = Ext.cache,
nodeType, dom, id, entry, isDoc, isWin, isValidNodeType;
if (!el) {
return null;
}
function warnDuplicate(id) {
Ext.Error.raise("DOM element with id " + id + " in Element cache is not the same as element in the DOM. " + "Make sure to clean up Element instances using destroy()");
}
if (el.isFly) {
el = el.dom;
}
if (typeof el === 'string') {
id = el;
if (cache.hasOwnProperty(id)) {
entry = cache[id];
if (entry.skipGarbageCollection || !Ext.isGarbage(entry.dom)) {
dom = Ext.getElementById ? Ext.getElementById(id) : DOC.getElementById(id);
if (dom && (dom !== entry.dom)) {
warnDuplicate(id);
}
return entry;
} else {
entry.destroy();
}
}
if (id === windowId) {
return Element.get(WIN);
} else if (id === documentId) {
return Element.get(DOC);
}
dom = Ext.getElementById ? Ext.getElementById(id) : DOC.getElementById(id);
if (dom) {
return new Element(dom);
}
}
nodeType = el.nodeType;
if (nodeType) {
isDoc = (nodeType === 9);
isValidNodeType = me.validNodeTypes[nodeType];
} else {
isWin = (el.window == el);
}
if (isValidNodeType || isWin) {
id = el.id;
if (cache.hasOwnProperty(id)) {
entry = cache[id];
if (entry.skipGarbageCollection || el === entry.dom || !Ext.isGarbage(entry.dom)) {
if (el !== entry.dom) {
warnDuplicate(id);
}
return entry;
} else {
entry.destroy();
}
}
if (el === DOC) {
el.id = documentId;
}
if (el == WIN) {
el.id = windowId;
}
el = new Element(el);
if (isWin || isDoc) {
el.skipGarbageCollection = true;
}
return el;
}
if (el.isElement) {
return el;
}
if (el.isComposite) {
return el;
}
if (Ext.isIterable(el)) {
return me.select(el);
}
return null;
},
getActiveElement: function() {
var active = DOC.activeElement;
if (!active || !active.focus) {
active = DOC.body;
}
return active;
},
getDocumentHeight: function() {
return Math.max(!Ext.isStrict ? DOC.body.scrollHeight : DOC.documentElement.scrollHeight, this.getViewportHeight());
},
getDocumentWidth: function() {
return Math.max(!Ext.isStrict ? DOC.body.scrollWidth : DOC.documentElement.scrollWidth, this.getViewportWidth());
},
getOrientation: function() {
if (Ext.supports.OrientationChange) {
return (WIN.orientation == 0) ? 'portrait' : 'landscape';
}
return (WIN.innerHeight > WIN.innerWidth) ? 'portrait' : 'landscape';
},
getViewportHeight: function() {
return WIN.innerHeight;
},
getViewportWidth: function() {
return WIN.innerWidth;
},
getViewSize: function() {
return {
width: Element.getViewportWidth(),
height: Element.getViewportHeight()
};
},
normalize: function(prop) {
return propertyCache[prop] || (propertyCache[prop] = prop.replace(camelRe, camelReplaceFn));
},
parseBox: function(box) {
box = box || 0;
var type = typeof box,
parts, ln;
if (type === 'number') {
return {
top: box,
right: box,
bottom: box,
left: box
};
} else if (type !== 'string') {
return box;
}
parts = box.split(' ');
ln = parts.length;
if (ln === 1) {
parts[1] = parts[2] = parts[3] = parts[0];
} else if (ln === 2) {
parts[2] = parts[0];
parts[3] = parts[1];
} else if (ln === 3) {
parts[3] = parts[1];
}
return {
top: parseFloat(parts[0]) || 0,
right: parseFloat(parts[1]) || 0,
bottom: parseFloat(parts[2]) || 0,
left: parseFloat(parts[3]) || 0
};
},
parseStyles: function(styles) {
var out = {},
matches;
if (styles) {
cssRe.lastIndex = 0;
while ((matches = cssRe.exec(styles))) {
out[matches[1]] = matches[2] || '';
}
}
return out;
},
select: function(selector, composite, root) {
return Ext.fly(root || DOC).select(selector, composite);
},
query: function(selector, asDom, root) {
return Ext.fly(root || DOC).query(selector, asDom);
},
unitizeBox: function(box, units) {
var me = this;
box = me.parseBox(box);
return me.addUnits(box.top, units) + ' ' + me.addUnits(box.right, units) + ' ' + me.addUnits(box.bottom, units) + ' ' + me.addUnits(box.left, units);
},
serializeForm: function(form) {
var fElements = form.elements || (DOC.forms[form] || Ext.getDom(form)).elements,
hasSubmit = false,
encoder = encodeURIComponent,
data = '',
eLen = fElements.length,
element, name, type, options, hasValue, e, o, oLen, opt;
for (e = 0; e < eLen; e++) {
element = fElements[e];
name = element.name;
type = element.type;
options = element.options;
if (!element.disabled && name) {
if (/select-(one|multiple)/i.test(type)) {
oLen = options.length;
for (o = 0; o < oLen; o++) {
opt = options[o];
if (opt.selected) {
hasValue = opt.hasAttribute('value');
data += Ext.String.format('{0}={1}&', encoder(name), encoder(hasValue ? opt.value : opt.text));
}
}
} else if (!(/file|undefined|reset|button/i.test(type))) {
if (!(/radio|checkbox/i.test(type) && !element.checked) && !(type == 'submit' && hasSubmit)) {
data += encoder(name) + '=' + encoder(element.value) + '&';
hasSubmit = /submit/i.test(type);
}
}
}
}
return data.substr(0, data.length - 1);
},
getCommonAncestor: function(nodeA, nodeB, returnDom) {
caFly = caFly || new Ext.dom.Fly();
caFly.attach(Ext.getDom(nodeA));
while (!caFly.isAncestor(nodeB)) {
if (caFly.dom.parentNode) {
caFly.attach(caFly.dom.parentNode);
} else
{
caFly.attach(document.body);
break;
}
}
return returnDom ? caFly.dom : Ext.get(caFly);
}
},
addCls: function(names, prefix, suffix) {
var me = this,
elementData = me.getData(),
hasNewCls, dom, map, classList, i, ln, name;
if (!names) {
return me;
}
if (!elementData.isSynchronized) {
me.synchronize();
}
dom = me.dom;
map = elementData.classMap;
classList = elementData.classList;
prefix = prefix ? prefix + SEPARATOR : '';
suffix = suffix ? SEPARATOR + suffix : '';
if (typeof names === 'string') {
names = names.split(spacesRe);
}
for (i = 0 , ln = names.length; i < ln; i++) {
name = names[i];
if (name) {
name = prefix + name + suffix;
if (!map[name]) {
map[name] = true;
classList.push(name);
hasNewCls = true;
}
}
}
if (hasNewCls) {
dom.className = classList.join(' ');
}
return me;
},
addStyles: function(sides, styles) {
var totalSize = 0,
sidesArr = (sides || '').match(wordsRe),
i,
len = sidesArr.length,
side,
styleSides = [];
if (len === 1) {
totalSize = Math.abs(parseFloat(this.getStyle(styles[sidesArr[0]])) || 0);
} else if (len) {
for (i = 0; i < len; i++) {
side = sidesArr[i];
styleSides.push(styles[side]);
}
styleSides = this.getStyle(styleSides);
for (i = 0; i < len; i++) {
side = sidesArr[i];
totalSize += parseFloat(styleSides[styles[side]]) || 0;
}
}
return totalSize;
},
addUnits: function(size, units) {
return Element.addUnits(size, units);
},
adjustDirect2DDimension: function(dimension) {
var me = this,
dom = me.dom,
display = me.getStyle('display'),
inlineDisplay = dom.style.display,
inlinePosition = dom.style.position,
originIndex = dimension === WIDTH ? 0 : 1,
currentStyle = dom.currentStyle,
floating;
if (display === 'inline') {
dom.style.display = 'inline-block';
}
dom.style.position = display.match(adjustDirect2DTableRe) ? 'absolute' : 'static';
floating = (parseFloat(currentStyle[dimension]) || parseFloat(currentStyle.msTransformOrigin.split(' ')[originIndex]) * 2) % 1;
dom.style.position = inlinePosition;
if (display === 'inline') {
dom.style.display = inlineDisplay;
}
return floating;
},
animate: function(animation) {
animation = new Ext.fx.Animation(animation);
animation.setElement(this);
this._activeAnimation = animation;
animation.on({
animationend: this._onAnimationEnd
});
Ext.Animator.run(animation);
},
_onAnimationEnd: function() {
this._activeAnimation = null;
},
getActiveAnimation: function() {
return this._activeAnimation;
},
append: function() {
this.appendChild.apply(this, arguments);
},
appendChild: function(el, returnDom) {
var me = this,
insertEl, eLen, e;
if (el.nodeType || el.dom || typeof el === 'string') {
el = Ext.getDom(el);
me.dom.appendChild(el);
return !returnDom ? Ext.get(el) : el;
} else if (el.length) {
insertEl = Ext.fly(document.createDocumentFragment());
eLen = el.length;
for (e = 0; e < eLen; e++) {
insertEl.appendChild(el[e], returnDom);
}
me.dom.appendChild(insertEl.dom);
return returnDom ? insertEl.dom : insertEl;
} else {
return me.createChild(el, null, returnDom);
}
},
appendTo: function(el) {
Ext.getDom(el).appendChild(this.dom);
return this;
},
applyStyles: function(styles) {
if (styles) {
if (typeof styles === "function") {
styles = styles.call();
}
if (typeof styles === "string") {
styles = Element.parseStyles(styles);
}
if (typeof styles === "object") {
this.setStyle(styles);
}
}
return this;
},
blur: function() {
var me = this,
dom = me.dom;
if (dom !== DOC.body) {
try {
dom.blur();
} catch (e) {}
return me;
} else {
return me.focus(undefined, dom);
}
},
cacheScrollValues: function() {
var me = this,
scrollValues = [],
scrolledDescendants = [],
descendants, descendant, i, len;
scrollFly = scrollFly || new Ext.dom.Fly();
descendants = me.query('*');
for (i = 0 , len = descendants.length; i < len; i++) {
descendant = descendants[i];
if (descendant.scrollTop > 0 || descendant.scrollLeft !== 0) {
scrolledDescendants.push(descendant);
scrollValues.push(scrollFly.attach(descendant).getScroll());
}
}
return function() {
var scroll, i, len;
for (i = 0 , len = scrolledDescendants.length; i < len; i++) {
scroll = scrollValues[i];
scrollFly.attach(scrolledDescendants[i]);
scrollFly.setScrollLeft(scroll.left);
scrollFly.setScrollTop(scroll.top);
}
};
},
center: function(centerIn) {
return this.alignTo(centerIn || DOC, 'c-c');
},
child: function(selector, returnDom) {
var me = this,
id = Ext.get(me).id;
return me.selectNode(Ext.makeIdSelector(id) + " > " + selector, !!returnDom);
},
constrainScrollLeft: function(left) {
var dom = this.dom;
return Math.max(Math.min(left, dom.scrollWidth - dom.clientWidth), 0);
},
constrainScrollTop: function(top) {
var dom = this.dom;
return Math.max(Math.min(top, dom.scrollHeight - dom.clientHeight), 0);
},
createChild: function(config, insertBefore, returnDom) {
config = config || {
tag: 'div'
};
if (insertBefore) {
return Ext.DomHelper.insertBefore(insertBefore, config, returnDom !== true);
} else {
return Ext.DomHelper.append(this.dom, config, returnDom !== true);
}
},
contains: function(element) {
if (!element) {
return false;
}
var me = this,
dom = Ext.getDom(element);
return (dom === me.dom) || me.isAncestor(dom);
},
destroy: function() {
var me = this,
dom = me.dom;
if (me.isDestroyed) {
Ext.Logger.warn("Cannot destroy Element \"" + me.id + "\". Already destroyed.");
return;
}
if (dom) {
if (dom === DOC.body) {
Ext.Error.raise("Cannot destroy body element.");
} else if (dom === DOC) {
Ext.Error.raise("Cannot destroy document object.");
} else if (dom === WIN) {
Ext.Error.raise("Cannot destroy window object");
}
}
if (dom && dom.parentNode) {
dom.parentNode.removeChild(dom);
}
me.collect();
},
detach: function() {
var dom = this.dom;
if (dom && dom.parentNode && dom.tagName !== 'BODY') {
dom.parentNode.removeChild(dom);
}
return this;
},
disableShadow: function() {
var shadow = this.shadow;
if (shadow) {
shadow.hide();
shadow.disabled = true;
}
},
disableShim: function() {
var shim = this.shim;
if (shim) {
shim.hide();
shim.disabled = true;
}
},
disableTouchContextMenu: function() {
this._contextMenuListenerRemover = this.on({
MSHoldVisual: function(e) {
e.preventDefault();
},
destroyable: true,
delegated: false
});
},
disableTouchScroll: function() {
this.addCls(noTouchScrollCls);
this.on({
touchmove: function(e) {
e.preventDefault();
},
translate: false
});
},
doReplaceWith: function(element) {
var dom = this.dom;
dom.parentNode.replaceChild(Ext.getDom(element), dom);
},
doScrollIntoView: function(container, hscroll, animate, highlight, getScrollX, scrollTo) {
scrollFly = scrollFly || new Ext.dom.Fly();
var me = this,
dom = me.dom,
scrollX = scrollFly.attach(container)[getScrollX](),
scrollY = container.scrollTop,
position = me.getScrollIntoViewXY(container, scrollX, scrollY),
newScrollX = position.x,
newScrollY = position.y;
if (highlight) {
if (animate) {
animate = Ext.apply({
listeners: {
afteranimate: function() {
scrollFly.attach(dom).highlight();
}
}
}, animate);
} else {
scrollFly.attach(dom).highlight();
}
}
if (newScrollY !== scrollY) {
scrollFly.attach(container).scrollTo('top', newScrollY, animate);
}
if (hscroll !== false && (newScrollX !== scrollX)) {
scrollFly.attach(container)[scrollTo]('left', newScrollX, animate);
}
return me;
},
down: function(selector, returnDom) {
return this.selectNode(selector, !!returnDom);
},
enableShadow: function(options,
isVisible) {
var me = this,
shadow = me.shadow || (me.shadow = new Ext.dom.Shadow(Ext.apply({
target: me
}, options))),
shim = me.shim;
if (shim) {
shim.offsets = shadow.outerOffsets;
shim.shadow = shadow;
shadow.shim = shim;
}
if (isVisible === true || (isVisible !== false && me.isVisible())) {
shadow.show();
} else {
shadow.hide();
}
shadow.disabled = false;
},
enableShim: function(options,
isVisible) {
var me = this,
shim = me.shim || (me.shim = new Ext.dom.Shim(Ext.apply({
target: me
}, options))),
shadow = me.shadow;
if (shadow) {
shim.offsets = shadow.outerOffsets;
shim.shadow = shadow;
shadow.shim = shim;
}
if (isVisible === true || (isVisible !== false && me.isVisible())) {
shim.show();
} else {
shim.hide();
}
shim.disabled = false;
},
findParent: function(simpleSelector, limit, returnEl) {
var me = this,
target = me.dom,
topmost = DOC.documentElement,
depth = 0;
if (limit || limit === 0) {
if (typeof limit !== 'number') {
topmost = Ext.getDom(limit);
limit = Number.MAX_VALUE;
}
} else {
limit = 50;
}
while (target && target.nodeType === 1 && depth < limit && target !== topmost) {
if (Ext.fly(target).is(simpleSelector)) {
return returnEl ? Ext.get(target) : target;
}
depth++;
target = target.parentNode;
}
return null;
},
findParentNode: function(simpleSelector, limit, returnEl) {
var p = Ext.fly(this.dom.parentNode);
return p ? p.findParent(simpleSelector, limit, returnEl) : null;
},
first: function(selector, returnDom) {
return this.matchNode('nextSibling', 'firstChild', selector, returnDom);
},
focus: function(defer,
dom) {
var me = this;
dom = dom || me.dom;
try {
if (Number(defer)) {
Ext.defer(me.focus, defer, me, [
null,
dom
]);
} else {
Ext.GlobalEvents.fireEvent('beforefocus', dom);
dom.focus();
}
} catch (e) {}
return me;
},
collect: function() {
var me = this,
dom = me.dom,
shadow = me.shadow,
shim = me.shim;
if (!me.isFly) {
me.mixins.observable.destroy.call(me);
delete Ext.cache[me.id];
me.isDestroyed = true;
me.el = null;
}
if (dom) {
dom._extData = me.dom = null;
}
if (shadow) {
shadow.hide();
me.shadow = null;
}
if (shim) {
shim.hide();
me.shim = null;
}
},
getAnchorToXY: function(el, anchor, local, mySize) {
return el.getAnchorXY(anchor, local, mySize);
},
getAttribute: function(name, namespace) {
var dom = this.dom;
return namespace ? (dom.getAttributeNS(namespace, name) || dom.getAttribute(namespace + ":" + name)) : (dom.getAttribute(name) || dom[name] || null);
},
getAttributes: function() {
var attributes = this.dom.attributes,
result = {},
attr, i, len;
for (i = 0 , len = attributes.length; i < len; i++) {
attr = attributes[i];
result[attr.name] = attr.value;
}
return result;
},
getBottom: function(local) {
return (local ? this.getLocalY() : this.getY()) + this.getHeight();
},
getById: function(id, asDom) {
var dom = DOC.getElementById(id) || this.dom.querySelector(Ext.makeIdSelector(id));
return asDom ? dom : (dom ? Ext.get(dom) : null);
},
getBorderPadding: function() {
var paddingWidth = this.getStyle(paddingsTLRB),
bordersWidth = this.getStyle(bordersTLRB);
return {
beforeX: (parseFloat(bordersWidth[borders.l]) || 0) + (parseFloat(paddingWidth[paddings.l]) || 0),
afterX: (parseFloat(bordersWidth[borders.r]) || 0) + (parseFloat(paddingWidth[paddings.r]) || 0),
beforeY: (parseFloat(bordersWidth[borders.t]) || 0) + (parseFloat(paddingWidth[paddings.t]) || 0),
afterY: (parseFloat(bordersWidth[borders.b]) || 0) + (parseFloat(paddingWidth[paddings.b]) || 0)
};
},
getBorders: function() {
var bordersWidth = this.getStyle(bordersTLRB);
return {
beforeX: (parseFloat(bordersWidth[borders.l]) || 0),
afterX: (parseFloat(bordersWidth[borders.r]) || 0),
beforeY: (parseFloat(bordersWidth[borders.t]) || 0),
afterY: (parseFloat(bordersWidth[borders.b]) || 0)
};
},
getBorderWidth: function(side) {
return this.addStyles(side, borders);
},
getData: function(preventCreate) {
var dom = this.dom,
data;
if (dom) {
data = dom._extData;
if (!data && !preventCreate) {
dom._extData = data = {};
}
}
return data;
},
getFirstChild: function() {
return Ext.get(this.dom.firstElementChild);
},
getHeight: function(contentHeight, preciseHeight) {
var me = this,
hidden = me.isStyle('display', 'none'),
height, floating;
if (hidden) {
return 0;
}
height = me.dom.offsetHeight;
if (Ext.supports.Direct2DBug) {
floating = me.adjustDirect2DDimension(HEIGHT);
if (preciseHeight) {
height += floating;
} else if (floating > 0 && floating < 0.5) {
height++;
}
}
if (contentHeight) {
height -= me.getBorderWidth("tb") + me.getPadding("tb");
}
return (height < 0) ? 0 : height;
},
getHtml: function() {
return this.dom ? this.dom.innerHTML : '';
},
getLeft: function(local) {
return local ? this.getLocalX() : this.getX();
},
getLocalX: function() {
var me = this,
offsetParent,
x = me.getStyle('left');
if (!x || x === 'auto') {
x = 0;
} else if (pxRe.test(x)) {
x = parseFloat(x);
} else {
x = me.getX();
offsetParent = me.dom.offsetParent;
if (offsetParent) {
x -= Ext.fly(offsetParent).getX();
}
}
return x;
},
getLocalXY: function() {
var me = this,
offsetParent,
style = me.getStyle([
'left',
'top'
]),
x = style.left,
y = style.top;
if (!x || x === 'auto') {
x = 0;
} else if (pxRe.test(x)) {
x = parseFloat(x);
} else {
x = me.getX();
offsetParent = me.dom.offsetParent;
if (offsetParent) {
x -= Ext.fly(offsetParent).getX();
}
}
if (!y || y === 'auto') {
y = 0;
} else if (pxRe.test(y)) {
y = parseFloat(y);
} else {
y = me.getY();
offsetParent = me.dom.offsetParent;
if (offsetParent) {
y -= Ext.fly(offsetParent).getY();
}
}
return [
x,
y
];
},
getLocalY: function() {
var me = this,
offsetParent,
y = me.getStyle('top');
if (!y || y === 'auto') {
y = 0;
} else if (pxRe.test(y)) {
y = parseFloat(y);
} else {
y = me.getY();
offsetParent = me.dom.offsetParent;
if (offsetParent) {
y -= Ext.fly(offsetParent).getY();
}
}
return y;
},
getMargin: (function() {
var hash = {
t: "top",
l: "left",
r: "right",
b: "bottom"
},
allMargins = [
'margin-top',
'margin-left',
'margin-right',
'margin-bottom'
];
return function(side) {
var me = this,
style, key, o;
if (!side) {
style = me.getStyle(allMargins);
o = {};
if (style && typeof style === 'object') {
o = {};
for (key in margins) {
o[key] = o[hash[key]] = parseFloat(style[margins[key]]) || 0;
}
}
} else {
o = me.addStyles(side, margins);
}
return o;
};
})(),
getPadding: function(side) {
return this.addStyles(side, paddings);
},
getParent: function() {
return Ext.get(this.dom.parentNode);
},
getRight: function(local) {
return (local ? this.getLocalX() : this.getX()) + this.getWidth();
},
getScroll: function() {
var me = this,
dom = me.dom,
docElement = DOC.documentElement,
left, top,
body = document.body;
if (dom === DOC || dom === body) {
left = docElement.scrollLeft || (body ? body.scrollLeft : 0);
top = docElement.scrollTop || (body ? body.scrollTop : 0);
} else {
left = dom.scrollLeft;
top = dom.scrollTop;
}
return {
left: left,
top: top
};
},
getScrollIntoViewXY: function(container, scrollX, scrollY) {
var dom = this.dom,
ct = Ext.getDom(container),
offsets = this.getOffsetsTo(ct),
width = dom.offsetWidth,
height = dom.offsetHeight,
left = offsets[0] + scrollX,
top = offsets[1] + scrollY,
bottom = top + height,
right = left + width,
viewHeight = ct.clientHeight,
viewWidth = ct.clientWidth,
viewLeft = scrollX,
viewTop = scrollY,
viewBottom = viewTop + viewHeight,
viewRight = viewLeft + viewWidth;
if (height > viewHeight || top < viewTop) {
scrollY = top;
} else if (bottom > viewBottom) {
scrollY = bottom - viewHeight;
}
if (width > viewWidth || left < viewLeft) {
scrollX = left;
} else if (right > viewRight) {
scrollX = right - viewWidth;
}
return {
x: scrollX,
y: scrollY
};
},
getScrollLeft: function() {
var dom = this.dom;
if (dom === DOC || dom === document.body) {
return this.getScroll().left;
} else {
return dom.scrollLeft;
}
},
getScrollTop: function() {
var dom = this.dom;
if (dom === DOC || dom === document.body) {
return this.getScroll().top;
} else {
return dom.scrollTop;
}
},
getSize: function(contentSize) {
return {
width: this.getWidth(contentSize),
height: this.getHeight(contentSize)
};
},
getStyle: function(property, inline) {
var me = this,
dom = me.dom,
multiple = typeof property !== 'string',
hooks = me.styleHooks,
prop = property,
props = prop,
len = 1,
domStyle, camel, values, hook, out, style, i;
if (multiple) {
values = {};
prop = props[0];
i = 0;
if (!(len = props.length)) {
return values;
}
}
if (!dom || dom.documentElement) {
return values || '';
}
domStyle = dom.style;
if (inline) {
style = domStyle;
} else {
style = dom.ownerDocument.defaultView.getComputedStyle(dom, null);
if (!style) {
inline = true;
style = domStyle;
}
}
do {
hook = hooks[prop];
if (!hook) {
hooks[prop] = hook = {
name: Element.normalize(prop)
};
}
if (hook.get) {
out = hook.get(dom, me, inline, style);
} else {
camel = hook.name;
out = style[camel];
}
if (!multiple) {
return out;
}
values[prop] = out;
prop = props[++i];
} while (i < len);
return values;
},
getStyleValue: function(name) {
return this.dom.style.getPropertyValue(name);
},
getTop: function(local) {
return local ? this.getLocalY() : this.getY();
},
getValue: function(asNumber) {
var value = this.dom.value;
return asNumber ? parseInt(value, 10) : value;
},
getViewSize: function() {
var dom = this.dom;
if (dom === DOC || dom === DOC.body) {
return {
width: Element.getViewportWidth(),
height: Element.getViewportHeight()
};
} else {
return {
width: dom.clientWidth,
height: dom.clientHeight
};
}
},
getVisibilityMode: function() {
var me = this,
data = me.getData(),
mode = data.visibilityMode;
if (mode === undefined) {
data.visibilityMode = mode = Element.DISPLAY;
}
return mode;
},
getWidth: function(contentWidth, preciseWidth) {
var me = this,
dom = me.dom,
hidden = me.isStyle('display', 'none'),
rect, width, floating;
if (hidden) {
return 0;
}
if (Ext.supports.BoundingClientRect) {
rect = dom.getBoundingClientRect();
width = (me.vertical && !Ext.supports.RotatedBoundingClientRect) ? (rect.bottom - rect.top) : (rect.right - rect.left);
width = preciseWidth ? width : Math.ceil(width);
} else {
width = dom.offsetWidth;
}
if (Ext.supports.Direct2DBug && !me.vertical) {
floating = me.adjustDirect2DDimension(WIDTH);
if (preciseWidth) {
width += floating;
}
else if (floating > 0 && floating < 0.5) {
width++;
}
}
if (contentWidth) {
width -= me.getBorderWidth("lr") + me.getPadding("lr");
}
return (width < 0) ? 0 : width;
},
getX: function() {
return this.getXY()[0];
},
getXY: function() {
var round = Math.round,
dom = this.dom,
x = 0,
y = 0,
box, scroll;
if (dom !== DOC && dom !== DOC.body) {
try {
box = dom.getBoundingClientRect();
} catch (ex) {
box = {
left: 0,
top: 0
};
}
x = round(box.left);
y = round(box.top);
scroll = Ext.getDoc().getScroll();
x += scroll.left;
y += scroll.top;
}
return [
x,
y
];
},
getY: function() {
return this.getXY()[1];
},
getZIndex: function() {
return parseInt(this.getStyle('z-index'), 10);
},
hasCls: function(name) {
var elementData = this.getData();
if (!elementData.isSynchronized) {
this.synchronize();
}
return elementData.classMap.hasOwnProperty(name);
},
hide: function() {
this.setVisible(false);
return this;
},
insertAfter: function(el) {
el = Ext.getDom(el);
el.parentNode.insertBefore(this.dom, el.nextSibling);
return this;
},
insertBefore: function(el) {
el = Ext.getDom(el);
el.parentNode.insertBefore(this.dom, el);
return this;
},
insertFirst: function(el, returnDom) {
el = el || {};
if (el.nodeType || el.dom || typeof el === 'string') {
el = Ext.getDom(el);
this.dom.insertBefore(el, this.dom.firstChild);
return !returnDom ? Ext.get(el) : el;
} else {
return this.createChild(el, this.dom.firstChild, returnDom);
}
},
insertHtml: function(where, html, returnEl) {
var el = Ext.DomHelper.insertHtml(where, this.dom, html);
return returnEl ? Ext.get(el) : el;
},
insertSibling: function(el, where, returnDom) {
var me = this,
DomHelper = Ext.DomHelper,
isAfter = (where || 'before').toLowerCase() === 'after',
rt, insertEl, eLen, e;
if (Ext.isIterable(el)) {
eLen = el.length;
insertEl = Ext.fly(document.createDocumentFragment());
if (Ext.isArray(el)) {
for (e = 0; e < eLen; e++) {
rt = insertEl.appendChild(el[e], returnDom);
}
} else
{
for (e = 0; e < eLen; e++) {
insertEl.dom.appendChild(rt = el[0]);
}
if (returnDom === false) {
rt = Ext.get(rt);
}
}
me.dom.parentNode.insertBefore(insertEl.dom, isAfter ? me.dom.nextSibling : me.dom);
return rt;
}
el = el || {};
if (el.nodeType || el.dom) {
rt = me.dom.parentNode.insertBefore(Ext.getDom(el), isAfter ? me.dom.nextSibling : me.dom);
if (!returnDom) {
rt = Ext.get(rt);
}
} else {
if (isAfter && !me.dom.nextSibling) {
rt = DomHelper.append(me.dom.parentNode, el, !returnDom);
} else {
rt = DomHelper[isAfter ? 'insertAfter' : 'insertBefore'](me.dom, el, !returnDom);
}
}
return rt;
},
is: function(selector) {
var dom = this.dom,
is;
if (!selector) {
is = true;
} else if (!dom.tagName) {
is = false;
} else if (Ext.isFunction(selector)) {
is = selector(dom);
} else {
is = dom[Ext.supports.matchesSelector](selector);
}
return is;
},
isAncestor: function(el) {
var ret = false,
dom = this.dom,
child = Ext.getDom(el);
if (dom && child) {
if (dom.contains) {
return dom.contains(child);
} else if (dom.compareDocumentPosition) {
return !!(dom.compareDocumentPosition(child) & 16);
} else {
while ((child = child.parentNode)) {
ret = child === dom || ret;
}
}
}
return ret;
},
isPainted: (function() {
return !Ext.browser.is.IE ? function() {
var dom = this.dom;
return Boolean(dom && dom.offsetParent);
} : function() {
var dom = this.dom;
return Boolean(dom && (dom.offsetHeight !== 0 && dom.offsetWidth !== 0));
};
})(),
isStyle: function(style, val) {
return this.getStyle(style) === val;
},
isVisible: function(deep) {
var dom = this.dom,
end;
if (!dom) {
return false;
}
if (!visFly) {
visFly = new Ext.dom.Fly();
}
for (end = dom.ownerDocument.documentElement; dom !== end; dom = dom.parentNode) {
if (!dom || dom.nodeType === 11 || (visFly.attach(dom)).isStyle(VISIBILITY, HIDDEN) || visFly.isStyle(DISPLAY, NONE)) {
return false;
}
if (!deep) {
break;
}
}
return true;
},
last: function(selector, returnDom) {
return this.matchNode('previousSibling', 'lastChild', selector, returnDom);
},
matchNode: function(dir, start, selector, returnDom) {
var dom = this.dom,
n;
if (!dom) {
return null;
}
n = dom[start];
while (n) {
if (n.nodeType === 1 && (!selector || Ext.fly(n, '_matchNode').is(selector))) {
return !returnDom ? Ext.get(n) : n;
}
n = n[dir];
}
return null;
},
next: function(selector, returnDom) {
return this.matchNode('nextSibling', 'nextSibling', selector, returnDom);
},
parent: function(selector, returnDom) {
return this.matchNode('parentNode', 'parentNode', selector, returnDom);
},
position: function(pos, zIndex, x, y) {
var me = this;
if (me.dom.tagName !== 'BODY') {
if (!pos && me.isStyle(POSITION, STATIC)) {
me.setStyle(POSITION, RELATIVE);
} else if (pos) {
me.setStyle(POSITION, pos);
}
if (zIndex) {
me.setStyle(ZINDEX, zIndex);
}
if (x || y) {
me.setXY([
x || false,
y || false
]);
}
}
},
prev: function(selector, returnDom) {
return this.matchNode('previousSibling', 'previousSibling', selector, returnDom);
},
query: function(selector, asDom,
single) {
var dom = this.dom,
results, len, nlen, node, nodes, i, j;
if (!dom) {
return null;
}
asDom = (asDom !== false);
selector = selector.split(",");
if (!single) {
results = [];
}
for (i = 0 , len = selector.length; i < len; i++) {
if (typeof selector[i] === 'string') {
if (single) {
node = dom.querySelector(selector[i]);
return asDom ? node : Ext.get(node);
}
nodes = dom.querySelectorAll(selector[i]);
for (j = 0 , nlen = nodes.length; j < nlen; j++) {
results.push(asDom ? nodes[j] : Ext.get(nodes[j]));
}
}
}
return results;
},
radioCls: function(className) {
var cn = this.dom.parentNode.childNodes,
v;
className = Ext.isArray(className) ? className : [
className
];
for (var i = 0,
len = cn.length; i < len; i++) {
v = cn[i];
if (v && v.nodeType === 1) {
Ext.fly(v).removeCls(className);
}
}
return this.addCls(className);
},
redraw: function() {
var dom = this.dom,
domStyle = dom.style;
domStyle.display = 'none';
dom.offsetHeight;
domStyle.display = '';
},
remove: function() {
this.destroy();
},
removeChild: function(element) {
this.dom.removeChild(Ext.getDom(element));
return this;
},
removeCls: function(names, prefix, suffix) {
var me = this,
elementData = me.getData(),
hasNewCls, dom, map, classList, i, ln, name;
if (!names) {
return me;
}
if (!elementData.isSynchronized) {
me.synchronize();
}
dom = me.dom;
map = elementData.classMap;
classList = elementData.classList;
prefix = prefix ? prefix + SEPARATOR : '';
suffix = suffix ? SEPARATOR + suffix : '';
if (typeof names === 'string') {
names = names.split(spacesRe);
}
for (i = 0 , ln = names.length; i < ln; i++) {
name = names[i];
if (name) {
name = prefix + name + suffix;
if (map[name]) {
delete map[name];
Ext.Array.remove(classList, name);
hasNewCls = true;
}
}
}
if (hasNewCls) {
dom.className = classList.join(' ');
}
return me;
},
repaint: function() {
var me = this;
me.addCls(Ext.baseCSSPrefix + 'repaint');
Ext.defer(function() {
if (me.dom) {
Ext.fly(me.dom).removeCls(Ext.baseCSSPrefix + 'repaint');
}
}, 1);
return me;
},
replace: function(el, destroy) {
el = Ext.getDom(el);
var parentNode = el.parentNode,
id = el.id,
dom = this.dom;
if (!parentNode) {
Ext.Error.raise('Cannot replace element "' + id + '". It is not attached to a parent node.');
}
if (destroy !== false && id && Ext.cache[id]) {
parentNode.insertBefore(dom, el);
Ext.get(el).destroy();
} else {
parentNode.replaceChild(dom, el);
}
return this;
},
replaceCls: function(oldName, newName, prefix, suffix) {
var me = this,
dom, map, classList, i, ln, name,
elementData = me.getData();
if (!oldName && !newName) {
return me;
}
oldName = oldName || [];
newName = newName || [];
if (!elementData.isSynchronized) {
me.synchronize();
}
if (!suffix) {
suffix = '';
}
dom = me.dom;
map = elementData.classMap;
classList = elementData.classList;
prefix = prefix ? prefix + SEPARATOR : '';
suffix = suffix ? SEPARATOR + suffix : '';
if (typeof oldName === 'string') {
oldName = oldName.split(spacesRe);
}
if (typeof newName === 'string') {
newName = newName.split(spacesRe);
}
for (i = 0 , ln = oldName.length; i < ln; i++) {
name = prefix + oldName[i] + suffix;
if (map[name]) {
delete map[name];
Ext.Array.remove(classList, name);
}
}
for (i = 0 , ln = newName.length; i < ln; i++) {
name = prefix + newName[i] + suffix;
if (!map[name]) {
map[name] = true;
classList.push(name);
}
}
dom.className = classList.join(' ');
return me;
},
replaceWith: function(el) {
var me = this,
dom = me.dom,
parent = dom.parentNode,
cache = Ext.cache,
newDom;
me.clearListeners();
if (el.nodeType || el.dom || typeof el === 'string') {
el = Ext.get(el);
newDom = parent.insertBefore(el.dom, dom);
} else {
newDom = Ext.DomHelper.insertBefore(dom, el);
}
parent.removeChild(dom);
me.dom = newDom;
if (!me.isFly) {
delete cache[me.id];
cache[me.id = Ext.id(newDom)] = me;
}
return me;
},
resolveListenerScope: function(defaultScope) {
var component = this.component;
return component ? component.resolveListenerScope(defaultScope) : this;
},
scroll: function(direction, distance, animate) {
if (!this.isScrollable()) {
return false;
}
direction = direction.charAt(0);
var me = this,
dom = me.dom,
side = direction === 'r' || direction === 'l' ? 'left' : 'top',
scrolled = false,
currentScroll, constrainedScroll;
if (direction === 'l' || direction === 't' || direction === 'u') {
distance = -distance;
}
if (side === 'left') {
currentScroll = dom.scrollLeft;
constrainedScroll = me.constrainScrollLeft(currentScroll + distance);
} else {
currentScroll = dom.scrollTop;
constrainedScroll = me.constrainScrollTop(currentScroll + distance);
}
if (constrainedScroll !== currentScroll) {
this.scrollTo(side, constrainedScroll, animate);
scrolled = true;
}
return scrolled;
},
scrollBy: function(deltaX, deltaY, animate) {
var me = this,
dom = me.dom;
if (deltaX.length) {
animate = deltaY;
deltaY = deltaX[1];
deltaX = deltaX[0];
} else if (typeof deltaX != 'number') {
animate = deltaY;
deltaY = deltaX.y;
deltaX = deltaX.x;
}
if (deltaX) {
me.scrollTo('left', me.constrainScrollLeft(dom.scrollLeft + deltaX), animate);
}
if (deltaY) {
me.scrollTo('top', me.constrainScrollTop(dom.scrollTop + deltaY), animate);
}
return me;
},
scrollChildIntoView: function(child, hscroll) {
Ext.fly(child).scrollIntoView(this, hscroll);
},
scrollIntoView: function(container, hscroll, animate, highlight) {
container = Ext.getDom(container) || Ext.getBody().dom;
return this.doScrollIntoView(container, hscroll, animate, highlight, 'getScrollLeft', 'scrollTo');
},
scrollTo: function(side, value, animate) {
var top = topRe.test(side),
me = this,
prop = top ? 'scrollTop' : 'scrollLeft',
dom = me.dom,
animCfg;
if (!animate || !me.anim) {
dom[prop] = value;
} else {
animCfg = {
to: {}
};
animCfg.to[prop] = value;
if (Ext.isObject(animate)) {
Ext.applyIf(animCfg, animate);
}
me.animate(animCfg);
}
return me;
},
select: function(selector, composite) {
var isElementArray, elements;
if (typeof selector === "string") {
elements = this.query(selector, !composite);
} else if (selector.length === undefined) {
Ext.Error.raise("Invalid selector specified: " + selector);
} else {
elements = selector;
isElementArray = true;
}
return composite ? new Ext.CompositeElement(elements, !isElementArray) : new Ext.CompositeElementLite(elements, true);
},
selectNode: function(selector, asDom) {
return this.query(selector, asDom, true);
},
set: function(attributes, useSet) {
var me = this,
dom = me.dom,
attribute, value;
for (attribute in attributes) {
if (attributes.hasOwnProperty(attribute)) {
value = attributes[attribute];
if (attribute === 'style') {
me.applyStyles(value);
} else if (attribute === 'cls') {
dom.className = value;
} else if (useSet !== false) {
if (value === undefined) {
dom.removeAttribute(attribute);
} else {
dom.setAttribute(attribute, value);
}
} else {
dom[attribute] = value;
}
}
}
return me;
},
setBottom: function(bottom) {
this.dom.style[BOTTOM] = Element.addUnits(bottom);
return this;
},
setBorder: function(border) {
var me = this,
domStyle = me.dom.style;
if (border || border === 0) {
border = me.self.unitizeBox((border === true) ? 1 : border);
domStyle.setProperty('border-width', border, 'important');
} else {
domStyle.removeProperty('border-top-width');
domStyle.removeProperty('border-right-width');
domStyle.removeProperty('border-bottom-width');
domStyle.removeProperty('border-left-width');
}
},
setCls: function(className) {
var me = this,
elementData = me.getData(),
i, ln, name, map;
if (!elementData.isSynchronized) {
me.synchronize();
}
map = elementData.classMap;
if (typeof className === 'string') {
className = className.split(spacesRe);
}
for (i = 0 , ln = className.length; i < ln; i++) {
name = className[i];
if (!map[name]) {
map[name] = true;
}
}
elementData.classList = className.slice();
me.dom.className = className.join(' ');
},
setHeight: function(height) {
var me = this;
me.dom.style[HEIGHT] = Element.addUnits(height);
if (me.shadow || me.shim) {
me.syncUnderlays();
}
return me;
},
setHtml: function(html) {
if (this.dom) {
this.dom.innerHTML = html;
}
},
setId: function(id) {
var me = this,
currentId = me.id,
cache = Ext.cache;
if (currentId) {
delete cache[currentId];
}
me.dom.id = id;
me.id = id;
cache[id] = me;
return me;
},
setLeft: function(left) {
var me = this;
me.dom.style[LEFT] = Element.addUnits(left);
if (me.shadow || me.shim) {
me.syncUnderlays();
}
return me;
},
setLocalX: function(x) {
var me = this,
style = me.dom.style;
style.right = 'auto';
style.left = (x === null) ? 'auto' : x + 'px';
if (me.shadow || me.shim) {
me.syncUnderlays();
}
return me;
},
setLocalXY: function(x, y) {
var me = this,
style = me.dom.style;
style.right = 'auto';
if (x && x.length) {
y = x[1];
x = x[0];
}
if (x === null) {
style.left = 'auto';
} else if (x !== undefined) {
style.left = x + 'px';
}
if (y === null) {
style.top = 'auto';
} else if (y !== undefined) {
style.top = y + 'px';
}
if (me.shadow || me.shim) {
me.syncUnderlays();
}
return me;
},
setLocalY: function(y) {
var me = this;
me.dom.style.top = (y === null) ? 'auto' : y + 'px';
if (me.shadow || me.shim) {
me.syncUnderlays();
}
return me;
},
setMargin: function(margin) {
var me = this,
domStyle = me.dom.style;
if (margin || margin === 0) {
margin = me.self.unitizeBox((margin === true) ? 5 : margin);
domStyle.setProperty('margin', margin, 'important');
} else {
domStyle.removeProperty('margin-top');
domStyle.removeProperty('margin-right');
domStyle.removeProperty('margin-bottom');
domStyle.removeProperty('margin-left');
}
},
setMaxHeight: function(height) {
this.dom.style[MAX_HEIGHT] = Element.addUnits(height);
return this;
},
setMaxWidth: function(width) {
this.dom.style[MAX_WIDTH] = Element.addUnits(width);
return this;
},
setMinHeight: function(height) {
this.dom.style[MIN_HEIGHT] = Element.addUnits(height);
return this;
},
setMinWidth: function(width) {
this.dom.style[MIN_WIDTH] = Element.addUnits(width);
return this;
},
setPadding: function(padding) {
var me = this,
domStyle = me.dom.style;
if (padding || padding === 0) {
padding = me.self.unitizeBox((padding === true) ? 5 : padding);
domStyle.setProperty('padding', padding, 'important');
} else {
domStyle.removeProperty('padding-top');
domStyle.removeProperty('padding-right');
domStyle.removeProperty('padding-bottom');
domStyle.removeProperty('padding-left');
}
},
setRight: function(right) {
this.dom.style[RIGHT] = Element.addUnits(right);
return this;
},
setScrollLeft: function(left) {
this.dom.scrollLeft = left;
return this;
},
setScrollTop: function(top) {
this.dom.scrollTop = top;
return this;
},
setSize: function(width, height) {
var me = this,
style = me.dom.style;
if (Ext.isObject(width)) {
height = width.height;
width = width.width;
}
style.width = Element.addUnits(width);
style.height = Element.addUnits(height);
if (me.shadow || me.shim) {
me.syncUnderlays();
}
return me;
},
setSizeState: function(state) {
var me = this,
add, remove;
if (state === true) {
add = sizedCls;
remove = [
unsizedCls,
stretchedCls
];
} else if (state === false) {
add = unsizedCls;
remove = [
sizedCls,
stretchedCls
];
} else if (state === null) {
add = stretchedCls;
remove = [
sizedCls,
unsizedCls
];
} else {
remove = [
sizedCls,
unsizedCls,
stretchedCls
];
}
if (add) {
me.addCls(add);
}
me.removeCls(remove);
return me;
},
setStyle: function(prop, value) {
var me = this,
dom = me.dom,
hooks = me.styleHooks,
style = dom.style,
name = prop,
hook;
if (typeof name === 'string') {
hook = hooks[name];
if (!hook) {
hooks[name] = hook = {
name: Element.normalize(name)
};
}
value = (value == null) ? '' : value;
if (hook.set) {
hook.set(dom, value, me);
} else {
style[hook.name] = value;
}
if (hook.afterSet) {
hook.afterSet(dom, value, me);
}
} else {
for (name in prop) {
if (prop.hasOwnProperty(name)) {
hook = hooks[name];
if (!hook) {
hooks[name] = hook = {
name: Element.normalize(name)
};
}
value = prop[name];
value = (value == null) ? '' : value;
if (hook.set) {
hook.set(dom, value, me);
} else {
style[hook.name] = value;
}
if (hook.afterSet) {
hook.afterSet(dom, value, me);
}
}
}
}
return me;
},
setText: function(text) {
this.dom.textContent = text;
},
setTop: function(top) {
var me = this;
me.dom.style[TOP] = Element.addUnits(top);
if (me.shadow || me.shim) {
me.syncUnderlays();
}
return me;
},
setUnderlaysVisible: function(visible) {
var shadow = this.shadow,
shim = this.shim;
if (shadow && !shadow.disabled) {
if (visible) {
shadow.show();
} else {
shadow.hide();
}
}
if (shim && !shim.disabled) {
if (visible) {
shim.show();
} else {
shim.hide();
}
}
},
setVisibility: function(isVisible) {
var domStyle = this.dom.style;
if (isVisible) {
domStyle.removeProperty('visibility');
} else {
domStyle.setProperty('visibility', 'hidden', 'important');
}
},
setVisibilityMode: function(mode) {
if (mode !== 1 && mode !== 2 && mode !== 3) {
Ext.Error.raise("visibilityMode must be one of the following: " + "Ext.Element.DISPLAY, Ext.Element.VISIBILITY, or Ext.Element.OFFSETS");
}
this.getData().visibilityMode = mode;
return this;
},
setVisible: function(visible) {
var me = this,
mode = me.getVisibilityMode(),
method = visible ? 'removeCls' : 'addCls';
switch (mode) {
case Element.DISPLAY:
me.removeCls([
visibilityCls,
offsetsCls
]);
me[method](displayCls);
break;
case Element.VISIBILITY:
me.removeCls([
displayCls,
offsetsCls
]);
me[method](visibilityCls);
break;
case Element.OFFSETS:
me.removeCls([
visibilityCls,
displayCls
]);
me[method](offsetsCls);
break;
}
if (me.shadow || me.shim) {
me.setUnderlaysVisible(visible);
}
return me;
},
setWidth: function(width) {
var me = this;
me.dom.style[WIDTH] = Element.addUnits(width);
if (me.shadow || me.shim) {
me.syncUnderlays();
}
return me;
},
setX: function(x) {
return this.setXY([
x,
false
]);
},
setXY: function(xy) {
var me = this,
pts = me.translatePoints(xy),
style = me.dom.style,
pos;
me.position();
style.right = 'auto';
for (pos in pts) {
if (!isNaN(pts[pos])) {
style[pos] = pts[pos] + 'px';
}
}
if (me.shadow || me.shim) {
me.syncUnderlays();
}
return me;
},
setY: function(y) {
return this.setXY([
false,
y
]);
},
setZIndex: function(zindex) {
var me = this;
if (me.shadow) {
me.shadow.setZIndex(zindex);
}
if (me.shim) {
me.shim.setZIndex(zindex);
}
return me.setStyle('z-index', zindex);
},
show: function() {
this.setVisible(true);
return this;
},
swapCls: function(firstClass, secondClass, flag, prefix) {
if (flag === undefined) {
flag = true;
}
var me = this,
addedClass = flag ? firstClass : secondClass,
removedClass = flag ? secondClass : firstClass;
if (removedClass) {
me.removeCls(prefix ? prefix + '-' + removedClass : removedClass);
}
if (addedClass) {
me.addCls(prefix ? prefix + '-' + addedClass : addedClass);
}
return me;
},
synchronize: function() {
var me = this,
dom = me.dom,
hasClassMap = {},
className = dom.className,
classList, i, ln, name,
elementData = me.getData();
if (className && className.length > 0) {
classList = dom.className.split(classNameSplitRegex);
for (i = 0 , ln = classList.length; i < ln; i++) {
name = classList[i];
hasClassMap[name] = true;
}
} else {
classList = [];
}
elementData.classList = classList;
elementData.classMap = hasClassMap;
elementData.isSynchronized = true;
return me;
},
syncUnderlays: function() {
var me = this,
shadow = me.shadow,
shim = me.shim,
dom = me.dom,
xy, x, y, w, h;
if (me.isVisible()) {
xy = me.getXY();
x = xy[0];
y = xy[1];
w = dom.offsetWidth;
h = dom.offsetHeight;
if (shadow && !shadow.hidden) {
shadow.realign(x, y, w, h);
}
if (shim && !shim.hidden) {
shim.realign(x, y, w, h);
}
}
},
toggleCls: function(className, force) {
if (typeof force !== 'boolean') {
force = !this.hasCls(className);
}
return (force) ? this.addCls(className) : this.removeCls(className);
},
toggle: function() {
this.setVisible(!this.isVisible());
return this;
},
translate: function() {
var transformStyleName = 'webkitTransform' in DOC.createElement('div').style ? 'webkitTransform' : 'transform';
return function(x, y, z) {
this.dom.style[transformStyleName] = 'translate3d(' + (x || 0) + 'px, ' + (y || 0) + 'px, ' + (z || 0) + 'px)';
};
}(),
unwrap: function() {
var dom = this.dom,
parentNode = dom.parentNode,
grandparentNode,
activeElement = Ext.fly(Ext.Element.getActiveElement()),
resumeFocus;
if (this.contains(activeElement)) {
Ext.GlobalEvents.suspendEvent('focus');
activeElement.suspendEvent('focus', 'blur');
resumeFocus = true;
}
if (parentNode) {
grandparentNode = parentNode.parentNode;
grandparentNode.insertBefore(dom, parentNode);
grandparentNode.removeChild(parentNode);
} else {
grandparentNode = document.createDocumentFragment();
grandparentNode.appendChild(dom);
}
if (resumeFocus) {
activeElement.focus();
Ext.GlobalEvents.resumeEvent('focus');
activeElement.resumeEvent('focus', 'blur');
}
return this;
},
up: function(simpleSelector, limit, returnDom) {
return this.findParentNode(simpleSelector, limit, !returnDom);
},
update: function(html) {
return this.setHtml(html);
},
wrap: function(config, returnDom, selector) {
var me = this,
dom = me.dom,
newEl = Ext.DomHelper.insertBefore(dom, config || {
tag: "div"
}, !returnDom),
target = newEl,
activeElement = Ext.fly(Ext.Element.getActiveElement()),
resumeFocus;
if (selector) {
target = newEl.selectNode(selector, returnDom);
}
if (me.contains(activeElement)) {
Ext.GlobalEvents.suspendEvent('focus');
activeElement.suspendEvent('focus', 'blur');
resumeFocus = true;
}
target.appendChild(dom);
if (resumeFocus) {
activeElement.focus();
activeElement.resumeEvent('focus', 'blur');
Ext.GlobalEvents.resumeEvent('focus');
}
return newEl;
},
privates: {
doAddListener: function(eventName, fn, scope, options, order, caller, manager) {
var me = this,
observableDoAddListener, additiveEventName, translatedEventName;
eventName = Ext.canonicalEventName(eventName);
if (!me.blockedEvents[eventName]) {
observableDoAddListener = me.mixins.observable.doAddListener;
options = options || {};
if (me.longpressEvents[eventName]) {
me.disableTouchContextMenu();
}
if (Element.useDelegatedEvents === false) {
options.delegated = options.delegated || false;
}
if (options.translate !== false) {
additiveEventName = me.additiveEvents[eventName];
if (additiveEventName) {
options.type = eventName;
eventName = additiveEventName;
observableDoAddListener.call(me, eventName, fn, scope, options, order, caller, manager);
}
translatedEventName = me.eventMap[eventName];
if (translatedEventName) {
options.type = options.type || eventName;
eventName = translatedEventName;
}
}
observableDoAddListener.call(me, eventName, fn, scope, options, order, caller, manager);
delete options.type;
}
},
doRemoveListener: function(eventName, fn, scope) {
var me = this,
observableDoRemoveListener, translatedEventName, additiveEventName, contextMenuListenerRemover;
if (!me.blockedEvents[eventName]) {
observableDoRemoveListener = me.mixins.observable.doRemoveListener;
if (me.longpressEvents[eventName]) {
contextMenuListenerRemover = this._contextMenuListenerRemover;
if (contextMenuListenerRemover) {
contextMenuListenerRemover.destroy();
}
}
additiveEventName = me.additiveEvents[eventName];
if (additiveEventName) {
eventName = additiveEventName;
observableDoRemoveListener.call(me, eventName, fn, scope);
}
translatedEventName = me.eventMap[eventName];
if (translatedEventName) {
observableDoRemoveListener.call(me, translatedEventName, fn, scope);
}
observableDoRemoveListener.call(me, eventName, fn, scope);
}
},
_initEvent: function(eventName) {
return (this.events[eventName] = new Ext.dom.ElementEvent(this, eventName));
},
_getPublisher: function(eventName) {
var Publisher = Ext.event.publisher.Publisher,
publisher = Publisher.publishersByEvent[eventName];
if (!publisher || (this.dom === window && eventName === 'resize')) {
publisher = Publisher.publishers.dom;
}
return publisher;
}
},
deprecated: {
'5.0': {
methods: {
cssTranslate: null,
getHTML: 'getHtml',
getOuterHeight: null,
getOuterWidth: null,
getPageBox: function(getRegion) {
var me = this,
dom = me.dom,
isDoc = dom.nodeName === 'BODY',
w = isDoc ? Element.getViewportWidth() : dom.offsetWidth,
h = isDoc ? Element.getViewportHeight() : dom.offsetHeight,
xy = me.getXY(),
t = xy[1],
r = xy[0] + w,
b = xy[1] + h,
l = xy[0];
if (getRegion) {
return new Ext.util.Region(t, r, b, l);
} else {
return {
left: l,
top: t,
width: w,
height: h,
right: r,
bottom: b
};
}
},
getScrollParent: null,
isDescendent: null,
isTransparent: function(prop) {
var value = this.getStyle(prop);
return value ? transparentRe.test(value) : false;
},
purgeAllListeners: 'clearListeners',
removeAllListeners: 'clearListeners',
setHTML: 'setHtml',
setTopLeft: null
}
}
}
};
}, function(Element) {
var DOC = document,
prototype = Element.prototype,
supports = Ext.supports,
pointerdown = 'pointerdown',
pointermove = 'pointermove',
pointerup = 'pointerup',
pointercancel = 'pointercancel',
MSPointerDown = 'MSPointerDown',
MSPointerMove = 'MSPointerMove',
MSPointerUp = 'MSPointerUp',
MSPointerCancel = 'MSPointerCancel',
mousedown = 'mousedown',
mousemove = 'mousemove',
mouseup = 'mouseup',
mouseover = 'mouseover',
mouseout = 'mouseout',
mouseenter = 'mouseenter',
mouseleave = 'mouseleave',
touchstart = 'touchstart',
touchmove = 'touchmove',
touchend = 'touchend',
touchcancel = 'touchcancel',
click = 'click',
dblclick = 'dblclick',
tap = 'tap',
doubletap = 'doubletap',
eventMap = prototype.eventMap = {},
additiveEvents = prototype.additiveEvents = {},
oldId = Ext.id,
eventOptions;
Ext.id = function(obj, prefix) {
var el = Ext.getDom(obj, true),
sandboxPrefix, id;
if (!el) {
id = oldId(obj, prefix);
} else if (!(id = el.id)) {
id = oldId(null, prefix || Element.prototype.identifiablePrefix);
if (Ext.isSandboxed) {
sandboxPrefix = Ext.sandboxPrefix || (Ext.sandboxPrefix = Ext.sandboxName.toLowerCase() + '-');
id = sandboxPrefix + id;
}
el.id = id;
}
return id;
};
if (supports.PointerEvents) {
eventMap[mousedown] = pointerdown;
eventMap[mousemove] = pointermove;
eventMap[mouseup] = pointerup;
eventMap[touchstart] = pointerdown;
eventMap[touchmove] = pointermove;
eventMap[touchend] = pointerup;
eventMap[touchcancel] = pointercancel;
eventMap[click] = tap;
eventMap[dblclick] = doubletap;
eventMap[mouseover] = 'pointerover';
eventMap[mouseout] = 'pointerout';
eventMap[mouseenter] = 'pointerenter';
eventMap[mouseleave] = 'pointerleave';
} else if (supports.MSPointerEvents) {
eventMap[pointerdown] = MSPointerDown;
eventMap[pointermove] = MSPointerMove;
eventMap[pointerup] = MSPointerUp;
eventMap[pointercancel] = MSPointerCancel;
eventMap[mousedown] = MSPointerDown;
eventMap[mousemove] = MSPointerMove;
eventMap[mouseup] = MSPointerUp;
eventMap[touchstart] = MSPointerDown;
eventMap[touchmove] = MSPointerMove;
eventMap[touchend] = MSPointerUp;
eventMap[touchcancel] = MSPointerCancel;
eventMap[click] = tap;
eventMap[dblclick] = doubletap;
eventMap[mouseover] = 'MSPointerOver';
eventMap[mouseout] = 'MSPointerOut';
} else if (supports.TouchEvents) {
eventMap[pointerdown] = touchstart;
eventMap[pointermove] = touchmove;
eventMap[pointerup] = touchend;
eventMap[pointercancel] = touchcancel;
eventMap[mousedown] = touchstart;
eventMap[mousemove] = touchmove;
eventMap[mouseup] = touchend;
eventMap[click] = tap;
eventMap[dblclick] = doubletap;
if (Ext.isWebKit && Ext.os.is.Desktop) {
eventMap[touchstart] = mousedown;
eventMap[touchmove] = mousemove;
eventMap[touchend] = mouseup;
eventMap[touchcancel] = mouseup;
additiveEvents[mousedown] = mousedown;
additiveEvents[mousemove] = mousemove;
additiveEvents[mouseup] = mouseup;
additiveEvents[touchstart] = touchstart;
additiveEvents[touchmove] = touchmove;
additiveEvents[touchend] = touchend;
additiveEvents[touchcancel] = touchcancel;
additiveEvents[pointerdown] = mousedown;
additiveEvents[pointermove] = mousemove;
additiveEvents[pointerup] = mouseup;
additiveEvents[pointercancel] = mouseup;
}
} else {
eventMap[pointerdown] = mousedown;
eventMap[pointermove] = mousemove;
eventMap[pointerup] = mouseup;
eventMap[pointercancel] = mouseup;
eventMap[touchstart] = mousedown;
eventMap[touchmove] = mousemove;
eventMap[touchend] = mouseup;
eventMap[touchcancel] = mouseup;
}
if (Ext.isWebKit) {
eventMap.transitionend = Ext.browser.getVendorProperyName('transitionEnd');
eventMap.animationstart = Ext.browser.getVendorProperyName('animationStart');
eventMap.animationend = Ext.browser.getVendorProperyName('animationEnd');
}
if (!Ext.supports.MouseWheel && !Ext.isOpera) {
eventMap.mousewheel = 'DOMMouseScroll';
}
eventOptions = prototype.$eventOptions = Ext.Object.chain(prototype.$eventOptions);
eventOptions.translate = eventOptions.capture = eventOptions.delegate = eventOptions.delegated = eventOptions.stopEvent = eventOptions.preventDefault = eventOptions.stopPropagation =
eventOptions.element = 1;
prototype.getTrueXY = prototype.getXY;
Ext.select = Element.select;
Ext.query = Element.query;
Ext.apply(Ext, {
get: function(element) {
return Element.get(element);
},
getDom: function(el) {
if (!el || !DOC) {
return null;
}
return el.dom || (typeof el === 'string' ? Ext.getElementById(el) : el);
},
getBody: function() {
if (!Ext._bodyEl) {
if (!DOC.body) {
throw new Error("[Ext.getBody] document.body does not yet exist");
}
Ext._bodyEl = Ext.get(DOC.body);
}
return Ext._bodyEl;
},
getHead: function() {
if (!Ext._headEl) {
Ext._headEl = Ext.get(DOC.head || DOC.getElementsByTagName('head')[0]);
}
return Ext._headEl;
},
getDoc: function() {
if (!Ext._docEl) {
Ext._docEl = Ext.get(DOC);
}
return Ext._docEl;
},
getWin: function() {
if (!Ext._winEl) {
Ext._winEl = Ext.get(window);
}
return Ext._winEl;
},
removeNode: function(node) {
node = node.dom || node;
var id = node && node.id,
el = Ext.cache[id],
parent;
if (el) {
el.destroy();
} else if (node && (node.nodeType === 3 || node.tagName.toUpperCase() !== 'BODY')) {
parent = node.parentNode;
if (parent) {
parent.removeChild(node);
}
}
}
});
Ext.isGarbage = function(dom) {
return dom &&
dom.nodeType === 1 && dom.tagName !== 'BODY' && dom.tagName !== 'HTML' &&
(!dom.parentNode ||
(!dom.offsetParent &&
((Ext.isIE8 ? DOC.all[dom.id] : DOC.getElementById(dom.id)) !== dom) &&
!(Ext.detachedBodyEl && Ext.detachedBodyEl.isAncestor(dom))));
};
});
Ext.define('Ext.util.Filter', {
isFilter: true,
config: {
property: null,
value: null,
filterFn: null,
id: null,
anyMatch: false,
exactMatch: false,
caseSensitive: false,
disabled: false,
disableOnEmpty: false,
operator: null,
root: null,
serializer: null,
convert: null
},
scope: null,
$configStrict: false,
statics: {
createFilterFn: function(filters) {
if (!filters) {
return Ext.returnTrue;
}
return function(candidate) {
var items = filters.isCollection ? filters.items : filters,
length = items.length,
match = true,
i, filter;
for (i = 0; match && i < length; i++) {
filter = items[i];
if (!filter.getDisabled()) {
match = filter.filter(candidate);
}
}
return match;
};
},
isInvalid: function(cfg) {
if (!cfg.filterFn) {
if (!cfg.property) {
return 'A Filter requires either a property or a filterFn to be set';
}
if (!cfg.hasOwnProperty('value') && !cfg.operator) {
return 'A Filter requires either a property and value, or a filterFn to be set';
}
}
return false;
}
},
constructor: function(config) {
var warn = Ext.util.Filter.isInvalid(config);
if (warn) {
Ext.log.warn(warn);
}
this.initConfig(config);
},
preventConvert: {
'in': 1
},
filter: function(item) {
var me = this,
filterFn = me._filterFn || me.getFilterFn(),
convert = me.getConvert(),
value = me._value;
me._filterValue = value;
me.isDateValue = Ext.isDate(value);
if (me.isDateValue) {
me.dateValue = value.getTime();
}
if (convert && !me.preventConvert[me.getOperator()]) {
me._filterValue = convert.call(me.scope || me, value);
}
return filterFn.call(me.scope || me, item);
},
getId: function() {
var id = this._id;
if (!id) {
id = this.getProperty();
if (!id) {
id = Ext.id(null, 'ext-filter-');
}
this._id = id;
}
return id;
},
getFilterFn: function() {
var me = this,
filterFn = me._filterFn,
operator;
if (!filterFn) {
operator = me.getOperator();
if (operator) {
filterFn = me.operatorFns[operator];
} else {
filterFn = me.createRegexFilter();
}
me._filterFn = filterFn;
}
return filterFn;
},
createRegexFilter: function() {
var me = this,
anyMatch = !!me.getAnyMatch(),
exact = !!me.getExactMatch(),
value = me.getValue(),
matcher = Ext.String.createRegex(value, !anyMatch,
!anyMatch && exact,
!me.getCaseSensitive());
return function(item) {
var val = me.getPropertyValue(item);
return matcher ? matcher.test(val) : (val == null);
};
},
getPropertyValue: function(item) {
var root = this._root,
value = (root == null) ? item : item[root];
return value[this._property];
},
getState: function() {
var config = this.getInitialConfig(),
result = {},
name;
for (name in config) {
if (config.hasOwnProperty(name)) {
result[name] = config[name];
}
}
delete result.root;
result.value = this.getValue();
return result;
},
getScope: function() {
return this.scope;
},
serialize: function() {
var result = this.getState(),
serializer = this.getSerializer();
delete result.id;
delete result.serializer;
if (serializer) {
serializer.call(this, result);
}
return result;
},
updateOperator: function() {
this._filterFn = null;
},
updateValue: function(value) {
this._filterFn = null;
if (this.getDisableOnEmpty()) {
this.setDisabled(Ext.isEmpty(value));
}
},
updateDisableOnEmpty: function(disableOnEmpty) {
var disabled = false;
if (disableOnEmpty) {
disabled = Ext.isEmpty(this.getValue());
}
this.setDisabled(disabled);
},
privates: {
getCandidateValue: function(candidate, v, preventCoerce) {
var me = this,
convert = me._convert,
result = me.getPropertyValue(candidate);
if (convert) {
result = convert.call(me.scope || me, result);
} else if (!preventCoerce) {
result = Ext.coerce(result, v);
}
return result;
}
}
}, function() {
var prototype = this.prototype,
operatorFns = (prototype.operatorFns = {
"<": function(candidate) {
var v = this._filterValue;
return this.getCandidateValue(candidate, v) < v;
},
"<=": function(candidate) {
var v = this._filterValue;
return this.getCandidateValue(candidate, v) <= v;
},
"=": function(candidate) {
var me = this,
v = me._filterValue;
candidate = me.getCandidateValue(candidate, v);
if (me.isDateValue && candidate instanceof Date) {
candidate = candidate.getTime();
v = me.dateValue;
}
return candidate == v;
},
"===": function(candidate) {
var me = this,
v = me._filterValue;
candidate = me.getCandidateValue(candidate, v, true);
if (me.isDateValue && candidate instanceof Date) {
candidate = candidate.getTime();
v = me.dateValue;
}
return candidate === v;
},
">=": function(candidate) {
var v = this._filterValue;
return this.getCandidateValue(candidate, v) >= v;
},
">": function(candidate) {
var v = this._filterValue;
return this.getCandidateValue(candidate, v) > v;
},
"!=": function(candidate) {
var me = this,
v = me._filterValue;
candidate = me.getCandidateValue(candidate, v);
if (me.isDateValue && candidate instanceof Date) {
candidate = candidate.getTime();
v = me.dateValue;
}
return candidate != v;
},
"!==": function(candidate) {
var me = this,
v = me._filterValue;
candidate = me.getCandidateValue(candidate, v, true);
if (me.isDateValue && candidate instanceof Date) {
candidate = candidate.getTime();
v = me.dateValue;
}
return candidate !== v;
},
"in": function(candidate) {
var v = this._filterValue;
return Ext.Array.contains(v, this.getCandidateValue(candidate, v));
},
like: function(candidate) {
var v = this._filterValue;
return v && this.getCandidateValue(candidate, v).toLowerCase().indexOf(v.toLowerCase()) > -1;
}
});
operatorFns['=='] = operatorFns['='];
operatorFns.gt = operatorFns['>'];
operatorFns.ge = operatorFns['>='];
operatorFns.lt = operatorFns['<'];
operatorFns.le = operatorFns['<='];
operatorFns.eq = operatorFns['='];
operatorFns.ne = operatorFns['!='];
});
Ext.define('Ext.util.Observable', {
extend: 'Ext.mixin.Observable',
$applyConfigs: true
}, function(Observable) {
var Super = Ext.mixin.Observable;
Observable.releaseCapture = Super.releaseCapture;
Observable.capture = Super.capture;
Observable.captureArgs = Super.captureArgs;
Observable.observe = Observable.observeClass = Super.observe;
});
Ext.define('Ext.util.AbstractMixedCollection', {
requires: [
'Ext.util.Filter'
],
mixins: {
observable: 'Ext.util.Observable'
},
isMixedCollection: true,
generation: 0,
indexGeneration: 0,
constructor: function(allowFunctions, keyFn) {
var me = this;
if (arguments.length === 1 && Ext.isObject(allowFunctions)) {
me.initialConfig = allowFunctions;
Ext.apply(me, allowFunctions);
} else
{
me.allowFunctions = allowFunctions === true;
if (keyFn) {
me.getKey = keyFn;
}
me.initialConfig = {
allowFunctions: me.allowFunctions,
getKey: me.getKey
};
}
me.items = [];
me.map = {};
me.keys = [];
me.indexMap = {};
me.length = 0;
me.mixins.observable.constructor.call(me);
},
allowFunctions: false,
add: function(key, obj) {
var len = this.length,
out;
if (arguments.length === 1) {
out = this.insert(len, key);
} else {
out = this.insert(len, key, obj);
}
return out;
},
getKey: function(o) {
return o.id;
},
replace: function(key, o) {
var me = this,
old, index;
if (arguments.length == 1) {
o = arguments[0];
key = me.getKey(o);
}
old = me.map[key];
if (typeof key == 'undefined' || key === null || typeof old == 'undefined') {
return me.add(key, o);
}
me.generation++;
index = me.indexOfKey(key);
me.items[index] = o;
me.map[key] = o;
if (me.hasListeners.replace) {
me.fireEvent('replace', key, old, o);
}
return o;
},
updateKey: function(oldKey, newKey) {
var me = this,
map = me.map,
index = me.indexOfKey(oldKey),
indexMap = me.indexMap,
item;
if (index > -1) {
item = map[oldKey];
delete map[oldKey];
delete indexMap[oldKey];
map[newKey] = item;
indexMap[newKey] = index;
me.keys[index] = newKey;
me.indexGeneration = ++me.generation;
}
},
addAll: function(objs) {
var me = this,
key;
if (arguments.length > 1 || Ext.isArray(objs)) {
me.insert(me.length, arguments.length > 1 ? arguments : objs);
} else {
for (key in objs) {
if (objs.hasOwnProperty(key)) {
if (me.allowFunctions || typeof objs[key] != 'function') {
me.add(key, objs[key]);
}
}
}
}
},
each: function(fn, scope) {
var items = Ext.Array.push([], this.items),
i = 0,
len = items.length,
item;
for (; i < len; i++) {
item = items[i];
if (fn.call(scope || item, item, i, len) === false) {
break;
}
}
},
eachKey: function(fn, scope) {
var keys = this.keys,
items = this.items,
i = 0,
len = keys.length;
for (; i < len; i++) {
fn.call(scope || window, keys[i], items[i], i, len);
}
},
findBy: function(fn, scope) {
var keys = this.keys,
items = this.items,
i = 0,
len = items.length;
for (; i < len; i++) {
if (fn.call(scope || window, items[i], keys[i])) {
return items[i];
}
}
return null;
},
find: function() {
if (Ext.isDefined(Ext.global.console)) {
Ext.global.console.warn('Ext.util.MixedCollection: find has been deprecated. Use findBy instead.');
}
return this.findBy.apply(this, arguments);
},
insert: function(index, key, obj) {
var out;
if (Ext.isIterable(key)) {
out = this.doInsert(index, key, obj);
} else {
if (arguments.length > 2) {
out = this.doInsert(index, [
key
], [
obj
]);
} else {
out = this.doInsert(index, [
key
]);
}
out = out[0];
}
return out;
},
doInsert: function(index, keys, objects) {
var me = this,
itemKey, removeIndex, i,
len = keys.length,
deDupedLen = len,
fireAdd = me.hasListeners.add,
syncIndices,
newKeys = {},
passedDuplicates, oldKeys, oldObjects;
if (objects != null) {
me.useLinearSearch = true;
} else
{
objects = keys;
keys = new Array(len);
for (i = 0; i < len; i++) {
keys[i] = this.getKey(objects[i]);
}
}
me.suspendEvents();
for (i = 0; i < len; i++) {
itemKey = keys[i];
removeIndex = me.indexOfKey(itemKey);
if (removeIndex !== -1) {
if (removeIndex < index) {
index--;
}
me.removeAt(removeIndex);
}
if (itemKey != null) {
if (newKeys[itemKey] != null) {
passedDuplicates = true;
deDupedLen--;
}
newKeys[itemKey] = i;
}
}
me.resumeEvents();
if (passedDuplicates) {
oldKeys = keys;
oldObjects = objects;
keys = new Array(deDupedLen);
objects = new Array(deDupedLen);
i = 0;
for (itemKey in newKeys) {
keys[i] = oldKeys[newKeys[itemKey]];
objects[i] = oldObjects[newKeys[itemKey]];
i++;
}
len = deDupedLen;
}
syncIndices = index === me.length && me.indexGeneration === me.generation;
Ext.Array.insert(me.items, index, objects);
Ext.Array.insert(me.keys, index, keys);
me.length += len;
me.generation++;
if (syncIndices) {
me.indexGeneration = me.generation;
}
for (i = 0; i < len; i++ , index++) {
itemKey = keys[i];
if (itemKey != null) {
me.map[itemKey] = objects[i];
if (syncIndices) {
me.indexMap[itemKey] = index;
}
}
if (fireAdd) {
me.fireEvent('add', index, objects[i], itemKey);
}
}
return objects;
},
remove: function(o) {
var me = this,
removeKey, index;
if (!me.useLinearSearch && (removeKey = me.getKey(o))) {
index = me.indexOfKey(removeKey);
} else
{
index = Ext.Array.indexOf(me.items, o);
}
return (index === -1) ? false : me.removeAt(index);
},
removeAll: function(items) {
var me = this,
i;
if (items || me.hasListeners.remove) {
if (items) {
for (i = items.length - 1; i >= 0; --i) {
me.remove(items[i]);
}
} else {
while (me.length) {
me.removeAt(0);
}
}
} else {
me.length = me.items.length = me.keys.length = 0;
me.map = {};
me.indexMap = {};
me.generation++;
me.indexGeneration = me.generation;
}
},
removeAt: function(index) {
var me = this,
o, key;
if (index < me.length && index >= 0) {
me.length--;
o = me.items[index];
Ext.Array.erase(me.items, index, 1);
key = me.keys[index];
if (typeof key != 'undefined') {
delete me.map[key];
}
Ext.Array.erase(me.keys, index, 1);
if (me.hasListeners.remove) {
me.fireEvent('remove', o, key);
}
me.generation++;
return o;
}
return false;
},
removeRange: function(index, removeCount) {
var me = this,
o, key, i, limit, syncIndices, trimming;
if (index < me.length && index >= 0) {
if (!removeCount) {
removeCount = 1;
}
limit = Math.min(index + removeCount, me.length);
removeCount = limit - index;
trimming = limit === me.length;
syncIndices = trimming && me.indexGeneration === me.generation;
for (i = index; i < limit; i++) {
key = me.keys[i];
if (key != null) {
delete me.map[key];
if (syncIndices) {
delete me.indexMap[key];
}
}
}
o = me.items[i - 1];
me.length -= removeCount;
me.generation++;
if (syncIndices) {
me.indexGeneration = me.generation;
}
if (trimming) {
me.items.length = me.keys.length = me.length;
} else {
me.items.splice(index, removeCount);
me.keys.splice(index, removeCount);
}
return o;
}
return false;
},
removeAtKey: function(key) {
var me = this,
keys = me.keys,
i;
if (key == null) {
for (i = keys.length - 1; i >= 0; i--) {
if (keys[i] == null) {
me.removeAt(i);
}
}
} else
{
return me.removeAt(me.indexOfKey(key));
}
},
getCount: function() {
return this.length;
},
indexOf: function(o) {
var me = this,
key;
if (o != null) {
if (!me.useLinearSearch && (key = me.getKey(o))) {
return this.indexOfKey(key);
}
return Ext.Array.indexOf(me.items, o);
}
return -1;
},
indexOfKey: function(key) {
if (!this.map.hasOwnProperty(key)) {
return -1;
}
if (this.indexGeneration !== this.generation) {
this.rebuildIndexMap();
}
return this.indexMap[key];
},
rebuildIndexMap: function() {
var me = this,
indexMap = me.indexMap = {},
keys = me.keys,
len = keys.length,
i;
for (i = 0; i < len; i++) {
indexMap[keys[i]] = i;
}
me.indexGeneration = me.generation;
},
get: function(key) {
var me = this,
mk = me.map[key],
item = mk !== undefined ? mk : (typeof key == 'number') ? me.items[key] : undefined;
return typeof item != 'function' || me.allowFunctions ? item : null;
},
getAt: function(index) {
return this.items[index];
},
getByKey: function(key) {
return this.map[key];
},
contains: function(o) {
var me = this,
key;
if (o != null) {
if (!me.useLinearSearch && (key = me.getKey(o))) {
return this.map[key] != null;
}
return Ext.Array.indexOf(this.items, o) !== -1;
}
return false;
},
containsKey: function(key) {
return this.map.hasOwnProperty(key);
},
clear: function() {
var me = this;
if (me.generation) {
me.length = 0;
me.items = [];
me.keys = [];
me.map = {};
me.indexMap = {};
me.generation++;
me.indexGeneration = me.generation;
}
if (me.hasListeners.clear) {
me.fireEvent('clear');
}
},
first: function() {
return this.items[0];
},
last: function() {
return this.items[this.length - 1];
},
sum: function(property, root, start, end) {
var values = this.extractValues(property, root),
length = values.length,
sum = 0,
i;
start = start || 0;
end = (end || end === 0) ? end : length - 1;
for (i = start; i <= end; i++) {
sum += values[i];
}
return sum;
},
collect: function(property, root, allowNull) {
var values = this.extractValues(property, root),
length = values.length,
hits = {},
unique = [],
value, strValue, i;
for (i = 0; i < length; i++) {
value = values[i];
strValue = String(value);
if ((allowNull || !Ext.isEmpty(value)) && !hits[strValue]) {
hits[strValue] = true;
unique.push(value);
}
}
return unique;
},
extractValues: function(property, root) {
var values = this.items;
if (root) {
values = Ext.Array.pluck(values, root);
}
return Ext.Array.pluck(values, property);
},
hasRange: function(start, end) {
return (end < this.length);
},
getRange: function(start, end) {
var me = this,
items = me.items,
range = [],
len = items.length,
tmp, reverse;
if (len < 1) {
return range;
}
if (start > end) {
reverse = true;
tmp = start;
start = end;
end = tmp;
}
if (start < 0) {
start = 0;
}
if (end == null || end >= len) {
end = len - 1;
}
range = items.slice(start, end + 1);
if (reverse && range.length) {
range.reverse();
}
return range;
},
filter: function(property, value, anyMatch, caseSensitive) {
var filters = [];
if (Ext.isString(property)) {
filters.push(new Ext.util.Filter({
property: property,
value: value,
anyMatch: anyMatch,
caseSensitive: caseSensitive
}));
} else if (Ext.isArray(property) || property instanceof Ext.util.Filter) {
filters = filters.concat(property);
}
return this.filterBy(Ext.util.Filter.createFilterFn(filters));
},
filterBy: function(fn, scope) {
var me = this,
newMC = new me.self(me.initialConfig),
keys = me.keys,
items = me.items,
length = items.length,
i;
newMC.getKey = me.getKey;
for (i = 0; i < length; i++) {
if (fn.call(scope || me, items[i], keys[i])) {
newMC.add(keys[i], items[i]);
}
}
newMC.useLinearSearch = me.useLinearSearch;
return newMC;
},
findIndex: function(property, value, start, anyMatch, caseSensitive) {
if (Ext.isEmpty(value, false)) {
return -1;
}
value = this.createValueMatcher(value, anyMatch, caseSensitive);
return this.findIndexBy(function(o) {
return o && value.test(o[property]);
}, null, start);
},
findIndexBy: function(fn, scope, start) {
var me = this,
keys = me.keys,
items = me.items,
i = start || 0,
len = items.length;
for (; i < len; i++) {
if (fn.call(scope || me, items[i], keys[i])) {
return i;
}
}
return -1;
},
createValueMatcher: function(value, anyMatch, caseSensitive, exactMatch) {
if (!value.exec) {
var er = Ext.String.escapeRegex;
value = String(value);
if (anyMatch === true) {
value = er(value);
} else {
value = '^' + er(value);
if (exactMatch === true) {
value += '$';
}
}
value = new RegExp(value, caseSensitive ? '' : 'i');
}
return value;
},
clone: function() {
var me = this,
copy = new me.self(me.initialConfig);
copy.add(me.keys, me.items);
copy.useLinearSearch = me.useLinearSearch;
return copy;
}
});
Ext.define('Ext.util.Sorter', {
isSorter: true,
config: {
property: null,
sorterFn: null,
root: null,
transform: null,
direction: "ASC",
id: undefined
},
statics: {
createComparator: function(sorters, nextFn) {
nextFn = nextFn || 0;
return function(lhs, rhs) {
var items = sorters.isCollection ? sorters.items : sorters,
n = items.length,
comp, i;
for (i = 0; i < n; ++i) {
comp = items[i].sort(lhs, rhs);
if (comp) {
return comp;
}
}
return nextFn && nextFn(lhs, rhs);
};
}
},
multiplier: 1,
constructor: function(config) {
if (config && !this.isGrouper) {
if (!config.property === !config.sorterFn) {
Ext.Error.raise("A Sorter requires either a property or a sorterFn.");
}
}
this.initConfig(config);
},
getId: function() {
var id = this._id;
if (!id) {
id = this.getProperty();
if (!id) {
id = Ext.id(null, 'ext-sorter-');
}
this._id = id;
}
return id;
},
sort: function(lhs, rhs) {
return this.multiplier * this.sortFn(lhs, rhs);
},
sortFn: function(item1, item2) {
var me = this,
transform = me._transform,
root = me._root,
property = me._property,
lhs, rhs;
if (root) {
item1 = item1[root];
item2 = item2[root];
}
lhs = item1[property];
rhs = item2[property];
if (transform) {
lhs = transform(lhs);
rhs = transform(rhs);
}
return (lhs > rhs) ? 1 : (lhs < rhs ? -1 : 0);
},
applyDirection: function(direction) {
return direction ? direction : 'ASC';
},
updateDirection: function(direction) {
this.multiplier = (direction.toUpperCase() === "DESC") ? -1 : 1;
},
updateProperty: function(property) {
if (property) {
delete this.sortFn;
}
},
updateSorterFn: function(sorterFn) {
this.sortFn = sorterFn;
},
toggle: function() {
this.setDirection(Ext.String.toggle(this.getDirection(), "ASC", "DESC"));
},
getState: function() {
return {
root: this.getRoot(),
property: this.getProperty(),
direction: this.getDirection()
};
},
serialize: function() {
return {
property: this.getProperty(),
direction: this.getDirection()
};
}
});
Ext.define("Ext.util.Sortable", {
isSortable: true,
$configPrefixed: false,
$configStrict: false,
config: {
sorters: null
},
defaultSortDirection: "ASC",
requires: [
'Ext.util.Sorter'
],
multiSortLimit: 3,
statics: {
createComparator: function(sorters) {
return sorters && sorters.length ? function(r1, r2) {
var result = sorters[0].sort(r1, r2),
length = sorters.length,
i = 1;
for (; !result && i < length; i++) {
result = sorters[i].sort.call(this, r1, r2);
}
return result;
} : function() {
return 0;
};
}
},
applySorters: function(sorters) {
var me = this,
sortersCollection = me.getSorters() || new Ext.util.MixedCollection(false, Ext.returnId);
if (sorters) {
sortersCollection.addAll(me.decodeSorters(sorters));
}
return sortersCollection;
},
sort: function(sorters, direction, insertionPosition, doSort) {
var me = this,
sorter, overFlow,
currentSorters = me.getSorters();
if (!currentSorters) {
me.setSorters(null);
currentSorters = me.getSorters();
}
if (Ext.isArray(sorters)) {
doSort = insertionPosition;
insertionPosition = direction;
} else if (Ext.isObject(sorters)) {
sorters = [
sorters
];
doSort = insertionPosition;
insertionPosition = direction;
} else if (Ext.isString(sorters)) {
sorter = currentSorters.get(sorters);
if (!sorter) {
sorter = {
property: sorters,
direction: direction
};
} else if (direction == null) {
sorter.toggle();
} else {
sorter.setDirection(direction);
}
sorters = [
sorter
];
}
if (sorters && sorters.length) {
sorters = me.decodeSorters(sorters);
switch (insertionPosition) {
case "multi":
currentSorters.insert(0, sorters[0]);
overFlow = currentSorters.getCount() - me.multiSortLimit;
if (overFlow > 0) {
currentSorters.removeRange(me.multiSortLimit, overFlow);
};
break;
case "prepend":
currentSorters.insert(0, sorters);
break;
case "append":
currentSorters.addAll(sorters);
break;
case undefined:
case null:
case "replace":
currentSorters.clear();
currentSorters.addAll(sorters);
break;
default:
Ext.Error.raise('Sorter insertion point must be "multi", "prepend", "append" or "replace"');
}
}
if (doSort !== false) {
me.fireEvent('beforesort', me, sorters);
me.onBeforeSort(sorters);
if (me.getSorterCount()) {
me.doSort(me.generateComparator());
}
}
return sorters;
},
getSorterCount: function() {
return this.getSorters().items.length;
},
generateComparator: function() {
var sorters = this.getSorters().getRange();
return sorters.length ? this.createComparator(sorters) : this.emptyComparator;
},
emptyComparator: function() {
return 0;
},
onBeforeSort: Ext.emptyFn,
decodeSorters: function(sorters) {
if (!Ext.isArray(sorters)) {
if (sorters === undefined) {
sorters = [];
} else {
sorters = [
sorters
];
}
}
var length = sorters.length,
Sorter = Ext.util.Sorter,
model = this.getModel ? this.getModel() : this.model,
field, config, i;
for (i = 0; i < length; i++) {
config = sorters[i];
if (!(config instanceof Sorter)) {
if (Ext.isString(config)) {
config = {
property: config
};
}
Ext.applyIf(config, {
root: this.sortRoot,
direction: "ASC"
});
if (config.fn) {
config.sorterFn = config.fn;
}
if (typeof config == 'function') {
config = {
sorterFn: config
};
}
if (model && !config.transform) {
field = model.getField(config.property);
config.transform = field && field.sortType !== Ext.identityFn ? field.sortType : undefined;
}
sorters[i] = new Ext.util.Sorter(config);
}
}
return sorters;
},
getFirstSorter: function() {
var sorters = this.getSorters().items,
len = sorters.length,
i = 0,
sorter;
for (; i < len; ++i) {
sorter = sorters[i];
if (!sorter.isGrouper) {
return sorter;
}
}
return null;
}
}, function() {
this.prototype.createComparator = this.createComparator;
});
Ext.define('Ext.util.MixedCollection', {
extend: 'Ext.util.AbstractMixedCollection',
mixins: {
sortable: 'Ext.util.Sortable'
},
constructor: function() {
this.initConfig();
this.callParent(arguments);
},
doSort: function(sorterFn) {
this.sortBy(sorterFn);
},
_sort: function(property, dir, fn) {
var me = this,
i, len,
dsc = String(dir).toUpperCase() == 'DESC' ? -1 : 1,
c = [],
keys = me.keys,
items = me.items,
o;
fn = fn || function(a, b) {
return a - b;
};
for (i = 0 , len = items.length; i < len; i++) {
c[c.length] = {
key: keys[i],
value: items[i],
index: i
};
}
Ext.Array.sort(c, function(a, b) {
return fn(a[property], b[property]) * dsc ||
(a.index < b.index ? -1 : 1);
});
for (i = 0 , len = c.length; i < len; i++) {
o = c[i];
items[i] = o.value;
keys[i] = o.key;
me.indexMap[o.key] = i;
}
me.generation++;
me.indexGeneration = me.generation;
me.fireEvent('sort', me);
},
sortBy: function(sorterFn) {
var me = this,
items = me.items,
item,
keys = me.keys,
key,
length = items.length,
i;
for (i = 0; i < length; i++) {
items[i].$extCollectionIndex = i;
}
Ext.Array.sort(items, function(a, b) {
return sorterFn(a, b) ||
(a.$extCollectionIndex < b.$extCollectionIndex ? -1 : 1);
});
for (i = 0; i < length; i++) {
item = items[i];
key = me.getKey(item);
keys[i] = key;
me.indexMap[key] = i;
delete items.$extCollectionIndex;
}
me.generation++;
me.indexGeneration = me.generation;
me.fireEvent('sort', me, items, keys);
},
findInsertionIndex: function(newItem, sorterFn) {
var me = this,
items = me.items,
start = 0,
end = items.length - 1,
middle, comparison;
if (!sorterFn) {
sorterFn = me.generateComparator();
}
while (start <= end) {
middle = (start + end) >> 1;
comparison = sorterFn(newItem, items[middle]);
if (comparison >= 0) {
start = middle + 1;
} else if (comparison < 0) {
end = middle - 1;
}
}
return start;
},
reorder: function(mapping) {
var me = this,
items = me.items,
index = 0,
length = items.length,
order = [],
remaining = [],
oldIndex;
me.suspendEvents();
for (oldIndex in mapping) {
order[mapping[oldIndex]] = items[oldIndex];
}
for (index = 0; index < length; index++) {
if (mapping[index] == undefined) {
remaining.push(items[index]);
}
}
for (index = 0; index < length; index++) {
if (order[index] == undefined) {
order[index] = remaining.shift();
}
}
me.clear();
me.addAll(order);
me.resumeEvents();
me.fireEvent('sort', me);
},
sortByKey: function(dir, fn) {
this._sort('key', dir, fn || function(a, b) {
var v1 = String(a).toUpperCase(),
v2 = String(b).toUpperCase();
return v1 > v2 ? 1 : (v1 < v2 ? -1 : 0);
});
}
});
Ext.define('Ext.util.TaskRunner', {
interval: 10,
timerId: null,
constructor: function(interval) {
var me = this;
if (typeof interval == 'number') {
me.interval = interval;
} else if (interval) {
Ext.apply(me, interval);
}
me.tasks = [];
me.timerFn = Ext.Function.bind(me.onTick, me);
},
newTask: function(config) {
var task = new Ext.util.TaskRunner.Task(config);
task.manager = this;
return task;
},
start: function(task) {
var me = this,
now = Ext.Date.now();
if (!task.pending) {
me.tasks.push(task);
task.pending = true;
}
task.stopped = false;
task.taskStartTime = now;
task.taskRunTime = task.fireOnStart !== false ? 0 : task.taskStartTime;
task.taskRunCount = 0;
if (!me.firing) {
if (task.fireOnStart !== false) {
me.startTimer(0, now);
} else {
me.startTimer(task.interval, now);
}
}
return task;
},
stop: function(task) {
if (!task.stopped) {
task.stopped = true;
if (task.onStop) {
task.onStop.call(task.scope || task, task);
}
}
return task;
},
stopAll: function() {
Ext.each(this.tasks, this.stop, this);
},
firing: false,
nextExpires: 1.0E99,
onTick: function() {
var me = this,
tasks = me.tasks,
now = Ext.Date.now(),
nextExpires = 1.0E99,
len = tasks.length,
globalEvents = Ext.GlobalEvents,
expires, newTasks, i, task, rt, remove, fireIdleEvent;
me.timerId = null;
me.firing = true;
for (i = 0; i < len || i < (len = tasks.length); ++i) {
task = tasks[i];
if (!(remove = task.stopped)) {
expires = task.taskRunTime + task.interval;
if (expires <= now) {
rt = 1;
if (task.hasOwnProperty('fireIdleEvent')) {
fireIdleEvent = task.fireIdleEvent;
} else {
fireIdleEvent = me.fireIdleEvent;
}
try {
rt = task.run.apply(task.scope || task, task.args || [
++task.taskRunCount
]);
} catch (taskError) {
try {
Ext.log({
fn: task.run,
prefix: 'Error while running task',
stack: taskError.stack,
msg: taskError,
level: 'error'
});
if (task.onError) {
rt = task.onError.call(task.scope || task, task, taskError);
}
} catch (ignore) {}
}
task.taskRunTime = now;
if (rt === false || task.taskRunCount === task.repeat) {
me.stop(task);
remove = true;
} else {
remove = task.stopped;
expires = now + task.interval;
}
}
if (!remove && task.duration && task.duration <= (now - task.taskStartTime)) {
me.stop(task);
remove = true;
}
}
if (remove) {
task.pending = false;
if (!newTasks) {
newTasks = tasks.slice(0, i);
}
} else
{
if (newTasks) {
newTasks.push(task);
}
if (nextExpires > expires) {
nextExpires = expires;
}
}
}
if (newTasks) {
me.tasks = newTasks;
}
me.firing = false;
if (me.tasks.length) {
me.startTimer(nextExpires - now, Ext.Date.now());
}
if (fireIdleEvent !== false && globalEvents.hasListeners.idle) {
globalEvents.fireEvent('idle');
}
},
startTimer: function(timeout, now) {
var me = this,
expires = now + timeout,
timerId = me.timerId;
if (timerId && me.nextExpires - expires > me.interval) {
clearTimeout(timerId);
timerId = null;
}
if (!timerId) {
if (timeout < me.interval) {
timeout = me.interval;
}
me.timerId = Ext.defer(me.timerFn, timeout);
me.nextExpires = expires;
}
}
}, function() {
var me = this,
proto = me.prototype;
proto.destroy = proto.stopAll;
me.Task = new Ext.Class({
isTask: true,
stopped: true,
fireOnStart: false,
constructor: function(config) {
Ext.apply(this, config);
},
restart: function(interval) {
if (interval !== undefined) {
this.interval = interval;
}
this.manager.start(this);
},
start: function(interval) {
if (this.stopped) {
this.restart(interval);
}
},
stop: function() {
this.manager.stop(this);
}
});
proto = me.Task.prototype;
proto.destroy = proto.stop;
});
Ext.define('Ext.fx.target.Target', {
isAnimTarget: true,
constructor: function(target) {
this.target = target;
this.id = this.getId();
},
getId: function() {
return this.target.id;
},
remove: function() {
Ext.destroy(this.target);
}
});
Ext.define('Ext.fx.target.Element', {
extend: 'Ext.fx.target.Target',
type: 'element',
getElVal: function(el, attr, val) {
if (val === undefined) {
if (attr === 'x') {
val = el.getX();
} else if (attr === 'y') {
val = el.getY();
} else if (attr === 'scrollTop') {
val = el.getScroll().top;
} else if (attr === 'scrollLeft') {
val = el.getScroll().left;
} else if (attr === 'height') {
val = el.getHeight();
} else if (attr === 'width') {
val = el.getWidth();
} else {
val = el.getStyle(attr);
}
}
return val;
},
getAttr: function(attr, val) {
var el = this.target;
return [
[
el,
this.getElVal(el, attr, val)
]
];
},
setAttr: function(targetData) {
var ln = targetData.length,
attrs, attr, o, i, j, ln2;
for (i = 0; i < ln; i++) {
attrs = targetData[i].attrs;
for (attr in attrs) {
if (attrs.hasOwnProperty(attr)) {
ln2 = attrs[attr].length;
for (j = 0; j < ln2; j++) {
o = attrs[attr][j];
this.setElVal(o[0], attr, o[1]);
}
}
}
}
},
setElVal: function(element, attr, value) {
if (attr === 'x') {
element.setX(value);
} else if (attr === 'y') {
element.setY(value);
} else if (attr === 'scrollTop') {
element.scrollTo('top', value);
} else if (attr === 'scrollLeft') {
element.scrollTo('left', value);
} else if (attr === 'width') {
element.setWidth(value);
} else if (attr === 'height') {
element.setHeight(value);
} else {
element.setStyle(attr, value);
}
}
});
Ext.define('Ext.fx.target.ElementCSS', {
extend: 'Ext.fx.target.Element',
setAttr: function(targetData, isFirstFrame) {
var cssArr = {
attrs: [],
duration: [],
easing: []
},
ln = targetData.length,
cleanerFn = function() {
this.setStyle(Ext.supports.CSS3Prefix + 'TransitionProperty', null);
this.setStyle(Ext.supports.CSS3Prefix + 'TransitionDuration', null);
this.setStyle(Ext.supports.CSS3Prefix + 'TransitionTimingFunction', null);
},
single = {
single: true
},
attributes, attrs, attr, easing, duration, o, i, j, ln2;
for (i = 0; i < ln; i++) {
attrs = targetData[i];
duration = attrs.duration;
easing = attrs.easing;
attrs = attrs.attrs;
for (attr in attrs) {
if (Ext.Array.indexOf(cssArr.attrs, attr) == -1) {
cssArr.attrs.push(attr.replace(/[A-Z]/g, function(v) {
return '-' + v.toLowerCase();
}));
cssArr.duration.push(duration + 'ms');
cssArr.easing.push(easing);
}
}
}
attributes = cssArr.attrs.join(',');
duration = cssArr.duration.join(',');
easing = cssArr.easing.join(', ');
for (i = 0; i < ln; i++) {
attrs = targetData[i].attrs;
for (attr in attrs) {
ln2 = attrs[attr].length;
for (j = 0; j < ln2; j++) {
o = attrs[attr][j];
o[0].setStyle(Ext.supports.CSS3Prefix + 'TransitionProperty', isFirstFrame ? '' : attributes);
o[0].setStyle(Ext.supports.CSS3Prefix + 'TransitionDuration', isFirstFrame ? '' : duration);
o[0].setStyle(Ext.supports.CSS3Prefix + 'TransitionTimingFunction', isFirstFrame ? '' : easing);
o[0].setStyle(attr, o[1]);
if (isFirstFrame) {
o = o[0].dom.offsetWidth;
} else {
o[0].on(Ext.supports.CSS3TransitionEnd, cleanerFn, o[0], single);
}
}
}
}
}
});
Ext.define('Ext.fx.target.CompositeElement', {
extend: 'Ext.fx.target.Element',
isComposite: true,
constructor: function(target) {
target.id = target.id || Ext.id(null, 'ext-composite-');
this.callParent([
target
]);
},
getAttr: function(attr, val) {
var out = [],
target = this.target,
elements = target.elements,
length = elements.length,
i, el;
for (i = 0; i < length; i++) {
el = elements[i];
if (el) {
el = target.getElement(el);
out.push([
el,
this.getElVal(el, attr, val)
]);
}
}
return out;
},
setAttr: function(targetData) {
var target = this.target,
ln = targetData.length,
elements = target.elements,
ln3 = elements.length,
value, k, attrs, attr, el, i, j, ln2;
for (i = 0; i < ln; i++) {
attrs = targetData[i].attrs;
for (attr in attrs) {
if (attrs.hasOwnProperty(attr)) {
ln2 = attrs[attr].length;
for (j = 0; j < ln2; j++) {
value = attrs[attr][j][1];
for (k = 0; k < ln3; ++k) {
el = elements[k];
if (el) {
el = target.getElement(el);
this.setElVal(el, attr, value);
}
}
}
}
}
}
},
remove: function() {
this.target.destroy();
}
});
Ext.define('Ext.fx.target.CompositeElementCSS', {
extend: 'Ext.fx.target.CompositeElement',
requires: [
'Ext.fx.target.ElementCSS'
],
setAttr: function() {
return Ext.fx.target.ElementCSS.prototype.setAttr.apply(this, arguments);
}
});
Ext.define('Ext.fx.target.Sprite', {
extend: 'Ext.fx.target.Target',
type: 'draw',
getFromPrim: function(sprite, attr) {
var obj;
switch (attr) {
case 'rotate':
case 'rotation':
obj = sprite.attr.rotation;
return {
x: obj.x || 0,
y: obj.y || 0,
degrees: obj.degrees || 0
};
case 'scale':
case 'scaling':
obj = sprite.attr.scaling;
return {
x: obj.x || 1,
y: obj.y || 1,
cx: obj.cx || 0,
cy: obj.cy || 0
};
case 'translate':
case 'translation':
obj = sprite.attr.translation;
return {
x: obj.x || 0,
y: obj.y || 0
};
default:
return sprite.attr[attr];
}
},
getAttr: function(attr, val) {
return [
[
this.target,
val !== undefined ? val : this.getFromPrim(this.target, attr)
]
];
},
setAttr: function(targetData) {
var ln = targetData.length,
spriteArr = [],
attrsConf, attr, attrArr, attrs, sprite, idx, value, i, j, x, y, ln2;
for (i = 0; i < ln; i++) {
attrsConf = targetData[i].attrs;
for (attr in attrsConf) {
attrArr = attrsConf[attr];
ln2 = attrArr.length;
for (j = 0; j < ln2; j++) {
sprite = attrArr[j][0];
attrs = attrArr[j][1];
if (attr === 'translate' || attr === 'translation') {
value = {
x: attrs.x,
y: attrs.y
};
} else if (attr === 'rotate' || attr === 'rotation') {
x = attrs.x;
if (isNaN(x)) {
x = null;
}
y = attrs.y;
if (isNaN(y)) {
y = null;
}
value = {
degrees: attrs.degrees,
x: x,
y: y
};
} else if (attr === 'scale' || attr === 'scaling') {
x = attrs.x;
if (isNaN(x)) {
x = null;
}
y = attrs.y;
if (isNaN(y)) {
y = null;
}
value = {
x: x,
y: y,
cx: attrs.cx,
cy: attrs.cy
};
} else if (attr === 'width' || attr === 'height' || attr === 'x' || attr === 'y') {
value = parseFloat(attrs);
} else {
value = attrs;
}
idx = Ext.Array.indexOf(spriteArr, sprite);
if (idx === -1) {
spriteArr.push([
sprite,
{}
]);
idx = spriteArr.length - 1;
}
spriteArr[idx][1][attr] = value;
}
}
}
ln = spriteArr.length;
for (i = 0; i < ln; i++) {
spriteArr[i][0].setAttributes(spriteArr[i][1]);
}
this.target.redraw();
}
});
Ext.define('Ext.fx.target.CompositeSprite', {
extend: 'Ext.fx.target.Sprite',
getAttr: function(attr, val) {
var out = [],
sprites = [].concat(this.target.items),
length = sprites.length,
i, sprite;
for (i = 0; i < length; i++) {
sprite = sprites[i];
out.push([
sprite,
val !== undefined ? val : this.getFromPrim(sprite, attr)
]);
}
return out;
}
});
Ext.define('Ext.fx.target.Component', {
extend: 'Ext.fx.target.Target',
type: 'component',
getPropMethod: {
top: function() {
return this.getPosition(true)[1];
},
left: function() {
return this.getPosition(true)[0];
},
x: function() {
return this.getPosition()[0];
},
y: function() {
return this.getPosition()[1];
},
height: function() {
return this.getHeight();
},
width: function() {
return this.getWidth();
},
opacity: function() {
return this.el.getStyle('opacity');
}
},
setMethods: {
top: 'setPosition',
left: 'setPosition',
x: 'setPagePosition',
y: 'setPagePosition',
height: 'setSize',
width: 'setSize',
opacity: 'setOpacity'
},
getAttr: function(attr, val) {
return [
[
this.target,
val !== undefined ? val : this.getPropMethod[attr].call(this.target)
]
];
},
setAttr: function(targetData, isFirstFrame, isLastFrame) {
var me = this,
ln = targetData.length,
attrs, attr, o, i, j, targets, left, top, w, h,
methodsToCall = {},
methodProps;
for (i = 0; i < ln; i++) {
attrs = targetData[i].attrs;
for (attr in attrs) {
targets = attrs[attr].length;
for (j = 0; j < targets; j++) {
o = attrs[attr][j];
methodProps = methodsToCall[me.setMethods[attr]] || (methodsToCall[me.setMethods[attr]] = {});
methodProps.target = o[0];
methodProps[attr] = o[1];
}
}
if (methodsToCall.setPosition) {
o = methodsToCall.setPosition;
left = (o.left === undefined) ? undefined : parseFloat(o.left);
top = (o.top === undefined) ? undefined : parseFloat(o.top);
o.target.setPosition(left, top);
}
if (methodsToCall.setPagePosition) {
o = methodsToCall.setPagePosition;
o.target.setPagePosition(o.x, o.y);
}
if (methodsToCall.setSize) {
o = methodsToCall.setSize;
w = (o.width === undefined) ? o.target.getWidth() : parseFloat(o.width);
h = (o.height === undefined) ? o.target.getHeight() : parseFloat(o.height);
o.target.el.setSize(w, h);
if (isLastFrame || me.dynamic) {
Ext.GlobalEvents.on({
idle: Ext.Function.bind(o.target.setSize, o.target, [
w,
h
]),
single: true
});
}
}
if (methodsToCall.setOpacity) {
o = methodsToCall.setOpacity;
o.target.el.setStyle('opacity', o.opacity);
}
}
}
});
Ext.define('Ext.fx.Queue', {
requires: [
'Ext.util.HashMap'
],
constructor: function() {
this.targets = new Ext.util.HashMap();
this.fxQueue = {};
},
getFxDefaults: function(targetId) {
var target = this.targets.get(targetId);
if (target) {
return target.fxDefaults;
}
return {};
},
setFxDefaults: function(targetId, obj) {
var target = this.targets.get(targetId);
if (target) {
target.fxDefaults = Ext.apply(target.fxDefaults || {}, obj);
}
},
stopAnimation: function(targetId) {
var me = this,
queue = me.getFxQueue(targetId),
ln = queue.length;
while (ln) {
queue[ln - 1].end();
ln--;
}
},
getActiveAnimation: function(targetId) {
var queue = this.getFxQueue(targetId);
return (queue && !!queue.length) ? queue[0] : false;
},
hasFxBlock: function(targetId) {
var queue = this.getFxQueue(targetId);
return queue && queue[0] && queue[0].block;
},
getFxQueue: function(targetId) {
if (!targetId) {
return false;
}
var me = this,
queue = me.fxQueue[targetId],
target = me.targets.get(targetId);
if (!target) {
return false;
}
if (!queue) {
me.fxQueue[targetId] = [];
if (target.type !== 'element') {
target.target.on('destroy', function() {
me.fxQueue[targetId] = [];
});
}
}
return me.fxQueue[targetId];
},
queueFx: function(anim) {
var me = this,
target = anim.target,
queue, ln;
if (!target) {
return;
}
queue = me.getFxQueue(target.getId());
ln = queue.length;
if (ln) {
if (anim.concurrent) {
anim.paused = false;
} else {
queue[ln - 1].on('afteranimate', function() {
anim.paused = false;
});
}
} else {
anim.paused = false;
}
anim.on('afteranimate', function() {
Ext.Array.remove(queue, anim);
if (queue.length === 0) {
me.targets.remove(anim.target);
}
if (anim.remove) {
if (target.type === 'element') {
var el = Ext.get(target.id);
if (el) {
el.destroy();
}
}
}
}, me, {
single: true
});
queue.push(anim);
}
});
Ext.define('Ext.fx.Manager', {
singleton: true,
requires: [
'Ext.util.MixedCollection',
'Ext.util.TaskRunner',
'Ext.fx.target.Element',
'Ext.fx.target.ElementCSS',
'Ext.fx.target.CompositeElement',
'Ext.fx.target.CompositeElementCSS',
'Ext.fx.target.Sprite',
'Ext.fx.target.CompositeSprite',
'Ext.fx.target.Component'
],
mixins: {
queue: 'Ext.fx.Queue'
},
constructor: function() {
var me = this;
me.items = new Ext.util.MixedCollection();
me.targetArr = {};
me.mixins.queue.constructor.call(me);
me.taskRunner = new Ext.util.TaskRunner();
},
interval: 16,
forceJS: true,
createTarget: function(target) {
var me = this,
useCSS3 = !me.forceJS && Ext.supports.Transitions,
targetObj;
me.useCSS3 = useCSS3;
if (target) {
if (target.tagName || Ext.isString(target) || target.isFly) {
target = Ext.get(target);
targetObj = new Ext.fx.target['Element' + (useCSS3 ? 'CSS' : '')](target);
}
else if (target.dom) {
targetObj = new Ext.fx.target['Element' + (useCSS3 ? 'CSS' : '')](target);
}
else if (target.isComposite) {
targetObj = new Ext.fx.target['CompositeElement' + (useCSS3 ? 'CSS' : '')](target);
}
else if (target.isSprite) {
targetObj = new Ext.fx.target.Sprite(target);
}
else if (target.isCompositeSprite) {
targetObj = new Ext.fx.target.CompositeSprite(target);
}
else if (target.isComponent) {
targetObj = new Ext.fx.target.Component(target);
} else if (target.isAnimTarget) {
return target;
} else {
return null;
}
me.targets.add(targetObj);
return targetObj;
} else {
return null;
}
},
addAnim: function(anim) {
var me = this,
items = me.items,
task = me.task;
items.add(anim.id, anim);
if (!task && items.length) {
task = me.task = {
run: me.runner,
interval: me.interval,
scope: me
};
me.taskRunner.start(task);
}
},
removeAnim: function(anim) {
var me = this,
items = me.items,
task = me.task;
items.removeAtKey(anim.id);
if (task && !items.length) {
me.taskRunner.stop(task);
delete me.task;
}
},
runner: function() {
var me = this,
items = me.items.getRange(),
i = 0,
len = items.length,
anim;
me.targetArr = {};
me.timestamp = new Date();
for (; i < len; i++) {
anim = items[i];
if (anim.isReady()) {
me.startAnim(anim);
}
}
for (i = 0; i < len; i++) {
anim = items[i];
if (anim.isRunning()) {
me.runAnim(anim);
}
}
me.applyPendingAttrs();
},
startAnim: function(anim) {
anim.start(this.timestamp);
},
runAnim: function(anim, forceEnd) {
if (!anim) {
return;
}
var me = this,
useCSS3 = me.useCSS3 && anim.target.type === 'element',
elapsedTime = me.timestamp - anim.startTime,
lastFrame = (elapsedTime >= anim.duration),
target, o;
if (forceEnd) {
elapsedTime = anim.duration;
lastFrame = true;
}
target = this.collectTargetData(anim, elapsedTime, useCSS3, lastFrame);
if (useCSS3) {
anim.target.setAttr(target.anims[anim.id].attributes, true);
me.collectTargetData(anim, anim.duration, useCSS3, lastFrame);
anim.paused = true;
target = anim.target.target;
if (anim.target.isComposite) {
target = anim.target.target.last();
}
o = {};
o[Ext.supports.CSS3TransitionEnd] = anim.lastFrame;
o.scope = anim;
o.single = true;
target.on(o);
}
return target;
},
jumpToEnd: function(anim) {
var target = this.runAnim(anim, true);
this.applyAnimAttrs(target, target.anims[anim.id]);
},
collectTargetData: function(anim, elapsedTime, useCSS3, isLastFrame) {
var targetId = anim.target.getId(),
target = this.targetArr[targetId];
if (!target) {
target = this.targetArr[targetId] = {
id: targetId,
el: anim.target,
anims: {}
};
}
target.anims[anim.id] = {
id: anim.id,
anim: anim,
elapsed: elapsedTime,
isLastFrame: isLastFrame,
attributes: [
{
duration: anim.duration,
easing: (useCSS3 && anim.reverse) ? anim.easingFn.reverse().toCSS3() : anim.easing,
attrs: anim.runAnim(elapsedTime)
}
]
};
return target;
},
applyAnimAttrs: function(target, animWrap) {
var anim = animWrap.anim;
if (animWrap.attributes && anim.isRunning()) {
target.el.setAttr(animWrap.attributes, false, animWrap.isLastFrame);
if (animWrap.isLastFrame) {
anim.lastFrame();
}
}
},
applyPendingAttrs: function() {
var targetArr = this.targetArr,
target, targetId, animWrap, anim, animId;
for (targetId in targetArr) {
if (targetArr.hasOwnProperty(targetId)) {
target = targetArr[targetId];
for (animId in target.anims) {
if (target.anims.hasOwnProperty(animId)) {
animWrap = target.anims[animId];
anim = animWrap.anim;
if (animWrap.attributes && anim.isRunning()) {
target.el.setAttr(animWrap.attributes, false, animWrap.isLastFrame);
if (animWrap.isLastFrame) {
anim.lastFrame();
}
}
}
}
}
}
}
});
Ext.define('Ext.fx.Animator', {
mixins: {
observable: 'Ext.util.Observable'
},
requires: [
'Ext.fx.Manager'
],
isAnimator: true,
duration: 250,
delay: 0,
delayStart: 0,
dynamic: false,
easing: 'ease',
running: false,
paused: false,
damper: 1,
iterations: 1,
currentIteration: 0,
keyframeStep: 0,
animKeyFramesRE: /^(from|to|\d+%?)$/,
constructor: function(config) {
var me = this;
config = Ext.apply(me, config || {});
me.config = config;
me.id = Ext.id(null, 'ext-animator-');
me.mixins.observable.constructor.call(me, config);
me.timeline = [];
me.createTimeline(me.keyframes);
if (me.target) {
me.applyAnimator(me.target);
Ext.fx.Manager.addAnim(me);
}
},
sorter: function(a, b) {
return a.pct - b.pct;
},
createTimeline: function(keyframes) {
var me = this,
attrs = [],
to = me.to || {},
duration = me.duration,
prevMs, ms, i, ln, pct, attr;
for (pct in keyframes) {
if (keyframes.hasOwnProperty(pct) && me.animKeyFramesRE.test(pct)) {
attr = {
attrs: Ext.apply(keyframes[pct], to)
};
if (pct === "from") {
pct = 0;
} else if (pct === "to") {
pct = 100;
}
attr.pct = parseInt(pct, 10);
attrs.push(attr);
}
}
Ext.Array.sort(attrs, me.sorter);
ln = attrs.length;
for (i = 0; i < ln; i++) {
prevMs = (attrs[i - 1]) ? duration * (attrs[i - 1].pct / 100) : 0;
ms = duration * (attrs[i].pct / 100);
me.timeline.push({
duration: ms - prevMs,
attrs: attrs[i].attrs
});
}
},
applyAnimator: function(target) {
var me = this,
anims = [],
timeline = me.timeline,
ln = timeline.length,
anim, easing, damper, attrs, i;
if (me.fireEvent('beforeanimate', me) !== false) {
for (i = 0; i < ln; i++) {
anim = timeline[i];
attrs = anim.attrs;
easing = attrs.easing || me.easing;
damper = attrs.damper || me.damper;
delete attrs.easing;
delete attrs.damper;
anim = new Ext.fx.Anim({
target: target,
easing: easing,
damper: damper,
duration: anim.duration,
paused: true,
to: attrs
});
anims.push(anim);
}
me.animations = anims;
me.target = anim.target;
for (i = 0; i < ln - 1; i++) {
anim = anims[i];
anim.nextAnim = anims[i + 1];
anim.on('afteranimate', function() {
this.nextAnim.paused = false;
});
anim.on('afteranimate', function() {
this.fireEvent('keyframe', this, ++this.keyframeStep);
}, me);
}
anims[ln - 1].on('afteranimate', function() {
this.lastFrame();
}, me);
}
},
start: function(startTime) {
var me = this,
delay = me.delay,
delayStart = me.delayStart,
delayDelta;
if (delay) {
if (!delayStart) {
me.delayStart = startTime;
return;
} else {
delayDelta = startTime - delayStart;
if (delayDelta < delay) {
return;
} else {
startTime = new Date(delayStart.getTime() + delay);
}
}
}
if (me.fireEvent('beforeanimate', me) !== false) {
me.startTime = startTime;
me.running = true;
me.animations[me.keyframeStep].paused = false;
}
},
lastFrame: function() {
var me = this,
iter = me.iterations,
iterCount = me.currentIteration;
iterCount++;
if (iterCount < iter) {
me.startTime = new Date();
me.currentIteration = iterCount;
me.keyframeStep = 0;
me.applyAnimator(me.target);
me.animations[me.keyframeStep].paused = false;
} else {
me.currentIteration = 0;
me.end();
}
},
end: function() {
var me = this;
me.fireEvent('afteranimate', me, me.startTime, new Date() - me.startTime);
},
isReady: function() {
return this.paused === false && this.running === false && this.iterations > 0;
},
isRunning: function() {
return false;
}
});
Ext.define('Ext.fx.CubicBezier', {
singleton: true,
cubicBezierAtTime: function(t, p1x, p1y, p2x, p2y, duration) {
var cx = 3 * p1x,
bx = 3 * (p2x - p1x) - cx,
ax = 1 - cx - bx,
cy = 3 * p1y,
by = 3 * (p2y - p1y) - cy,
ay = 1 - cy - by;
function sampleCurveX(t) {
return ((ax * t + bx) * t + cx) * t;
}
function solve(x, epsilon) {
var t = solveCurveX(x, epsilon);
return ((ay * t + by) * t + cy) * t;
}
function solveCurveX(x, epsilon) {
var t0, t1, t2, x2, d2, i;
for (t2 = x , i = 0; i < 8; i++) {
x2 = sampleCurveX(t2) - x;
if (Math.abs(x2) < epsilon) {
return t2;
}
d2 = (3 * ax * t2 + 2 * bx) * t2 + cx;
if (Math.abs(d2) < 1.0E-6) {
break;
}
t2 = t2 - x2 / d2;
}
t0 = 0;
t1 = 1;
t2 = x;
if (t2 < t0) {
return t0;
}
if (t2 > t1) {
return t1;
}
while (t0 < t1) {
x2 = sampleCurveX(t2);
if (Math.abs(x2 - x) < epsilon) {
return t2;
}
if (x > x2) {
t0 = t2;
} else {
t1 = t2;
}
t2 = (t1 - t0) / 2 + t0;
}
return t2;
}
return solve(t, 1 / (200 * duration));
},
cubicBezier: function(x1, y1, x2, y2) {
var fn = function(pos) {
return Ext.fx.CubicBezier.cubicBezierAtTime(pos, x1, y1, x2, y2, 1);
};
fn.toCSS3 = function() {
return 'cubic-bezier(' + [
x1,
y1,
x2,
y2
].join(',') + ')';
};
fn.reverse = function() {
return Ext.fx.CubicBezier.cubicBezier(1 - x2, 1 - y2, 1 - x1, 1 - y1);
};
return fn;
}
});
Ext.define('Ext.fx.Easing', function() {
var math = Math,
pi = math.PI,
pow = math.pow,
sin = math.sin,
sqrt = math.sqrt,
abs = math.abs,
backInSeed = 1.70158;
return {
requires: [
'Ext.fx.CubicBezier'
],
singleton: true,
linear: Ext.identityFn,
ease: function(n) {
var q = 0.07813 - n / 2,
Q = sqrt(0.0066 + q * q),
x = Q - q,
X = pow(abs(x), 1 / 3) * (x < 0 ? -1 : 1),
y = -Q - q,
Y = pow(abs(y), 1 / 3) * (y < 0 ? -1 : 1),
t = X + Y + 0.25;
return pow(1 - t, 2) * 3 * t * 0.1 + (1 - t) * 3 * t * t + t * t * t;
},
easeIn: function(n) {
return pow(n, 1.7);
},
easeOut: function(n) {
return pow(n, 0.48);
},
easeInOut: function(n) {
var q = 0.48 - n / 1.04,
Q = sqrt(0.1734 + q * q),
x = Q - q,
X = pow(abs(x), 1 / 3) * (x < 0 ? -1 : 1),
y = -Q - q,
Y = pow(abs(y), 1 / 3) * (y < 0 ? -1 : 1),
t = X + Y + 0.5;
return (1 - t) * 3 * t * t + t * t * t;
},
backIn: function(n) {
return n * n * ((backInSeed + 1) * n - backInSeed);
},
backOut: function(n) {
n = n - 1;
return n * n * ((backInSeed + 1) * n + backInSeed) + 1;
},
elasticIn: function(n) {
if (n === 0 || n === 1) {
return n;
}
var p = 0.3,
s = p / 4;
return pow(2, -10 * n) * sin((n - s) * (2 * pi) / p) + 1;
},
elasticOut: function(n) {
return 1 - Ext.fx.Easing.elasticIn(1 - n);
},
bounceIn: function(n) {
return 1 - Ext.fx.Easing.bounceOut(1 - n);
},
bounceOut: function(n) {
var s = 7.5625,
p = 2.75,
l;
if (n < (1 / p)) {
l = s * n * n;
} else {
if (n < (2 / p)) {
n -= (1.5 / p);
l = s * n * n + 0.75;
} else {
if (n < (2.5 / p)) {
n -= (2.25 / p);
l = s * n * n + 0.9375;
} else {
n -= (2.625 / p);
l = s * n * n + 0.984375;
}
}
}
return l;
}
};
}, function(me) {
var Easing = me.self,
proto = Easing.prototype;
Easing.addMembers({
'back-in': proto.backIn,
'back-out': proto.backOut,
'ease-in': proto.easeIn,
'ease-out': proto.easeOut,
'elastic-in': proto.elasticIn,
'elastic-out': proto.elasticOut,
'bounce-in': proto.bounceIn,
'bounce-out': proto.bounceOut,
'ease-in-out': proto.easeInOut
});
});
Ext.define('Ext.fx.DrawPath', {
singleton: true,
pathToStringRE: /,?([achlmqrstvxz]),?/gi,
pathCommandRE: /([achlmqstvz])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig,
pathValuesRE: /(-?\d*\.?\d*(?:e[-+]?\d+)?)\s*,?\s*/ig,
stopsRE: /^(\d+%?)$/,
radian: Math.PI / 180,
is: function(o, type) {
type = String(type).toLowerCase();
return (type == "object" && o === Object(o)) || (type == "undefined" && typeof o == type) || (type == "null" && o === null) || (type == "array" && Array.isArray && Array.isArray(o)) || (Object.prototype.toString.call(o).toLowerCase().slice(8, -1)) == type;
},
path2string: function() {
return this.join(",").replace(Ext.fx.DrawPath.pathToStringRE, "$1");
},
pathToString: function(arrayPath) {
return arrayPath.join(",").replace(Ext.fx.DrawPath.pathToStringRE, "$1");
},
parsePathString: function(pathString) {
if (!pathString) {
return null;
}
var paramCounts = {
a: 7,
c: 6,
h: 1,
l: 2,
m: 2,
q: 4,
s: 4,
t: 2,
v: 1,
z: 0
},
data = [],
me = this;
if (me.is(pathString, "array") && me.is(pathString[0], "array")) {
data = me.pathClone(pathString);
}
if (!data.length) {
String(pathString).replace(me.pathCommandRE, function(a, b, c) {
var params = [],
name = b.toLowerCase();
c.replace(me.pathValuesRE, function(a, b) {
if (b) {
params.push(+b);
}
});
if (name == "m" && params.length > 2) {
data.push([
b
].concat(Ext.Array.splice(params, 0, 2)));
name = "l";
b = (b == "m") ? "l" : "L";
}
while (params.length >= paramCounts[name]) {
data.push([
b
].concat(Ext.Array.splice(params, 0, paramCounts[name])));
if (!paramCounts[name]) {
break;
}
}
});
}
data.toString = me.path2string;
return data;
},
pathClone: function(pathArray) {
var res = [],
j, jj, i, ii;
if (!this.is(pathArray, "array") || !this.is(pathArray && pathArray[0], "array")) {
pathArray = this.parsePathString(pathArray);
}
for (i = 0 , ii = pathArray.length; i < ii; i++) {
res[i] = [];
for (j = 0 , jj = pathArray[i].length; j < jj; j++) {
res[i][j] = pathArray[i][j];
}
}
res.toString = this.path2string;
return res;
},
pathToAbsolute: function(pathArray) {
if (!this.is(pathArray, "array") || !this.is(pathArray && pathArray[0], "array")) {
pathArray = this.parsePathString(pathArray);
}
var res = [],
x = 0,
y = 0,
mx = 0,
my = 0,
i = 0,
ln = pathArray.length,
r, pathSegment, j, ln2;
if (ln && pathArray[0][0] == "M") {
x = +pathArray[0][1];
y = +pathArray[0][2];
mx = x;
my = y;
i++;
res[0] = [
"M",
x,
y
];
}
for (; i < ln; i++) {
r = res[i] = [];
pathSegment = pathArray[i];
if (pathSegment[0] != pathSegment[0].toUpperCase()) {
r[0] = pathSegment[0].toUpperCase();
switch (r[0]) {
case "A":
r[1] = pathSegment[1];
r[2] = pathSegment[2];
r[3] = pathSegment[3];
r[4] = pathSegment[4];
r[5] = pathSegment[5];
r[6] = +(pathSegment[6] + x);
r[7] = +(pathSegment[7] + y);
break;
case "V":
r[1] = +pathSegment[1] + y;
break;
case "H":
r[1] = +pathSegment[1] + x;
break;
case "M":
mx = +pathSegment[1] + x;
my = +pathSegment[2] + y;
default:
j = 1;
ln2 = pathSegment.length;
for (; j < ln2; j++) {
r[j] = +pathSegment[j] + ((j % 2) ? x : y);
};
}
} else {
j = 0;
ln2 = pathSegment.length;
for (; j < ln2; j++) {
res[i][j] = pathSegment[j];
}
}
switch (r[0]) {
case "Z":
x = mx;
y = my;
break;
case "H":
x = r[1];
break;
case "V":
y = r[1];
break;
case "M":
pathSegment = res[i];
ln2 = pathSegment.length;
mx = pathSegment[ln2 - 2];
my = pathSegment[ln2 - 1];
default:
pathSegment = res[i];
ln2 = pathSegment.length;
x = pathSegment[ln2 - 2];
y = pathSegment[ln2 - 1];
}
}
res.toString = this.path2string;
return res;
},
interpolatePaths: function(path, path2) {
var me = this,
p = me.pathToAbsolute(path),
p2 = me.pathToAbsolute(path2),
attrs = {
x: 0,
y: 0,
bx: 0,
by: 0,
X: 0,
Y: 0,
qx: null,
qy: null
},
attrs2 = {
x: 0,
y: 0,
bx: 0,
by: 0,
X: 0,
Y: 0,
qx: null,
qy: null
},
fixArc = function(pp, i) {
if (pp[i].length > 7) {
pp[i].shift();
var pi = pp[i];
while (pi.length) {
Ext.Array.splice(pp, i++, 0, [
"C"
].concat(Ext.Array.splice(pi, 0, 6)));
}
Ext.Array.erase(pp, i, 1);
ii = Math.max(p.length, p2.length || 0);
}
},
fixM = function(path1, path2, a1, a2, i) {
if (path1 && path2 && path1[i][0] == "M" && path2[i][0] != "M") {
Ext.Array.splice(path2, i, 0, [
"M",
a2.x,
a2.y
]);
a1.bx = 0;
a1.by = 0;
a1.x = path1[i][1];
a1.y = path1[i][2];
ii = Math.max(p.length, p2.length || 0);
}
},
i, ii, seg, seg2, seglen, seg2len;
for (i = 0 , ii = Math.max(p.length, p2.length || 0); i < ii; i++) {
p[i] = me.command2curve(p[i], attrs);
fixArc(p, i);
(p2[i] = me.command2curve(p2[i], attrs2));
fixArc(p2, i);
fixM(p, p2, attrs, attrs2, i);
fixM(p2, p, attrs2, attrs, i);
seg = p[i];
seg2 = p2[i];
seglen = seg.length;
seg2len = seg2.length;
attrs.x = seg[seglen - 2];
attrs.y = seg[seglen - 1];
attrs.bx = parseFloat(seg[seglen - 4]) || attrs.x;
attrs.by = parseFloat(seg[seglen - 3]) || attrs.y;
attrs2.bx = (parseFloat(seg2[seg2len - 4]) || attrs2.x);
attrs2.by = (parseFloat(seg2[seg2len - 3]) || attrs2.y);
attrs2.x = seg2[seg2len - 2];
attrs2.y = seg2[seg2len - 1];
}
return [
p,
p2
];
},
command2curve: function(pathCommand, d) {
var me = this;
if (!pathCommand) {
return [
"C",
d.x,
d.y,
d.x,
d.y,
d.x,
d.y
];
}
if (pathCommand[0] != "T" && pathCommand[0] != "Q") {
d.qx = d.qy = null;
}
switch (pathCommand[0]) {
case "M":
d.X = pathCommand[1];
d.Y = pathCommand[2];
break;
case "A":
pathCommand = [
"C"
].concat(me.arc2curve.apply(me, [
d.x,
d.y
].concat(pathCommand.slice(1))));
break;
case "S":
pathCommand = [
"C",
d.x + (d.x - (d.bx || d.x)),
d.y + (d.y - (d.by || d.y))
].concat(pathCommand.slice(1));
break;
case "T":
d.qx = d.x + (d.x - (d.qx || d.x));
d.qy = d.y + (d.y - (d.qy || d.y));
pathCommand = [
"C"
].concat(me.quadratic2curve(d.x, d.y, d.qx, d.qy, pathCommand[1], pathCommand[2]));
break;
case "Q":
d.qx = pathCommand[1];
d.qy = pathCommand[2];
pathCommand = [
"C"
].concat(me.quadratic2curve(d.x, d.y, pathCommand[1], pathCommand[2], pathCommand[3], pathCommand[4]));
break;
case "L":
pathCommand = [
"C"
].concat(d.x, d.y, pathCommand[1], pathCommand[2], pathCommand[1], pathCommand[2]);
break;
case "H":
pathCommand = [
"C"
].concat(d.x, d.y, pathCommand[1], d.y, pathCommand[1], d.y);
break;
case "V":
pathCommand = [
"C"
].concat(d.x, d.y, d.x, pathCommand[1], d.x, pathCommand[1]);
break;
case "Z":
pathCommand = [
"C"
].concat(d.x, d.y, d.X, d.Y, d.X, d.Y);
break;
}
return pathCommand;
},
quadratic2curve: function(x1, y1, ax, ay, x2, y2) {
var _13 = 1 / 3,
_23 = 2 / 3;
return [
_13 * x1 + _23 * ax,
_13 * y1 + _23 * ay,
_13 * x2 + _23 * ax,
_13 * y2 + _23 * ay,
x2,
y2
];
},
rotate: function(x, y, rad) {
var cos = Math.cos(rad),
sin = Math.sin(rad),
X = x * cos - y * sin,
Y = x * sin + y * cos;
return {
x: X,
y: Y
};
},
arc2curve: function(x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2, recursive) {
var me = this,
PI = Math.PI,
radian = me.radian,
_120 = PI * 120 / 180,
rad = radian * (+angle || 0),
res = [],
math = Math,
mcos = math.cos,
msin = math.sin,
msqrt = math.sqrt,
mabs = math.abs,
masin = math.asin,
xy, x, y, h, rx2, ry2, k, cx, cy, f1, f2, df, c1, s1, c2, s2, t, hx, hy, m1, m2, m3, m4, newres, i, ln, f2old, x2old, y2old;
if (!recursive) {
xy = me.rotate(x1, y1, -rad);
x1 = xy.x;
y1 = xy.y;
xy = me.rotate(x2, y2, -rad);
x2 = xy.x;
y2 = xy.y;
x = (x1 - x2) / 2;
y = (y1 - y2) / 2;
h = (x * x) / (rx * rx) + (y * y) / (ry * ry);
if (h > 1) {
h = msqrt(h);
rx = h * rx;
ry = h * ry;
}
rx2 = rx * rx;
ry2 = ry * ry;
k = (large_arc_flag == sweep_flag ? -1 : 1) * msqrt(mabs((rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x)));
cx = k * rx * y / ry + (x1 + x2) / 2;
cy = k * -ry * x / rx + (y1 + y2) / 2;
f1 = masin(((y1 - cy) / ry).toFixed(7));
f2 = masin(((y2 - cy) / ry).toFixed(7));
f1 = x1 < cx ? PI - f1 : f1;
f2 = x2 < cx ? PI - f2 : f2;
if (f1 < 0) {
f1 = PI * 2 + f1;
}
if (f2 < 0) {
f2 = PI * 2 + f2;
}
if (sweep_flag && f1 > f2) {
f1 = f1 - PI * 2;
}
if (!sweep_flag && f2 > f1) {
f2 = f2 - PI * 2;
}
} else {
f1 = recursive[0];
f2 = recursive[1];
cx = recursive[2];
cy = recursive[3];
}
df = f2 - f1;
if (mabs(df) > _120) {
f2old = f2;
x2old = x2;
y2old = y2;
f2 = f1 + _120 * (sweep_flag && f2 > f1 ? 1 : -1);
x2 = cx + rx * mcos(f2);
y2 = cy + ry * msin(f2);
res = me.arc2curve(x2, y2, rx, ry, angle, 0, sweep_flag, x2old, y2old, [
f2,
f2old,
cx,
cy
]);
}
df = f2 - f1;
c1 = mcos(f1);
s1 = msin(f1);
c2 = mcos(f2);
s2 = msin(f2);
t = math.tan(df / 4);
hx = 4 / 3 * rx * t;
hy = 4 / 3 * ry * t;
m1 = [
x1,
y1
];
m2 = [
x1 + hx * s1,
y1 - hy * c1
];
m3 = [
x2 + hx * s2,
y2 - hy * c2
];
m4 = [
x2,
y2
];
m2[0] = 2 * m1[0] - m2[0];
m2[1] = 2 * m1[1] - m2[1];
if (recursive) {
return [
m2,
m3,
m4
].concat(res);
} else {
res = [
m2,
m3,
m4
].concat(res).join().split(",");
newres = [];
ln = res.length;
for (i = 0; i < ln; i++) {
newres[i] = i % 2 ? me.rotate(res[i - 1], res[i], rad).y : me.rotate(res[i], res[i + 1], rad).x;
}
return newres;
}
}
});
Ext.define('Ext.fx.PropertyHandler', {
requires: [
'Ext.fx.DrawPath'
],
statics: {
defaultHandler: {
pixelDefaultsRE: /width|height|top$|bottom$|left$|right$/i,
unitRE: /^(-?\d*\.?\d*){1}(em|ex|px|in|cm|mm|pt|pc|%)*$/,
scrollRE: /^scroll/i,
computeDelta: function(from, end, damper, initial, attr) {
damper = (typeof damper == 'number') ? damper : 1;
var unitRE = this.unitRE,
match = unitRE.exec(from),
start, units;
if (match) {
from = match[1];
units = match[2];
if (!this.scrollRE.test(attr) && !units && this.pixelDefaultsRE.test(attr)) {
units = 'px';
}
}
from = +from || 0;
match = unitRE.exec(end);
if (match) {
end = match[1];
units = match[2] || units;
}
end = +end || 0;
start = (initial != null) ? initial : from;
return {
from: from,
delta: (end - start) * damper,
units: units
};
},
get: function(from, end, damper, initialFrom, attr) {
var ln = from.length,
out = [],
i, initial, res, j, len;
for (i = 0; i < ln; i++) {
if (initialFrom) {
initial = initialFrom[i][1].from;
}
if (Ext.isArray(from[i][1]) && Ext.isArray(end)) {
res = [];
j = 0;
len = from[i][1].length;
for (; j < len; j++) {
res.push(this.computeDelta(from[i][1][j], end[j], damper, initial, attr));
}
out.push([
from[i][0],
res
]);
} else {
out.push([
from[i][0],
this.computeDelta(from[i][1], end, damper, initial, attr)
]);
}
}
return out;
},
set: function(values, easing) {
var ln = values.length,
out = [],
i, val, res, len, j;
for (i = 0; i < ln; i++) {
val = values[i][1];
if (Ext.isArray(val)) {
res = [];
j = 0;
len = val.length;
for (; j < len; j++) {
res.push(val[j].from + val[j].delta * easing + (val[j].units || 0));
}
out.push([
values[i][0],
res
]);
} else {
out.push([
values[i][0],
val.from + val.delta * easing + (val.units || 0)
]);
}
}
return out;
}
},
stringHandler: {
computeDelta: function(from, end, damper, initial, attr) {
return {
from: from,
delta: end
};
},
get: function(from, end, damper, initialFrom, attr) {
var ln = from.length,
out = [],
i, initial;
for (i = 0; i < ln; i++) {
out.push([
from[i][0],
this.computeDelta(from[i][1], end, damper, initial, attr)
]);
}
return out;
},
set: function(values, easing) {
var ln = values.length,
out = [],
i, val;
for (i = 0; i < ln; i++) {
val = values[i][1];
out.push([
values[i][0],
val.delta
]);
}
return out;
}
},
color: {
rgbRE: /^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i,
hexRE: /^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i,
hex3RE: /^#?([0-9A-F]{1})([0-9A-F]{1})([0-9A-F]{1})$/i,
parseColor: function(color, damper) {
damper = (typeof damper == 'number') ? damper : 1;
var out = false,
reList = [
this.hexRE,
this.rgbRE,
this.hex3RE
],
length = reList.length,
match, base, re, i;
for (i = 0; i < length; i++) {
re = reList[i];
base = (i % 2 === 0) ? 16 : 10;
match = re.exec(color);
if (match && match.length === 4) {
if (i === 2) {
match[1] += match[1];
match[2] += match[2];
match[3] += match[3];
}
out = {
red: parseInt(match[1], base),
green: parseInt(match[2], base),
blue: parseInt(match[3], base)
};
break;
}
}
return out || color;
},
computeDelta: function(from, end, damper, initial) {
from = this.parseColor(from);
end = this.parseColor(end, damper);
var start = initial ? initial : from,
tfrom = typeof start,
tend = typeof end;
if (tfrom === 'string' || tfrom === 'undefined' || tend === 'string' || tend === 'undefined') {
return end || start;
}
return {
from: from,
delta: {
red: Math.round((end.red - start.red) * damper),
green: Math.round((end.green - start.green) * damper),
blue: Math.round((end.blue - start.blue) * damper)
}
};
},
get: function(start, end, damper, initialFrom) {
var ln = start.length,
out = [],
i, initial;
for (i = 0; i < ln; i++) {
if (initialFrom) {
initial = initialFrom[i][1].from;
}
out.push([
start[i][0],
this.computeDelta(start[i][1], end, damper, initial)
]);
}
return out;
},
set: function(values, easing) {
var ln = values.length,
out = [],
i, val, parsedString, from, delta;
for (i = 0; i < ln; i++) {
val = values[i][1];
if (val) {
from = val.from;
delta = val.delta;
val = (typeof val === 'object' && 'red' in val) ? 'rgb(' + val.red + ', ' + val.green + ', ' + val.blue + ')' : val;
val = (typeof val === 'object' && val.length) ? val[0] : val;
if (typeof val === 'undefined') {
return [];
}
parsedString = typeof val === 'string' ? val : 'rgb(' + [
(from.red + Math.round(delta.red * easing)) % 256,
(from.green + Math.round(delta.green * easing)) % 256,
(from.blue + Math.round(delta.blue * easing)) % 256
].join(',') + ')';
out.push([
values[i][0],
parsedString
]);
}
}
return out;
}
},
object: {
interpolate: function(prop, damper) {
damper = (typeof damper === 'number') ? damper : 1;
var out = {},
p;
for (p in prop) {
out[p] = parseFloat(prop[p]) * damper;
}
return out;
},
computeDelta: function(from, end, damper, initial) {
from = this.interpolate(from);
end = this.interpolate(end, damper);
var start = initial ? initial : from,
delta = {},
p;
for (p in end) {
delta[p] = end[p] - start[p];
}
return {
from: from,
delta: delta
};
},
get: function(start, end, damper, initialFrom) {
var ln = start.length,
out = [],
i, initial;
for (i = 0; i < ln; i++) {
if (initialFrom) {
initial = initialFrom[i][1].from;
}
out.push([
start[i][0],
this.computeDelta(start[i][1], end, damper, initial)
]);
}
return out;
},
set: function(values, easing) {
var ln = values.length,
out = [],
outObject = {},
i, from, delta, val, p;
for (i = 0; i < ln; i++) {
val = values[i][1];
from = val.from;
delta = val.delta;
for (p in from) {
outObject[p] = from[p] + delta[p] * easing;
}
out.push([
values[i][0],
outObject
]);
}
return out;
}
},
path: {
computeDelta: function(from, end, damper, initial) {
damper = (typeof damper === 'number') ? damper : 1;
var start;
from = +from || 0;
end = +end || 0;
start = (initial != null) ? initial : from;
return {
from: from,
delta: (end - start) * damper
};
},
forcePath: function(path) {
if (!Ext.isArray(path) && !Ext.isArray(path[0])) {
path = Ext.fx.DrawPath.parsePathString(path);
}
return path;
},
get: function(start, end, damper, initialFrom) {
var endPath = this.forcePath(end),
out = [],
startLn = start.length,
startPathLn, pointsLn, i, deltaPath, initial, j, k, path, startPath;
for (i = 0; i < startLn; i++) {
startPath = this.forcePath(start[i][1]);
deltaPath = Ext.fx.DrawPath.interpolatePaths(startPath, endPath);
startPath = deltaPath[0];
endPath = deltaPath[1];
startPathLn = startPath.length;
path = [];
for (j = 0; j < startPathLn; j++) {
deltaPath = [
startPath[j][0]
];
pointsLn = startPath[j].length;
for (k = 1; k < pointsLn; k++) {
initial = initialFrom && initialFrom[0][1][j][k].from;
deltaPath.push(this.computeDelta(startPath[j][k], endPath[j][k], damper, initial));
}
path.push(deltaPath);
}
out.push([
start[i][0],
path
]);
}
return out;
},
set: function(values, easing) {
var ln = values.length,
out = [],
i, j, k, newPath, calcPath, deltaPath, deltaPathLn, pointsLn;
for (i = 0; i < ln; i++) {
deltaPath = values[i][1];
newPath = [];
deltaPathLn = deltaPath.length;
for (j = 0; j < deltaPathLn; j++) {
calcPath = [
deltaPath[j][0]
];
pointsLn = deltaPath[j].length;
for (k = 1; k < pointsLn; k++) {
calcPath.push(deltaPath[j][k].from + deltaPath[j][k].delta * easing);
}
newPath.push(calcPath.join(','));
}
out.push([
values[i][0],
newPath.join(',')
]);
}
return out;
}
}
}
},
function() {
var props = [
'outlineColor',
'backgroundColor',
'borderColor',
'borderTopColor',
'borderRightColor',
'borderBottomColor',
'borderLeftColor',
'fill',
'stroke'
],
length = props.length,
i = 0,
prop;
for (; i < length; i++) {
prop = props[i];
this[prop] = this.color;
}
props = [
'cursor'
];
length = props.length;
i = 0;
for (; i < length; i++) {
prop = props[i];
this[prop] = this.stringHandler;
}
});
Ext.define('Ext.fx.Anim', {
mixins: {
observable: 'Ext.util.Observable'
},
requires: [
'Ext.fx.Manager',
'Ext.fx.Animator',
'Ext.fx.Easing',
'Ext.fx.CubicBezier',
'Ext.fx.PropertyHandler'
],
isAnimation: true,
duration: 250,
delay: 0,
delayStart: 0,
dynamic: false,
easing: 'ease',
damper: 1,
bezierRE: /^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,
reverse: false,
running: false,
paused: false,
iterations: 1,
autoEnd: false,
alternate: false,
currentIteration: 0,
startTime: 0,
frameCount: 0,
constructor: function(config) {
var me = this,
curve;
config = config || {};
if (config.keyframes) {
return new Ext.fx.Animator(config);
}
Ext.apply(me, config);
if (me.from === undefined) {
me.from = {};
}
me.propHandlers = {};
me.config = config;
me.target = Ext.fx.Manager.createTarget(me.target);
me.easingFn = Ext.fx.Easing[me.easing];
me.target.dynamic = me.dynamic;
if (!me.easingFn) {
me.easingFn = String(me.easing).match(me.bezierRE);
if (me.easingFn && me.easingFn.length === 5) {
curve = me.easingFn;
me.easingFn = Ext.fx.CubicBezier.cubicBezier(+curve[1], +curve[2], +curve[3], +curve[4]);
}
}
me.id = Ext.id(null, 'ext-anim-');
me.mixins.observable.constructor.call(me);
Ext.fx.Manager.addAnim(me);
if (config.autoEnd) {
me.running = true;
me.jumpToEnd();
}
},
setAttr: function(attr, value) {
return Ext.fx.Manager.items.get(this.id).setAttr(this.target, attr, value);
},
initAttrs: function() {
var me = this,
from = me.from,
to = me.to,
initialFrom = me.initialFrom || {},
out = {},
start, end, propHandler, attr;
for (attr in to) {
if (to.hasOwnProperty(attr)) {
start = me.target.getAttr(attr, from[attr]);
end = to[attr];
if (!Ext.fx.PropertyHandler[attr]) {
if (Ext.isObject(end)) {
propHandler = me.propHandlers[attr] = Ext.fx.PropertyHandler.object;
} else {
propHandler = me.propHandlers[attr] = Ext.fx.PropertyHandler.defaultHandler;
}
} else
{
propHandler = me.propHandlers[attr] = Ext.fx.PropertyHandler[attr];
}
out[attr] = propHandler.get(start, end, me.damper, initialFrom[attr], attr);
}
}
me.currentAttrs = out;
},
start: function(startTime) {
var me = this,
delay = me.delay,
delayStart = me.delayStart,
delayDelta;
if (delay) {
if (!delayStart) {
me.delayStart = startTime;
return;
} else {
delayDelta = startTime - delayStart;
if (delayDelta < delay) {
return;
} else {
startTime = new Date(delayStart.getTime() + delay);
}
}
}
if (me.fireEvent('beforeanimate', me) !== false) {
me.startTime = startTime;
if (!me.paused && !me.currentAttrs) {
me.initAttrs();
}
me.running = true;
me.frameCount = 0;
}
},
jumpToEnd: function() {
var me = this;
if (!me.endWasCalled) {
if (!me.currentAttrs) {
me.initAttrs();
}
Ext.fx.Manager.jumpToEnd(me);
me.end();
}
},
runAnim: function(elapsedTime) {
var me = this,
attrs = me.currentAttrs,
duration = me.duration,
easingFn = me.easingFn,
propHandlers = me.propHandlers,
ret = {},
easing, values, attr, lastFrame;
if (elapsedTime >= duration) {
elapsedTime = duration;
lastFrame = true;
}
if (me.reverse) {
elapsedTime = duration - elapsedTime;
}
for (attr in attrs) {
if (attrs.hasOwnProperty(attr)) {
values = attrs[attr];
easing = lastFrame ? 1 : easingFn(elapsedTime / duration);
ret[attr] = propHandlers[attr].set(values, easing);
}
}
me.frameCount++;
return ret;
},
lastFrame: function() {
var me = this,
iter = me.iterations,
iterCount = me.currentIteration;
iterCount++;
if (iterCount < iter) {
if (me.alternate) {
me.reverse = !me.reverse;
}
me.startTime = new Date();
me.currentIteration = iterCount;
me.paused = false;
} else {
me.currentIteration = 0;
me.end();
me.fireEvent('lastframe', me, me.startTime);
}
},
endWasCalled: 0,
end: function() {
var me = this;
if (me.endWasCalled++) {
return;
}
me.startTime = 0;
me.paused = false;
me.running = false;
Ext.fx.Manager.removeAnim(me);
me.fireEvent('afteranimate', me, me.startTime);
Ext.callback(me.callback, me.scope, [
me,
me.startTime
]);
if (me.remove) {
me.target.destroy();
}
},
isReady: function() {
return this.paused === false && this.running === false && this.iterations > 0;
},
isRunning: function() {
return this.paused === false && this.running === true && this.isAnimator !== true;
}
});
Ext.enableFx = true;
Ext.define('Ext.util.Animate', {
mixinId: 'animate',
requires: [
'Ext.fx.Manager',
'Ext.fx.Anim'
],
isAnimate: true,
animate: function(animObj) {
var me = this;
if (Ext.fx.Manager.hasFxBlock(me.id)) {
return me;
}
Ext.fx.Manager.queueFx(new Ext.fx.Anim(me.anim(animObj)));
return this;
},
anim: function(config) {
if (!Ext.isObject(config)) {
return (config) ? {} : false;
}
var me = this;
if (config.stopAnimation) {
me.stopAnimation();
}
Ext.applyIf(config, Ext.fx.Manager.getFxDefaults(me.id));
return Ext.apply({
target: me,
paused: true
}, config);
},
getAnimationProps: function() {
var me = this,
layout = me.layout;
return layout && layout.animate ? layout.animate : {};
},
stopFx: Ext.Function.alias(Ext.util.Animate, 'stopAnimation'),
stopAnimation: function() {
Ext.fx.Manager.stopAnimation(this.id);
return this;
},
syncFx: function() {
Ext.fx.Manager.setFxDefaults(this.id, {
concurrent: true
});
return this;
},
sequenceFx: function() {
Ext.fx.Manager.setFxDefaults(this.id, {
concurrent: false
});
return this;
},
hasActiveFx: Ext.Function.alias(Ext.util.Animate, 'getActiveAnimation'),
getActiveAnimation: function() {
return Ext.fx.Manager.getActiveAnimation(this.id);
}
});
Ext.define('Ext.dom.Fly', {
extend: 'Ext.dom.Element',
alternateClassName: 'Ext.dom.Element.Fly',
validNodeTypes: {
1: 1,
9: 1,
11: 1
},
isFly: true,
constructor: function(dom) {
this.dom = dom;
this.el = this;
},
attach: function(dom) {
var me = this;
if (!dom) {
return me.detach();
}
me.dom = dom;
if (!Ext.cache[dom.id]) {
me.getData().isSynchronized = false;
}
return me;
},
detach: function() {
this.dom = null;
},
addListener: function() {
Ext.Error.raise("Cannot use addListener() on Ext.dom.Fly instances. " + "Please use Ext.get() to retrieve an Ext.dom.Element instance instead.");
} || null,
removeListener: function() {
Ext.Error.raise("Cannot use removeListener() on Ext.dom.Fly instances. " + "Please use Ext.get() to retrieve an Ext.dom.Element instance instead.");
} || null
}, function(Fly) {
var flyweights = {};
Fly.cache = flyweights;
Ext.fly = function(dom, named) {
var fly = null,
fn = Ext.fly,
nodeType, data;
named = named || (fn.caller && fn.caller.$name) || '_global';
dom = Ext.getDom(dom);
if (dom) {
nodeType = dom.nodeType;
if (Fly.prototype.validNodeTypes[nodeType] || (!nodeType && (dom.window == dom))) {
fly = Ext.cache[dom.id];
if (!fly || fly.dom !== dom) {
fly = flyweights[named] || (flyweights[named] = new Fly());
fly.dom = dom;
data = fly.getData(true);
if (data) {
data.isSynchronized = false;
}
}
}
}
return fly;
};
});
Ext.define('Ext.dom.CompositeElementLite', {
alternateClassName: [
'Ext.CompositeElementLite'
],
requires: [
'Ext.dom.Fly'
],
isComposite: true,
isLite: true,
statics: {
importElementMethods: function() {
var Element = Ext.dom.Element,
prototype = this.prototype;
Ext.Object.each(Element.prototype, function(name, member) {
if (typeof member === 'function' && !prototype[name]) {
prototype[name] = function() {
return this.invoke(name, arguments);
};
}
});
}
},
constructor: function(elements,
skipValidation) {
if (skipValidation) {
this.elements = elements || [];
} else {
this.elements = [];
this.add(elements);
}
},
getElement: function(el) {
var fly = this._fly || (this._fly = new Ext.dom.Fly());
return fly.attach(el);
},
transformElement: function(el) {
return Ext.getDom(el);
},
getCount: function() {
return this.elements.length;
},
add: function(els, root) {
var elements = this.elements,
i, ln;
if (!els) {
return this;
}
if (typeof els == "string") {
els = Ext.fly(root || document).query(els);
} else if (els.isComposite) {
els = els.elements;
} else if (!Ext.isIterable(els)) {
els = [
els
];
}
for (i = 0 , ln = els.length; i < ln; ++i) {
elements.push(this.transformElement(els[i]));
}
return this;
},
invoke: function(fn, args) {
var me = this,
elements = me.elements,
ln = elements.length,
prototype, element, i;
if (i !== 0) {
prototype = (me.isLite ? Ext.dom.Fly : Ext.dom.Element).prototype;
for (i = 0; i < ln; i++) {
element = elements[i];
if (element) {
prototype[fn].apply(me.getElement(element), args);
}
}
}
return me;
},
item: function(index) {
var el = this.elements[index],
out = null;
if (el) {
out = this.getElement(el);
}
return out;
},
slice: function(start, end) {
return Ext.Array.slice(this.elements, start, end);
},
each: function(fn, scope) {
var me = this,
els = me.elements,
len = els.length,
i, e;
for (i = 0; i < len; i++) {
e = els[i];
if (e) {
e = this.getElement(e);
if (fn.call(scope || e, e, me, i) === false) {
break;
}
}
}
return me;
},
fill: function(els) {
var me = this;
me.elements = [];
me.add(els);
return me;
},
insert: function(index, nodes) {
Ext.Array.insert(this.elements, index, nodes);
},
filter: function(selector) {
var me = this,
els = me.elements,
len = els.length,
out = [],
i = 0,
isFunc = typeof selector == 'function',
add, el;
for (; i < len; i++) {
el = els[i];
add = false;
if (el) {
el = me.getElement(el);
if (isFunc) {
add = selector.call(el, el, me, i) !== false;
} else {
add = el.is(selector);
}
if (add) {
out.push(me.transformElement(el));
}
}
}
me.elements = out;
return me;
},
indexOf: function(el) {
return Ext.Array.indexOf(this.elements, this.transformElement(el));
},
replaceElement: function(el, replacement, domReplace) {
var index = !isNaN(el) ? el : this.indexOf(el),
d;
if (index > -1) {
replacement = Ext.getDom(replacement);
if (domReplace) {
d = this.elements[index];
d.parentNode.insertBefore(replacement, d);
Ext.removeNode(d);
}
Ext.Array.splice(this.elements, index, 1, replacement);
}
return this;
},
clear: function(removeDom) {
var me = this,
els = me.elements,
i = els.length - 1;
if (removeDom) {
for (; i >= 0; i--) {
Ext.removeNode(els[i]);
}
}
this.elements = [];
},
addElements: function(els, root) {
if (!els) {
return this;
}
if (typeof els === "string") {
els = Ext.dom.Element.selectorFunction(els, root);
}
var yels = this.elements,
eLen = els.length,
e;
for (e = 0; e < eLen; e++) {
yels.push(Ext.get(els[e]));
}
return this;
},
first: function() {
return this.item(0);
},
last: function() {
return this.item(this.getCount() - 1);
},
contains: function(el) {
return this.indexOf(el) != -1;
},
removeElement: function(keys, removeDom) {
keys = [].concat(keys);
var me = this,
elements = me.elements,
kLen = keys.length,
val, el, k;
for (k = 0; k < kLen; k++) {
val = keys[k];
if ((el = (elements[val] || elements[val = me.indexOf(val)]))) {
if (removeDom) {
if (el.dom) {
el.destroy();
} else {
Ext.removeNode(el);
}
}
Ext.Array.erase(elements, val, 1);
}
}
return me;
},
destroy: function() {
return this.invoke('destroy', arguments);
}
}, function(CompositeElementLite) {
var prototype = CompositeElementLite.prototype;
CompositeElementLite.importElementMethods();
prototype.on = prototype.addListener;
});
Ext.define('Ext.overrides.dom.Element', (function() {
var Element,
WIN = window,
DOC = document,
HIDDEN = 'hidden',
ISCLIPPED = 'isClipped',
OVERFLOW = 'overflow',
OVERFLOWX = 'overflow-x',
OVERFLOWY = 'overflow-y',
ORIGINALCLIP = 'originalClip',
HEIGHT = 'height',
WIDTH = 'width',
VISIBILITY = 'visibility',
DISPLAY = 'display',
NONE = 'none',
OFFSETS = 'offsets',
ORIGINALDISPLAY = 'originalDisplay',
VISMODE = 'visibilityMode',
ISVISIBLE = 'isVisible',
OFFSETCLASS = Ext.baseCSSPrefix + 'hidden-offsets',
boxMarkup = [
'',
'',
''
].join(''),
scriptTagRe = /(?: